OpenGL显示空白屏幕.可能是因为着色器

OpenGL showing blank screen. Maybe due to shaders?

本文关键字:是因为 显示 空白 屏幕 OpenGL      更新时间:2023-10-16

我的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_STATUS,看看glGetProgramiv()GL_LINK_STATUS。如果他们报告错误,请查看glGetShaderInfoLog()glGetProgramInfoLog()

至于您提供的部分代码,我认为它没有任何问题。提供着色器和更小、完整的程序可能有助于找到问题。