我写了一个小程序,在一个简单的四边形中显示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 解决了问题。