c语言 - 无法发现我的 GLSL/OpenGL 代码的问题



我写了一个小程序,在一个简单的四边形中显示32位浮点纹理。显示四边形时,纹理颜色始终为黑色。我尝试了很多东西,但我无法让它工作。我真的很不知它有什么问题。

创建 OpenGL 纹理的代码是这样的

glEnable(GL_TEXTURE_2D);
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, textureData);

使用调试器,这些调用中的任何一个都没有错误。我还检查了 textureData 指针,并得到了预期的结果(在我的简化程序中,它只是一个渐变纹理(。

这是 GLSL 中的顶点着色器代码:

#version 400
in vec4 vertexPosition;
out vec2 uv;
void main() {
    gl_Position = vertexPosition;
    uv.x = (vertexPosition.x + 1.0) / 2;
    uv.y = (vertexPosition.y + 1.0) / 2;
}

这是一种简单的UV坐标生成,不将它们作为顶点属性。对应的顶点缓冲区对象非常简单:

GLfloat vertices[4][4] = {
    { -1.0, 1.0, 0.0, 1.0 },
    { -1.0, -1.0, 0.0, 1.0 },
    { 1.0, 1.0, 0.0, 1.0 },
    { 1.0, -1.0, 0.0, 1.0 },
};

我已经测试了该解决方案,它显示了覆盖整个窗口的四边形,如我所愿。在片段着色器中显示 UV 坐标可以重现我期望获得的渐变。现在这里是片段着色器:

#version 400
uniform sampler2D myTex;
in vec2 uv;
out vec4 fragColor;
void main() {
   fragColor = texture(myTex, uv);
   // fragColor += vec4(uv.x, uv.y, 0, 1);
}

注释掉的行将 UV 坐标显示为颜色,以便进行调试。我在这里做错了什么?我只是不明白为什么 texture(( 调用返回 0,纹理看起来完全正确,并且 uv 坐标也正确。如果我做错了其他事情,我会在此处链接完整的代码:gl-view.c

编辑:这是我设置myTex采样器的方式:

glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureID);
glUniform1i(glGetUniformLocation(shaderProgram, "myTex"), 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

编辑:清除了顶点着色器代码。

我发现了问题:我没有在纹理上设置任何MAG或MIN滤镜。将 MIN 筛选器设置为 GL_NEAREST 解决了问题。

最新更新