繁体   English   中英

OpenGL显示空白屏幕。 也许是由于着色器?

[英]OpenGL showing blank screen. Maybe due to shaders?

我的OpenGL ES应用程序无法正常工作。 我正在使用SDL进行窗口管理,它包含上下文。 环顾四周后,我注意到顶点着色器和片段着色器在调试器上显示为0。 甚至程序为0。这可能是原因吗? 我按照着色器进行编译并将代码链接到先前制作的模板。

如果是,那怎么了? 这是代码:

GLuint ShaderHelper::compileShader(GLenum type, std::string fileName) {

std::string fileContents;
std::ifstream fin;
std::string path;
// Getting the necessary path...
// These are abstractions for getting file contents
// from the main bundle.
if (type == GL_VERTEX_SHADER) {
    FileOpener opener;
    path = opener.retriveFileFromBundle(fileName, "vsh");
} else if (type == GL_FRAGMENT_SHADER) {
    FileOpener opener;
    path = opener.retriveFileFromBundle(fileName, "fsh");
} else {
    std::cout << "ERROR: Invalid shader type at filename " << fileName << std::endl;
    exit(1);
}

fin.open(path);
if (!fin.is_open()) {
    std::cout << "ERROR: Failed to open file " << fileName << std::endl;
    exit(1);
}
// Retrieving the string from the file...
while (!fin.eof()) {
    char CLine[255];
    fin.getline(CLine, 255);
    std::string line = CLine;
    fileContents = fileContents + line;
    fileContents = fileContents + " \n";
}
fin.close();
// I'm creating these variables because a pointer is needed for
// glShaderSource
GLuint shaderHandle = glCreateShader(type);
const GLint shaderStringLength = (GLint)fileContents.size();
const GLchar *shaderCString = fileContents.c_str();
glShaderSource(shaderHandle, 1, &shaderCString, &shaderStringLength);

glCompileShader(shaderHandle);


return shaderHandle;

}

void ShaderHelper::linkProgram(std::vector<GLuint *> shaderArray) {

program = glCreateProgram();
for (int i = 0; i < shaderArray.size(); i++) {
    glAttachShader(program, *shaderArray[i]);

}
glLinkProgram(program);
}

void ShaderHelper::addUniform(uniform_t uniform) {

std::string name = uniform.name;
uniforms[name] = uniform;
// With that step done, we need to assign the location...
uniforms[name].location = glGetUniformLocation(program, uniforms[name].name.c_str());

}

编辑:建议后,我通过glError()运行我的代码。 我修复了一个错误,但仍然出现黑屏。 我的着色器值不再为0。 我将glClearColor设置为白色图像,而它看起来只是纯白色。 我调整了MV矩阵和投影矩阵中的数字,但仍然一无所有。 我禁用了脸部剔除功能,但还是没有。 此外,着色器正在编译和链接良好。 那么现在怎么办?

令人毛骨悚然的黑屏可能是由多种问题引起的:

  • 您的上下文未正确创建,或者您未正确显示场景。 将您的透明颜色更改为黑色以外的其他颜色是否有任何显示?

  • 您的转换矩阵是错误的。 您如何设置“相机”的位置? 您是否正在使用类似GLM的方法来建立矩阵? 如果是这样,请看看glm::perspective()glm:::lookAt() 确保将矩阵传递给着色器,并使用它在顶点着色器中设置gl_Position

  • 您尝试显示的几何图形背向查看器。 尝试glDisable(GL_CULL_FACE) 如果可行,请反转顶点的顺序。

  • OpenGL调用在某处失败。 确保在每次调用后检查glGetError() 我通常有以下内容:

     struct gl_checker { ~gl_checker() { const auto e = glGetError(); assert(e == GL_NO_ERROR); } }; template <class F> inline auto gl_call(F f) -> decltype(f()) { gl_checker gc; return f(); } 

    可以这样使用:

     gl_call([]{ glDisable(GL_CULL_FACE); }); 
  • 您的着色器无法编译或链接。 看看glGetShaderiv()GL_COMPILE_STATUSglGetProgramiv()GL_LINK_STATUS 如果他们报告错误,请查看glGetShaderInfoLog()glGetProgramInfoLog()

至于您提供的部分代码,我没有发现任何严格的错误。 提供着色器和较小的完整程序可能有助于发现问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM