我写了一个小程序,在一个简单的四边形中显示一个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);
编辑:清除顶点着色器代码。
答案 0 :(得分:0)
我发现了这个问题:我没有在纹理上设置任何MAG或MIN过滤器。将MIN过滤器设置为GL_NEAREST解决了这个问题。