我的GLSL / OpenGL代码无法发现问题

时间:2014-12-18 14:09:47

标签: c opengl glsl texture-mapping

我写了一个小程序,在一个简单的四边形中显示一个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);

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

1 个答案:

答案 0 :(得分:0)

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