使用着色器渲染时 OpenGL 纹理全黑
OpenGL texture is all black when rendered with shader
我有一个非常简单的 OpenGL 应用程序,它只渲染一个带纹理的四边形。这是我的代码,效果很好(带纹理的四边形看起来很好):
// Bind the test texture
glBindTexture(GL_TEXTURE_2D, mTestTexture);
// Draw the quad
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(x, y + (float)height, 0.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(x + (float)width, y + (float)height, 0.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(x + (float)width, y, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(x, y, 0.0f);
glEnd();
然后我想引入一个简单的着色器。所以我稍微修改了我的代码:
// Use shader and point it to the right texture
auto texLocation = glGetUniformLocation(mProgram, "tex");
glUseProgram(mProgram);
glUniform1i(texLocation, mTestTexture);
// Draw the quad
// Same drawing code as before...
顶点着色器:
void main(void)
{
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;
}
片段着色器:
uniform sampler2D tex;
void main()
{
vec4 color = texture2D(tex, gl_TexCoord[0].st);
gl_FragColor = color;
}
现在我得到的只是一个黑色四边形 :-(
我已经尝试并测试了很多东西:
- 着色器编译正常(没有错误)
- 四边形可见(顶点着色器似乎正常)
- 如果我更改着色器以生成固定颜色 ("gl_FragColor = vec4(1,0,0,1);"),我的四边形会变成红色 -> 片段着色器正在执行某些操作!
- glGetError() 不会 return 任何错误
- 我的 texLocation、mProgram 和 mTestTexture 似乎都是有效的 ID
有谁知道为什么我在使用着色器时看不到我的纹理?
glUniform1i(texLocation, mTestTexture);
^^^^^^^^^^^^ texture object
纹理单元索引绑定到采样器,而不是纹理对象。
改用纹理单元零:
glUniform1i(texLocation, 0);
我有一个非常简单的 OpenGL 应用程序,它只渲染一个带纹理的四边形。这是我的代码,效果很好(带纹理的四边形看起来很好):
// Bind the test texture
glBindTexture(GL_TEXTURE_2D, mTestTexture);
// Draw the quad
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(x, y + (float)height, 0.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(x + (float)width, y + (float)height, 0.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(x + (float)width, y, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(x, y, 0.0f);
glEnd();
然后我想引入一个简单的着色器。所以我稍微修改了我的代码:
// Use shader and point it to the right texture
auto texLocation = glGetUniformLocation(mProgram, "tex");
glUseProgram(mProgram);
glUniform1i(texLocation, mTestTexture);
// Draw the quad
// Same drawing code as before...
顶点着色器:
void main(void)
{
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;
}
片段着色器:
uniform sampler2D tex;
void main()
{
vec4 color = texture2D(tex, gl_TexCoord[0].st);
gl_FragColor = color;
}
现在我得到的只是一个黑色四边形 :-(
我已经尝试并测试了很多东西:
- 着色器编译正常(没有错误)
- 四边形可见(顶点着色器似乎正常)
- 如果我更改着色器以生成固定颜色 ("gl_FragColor = vec4(1,0,0,1);"),我的四边形会变成红色 -> 片段着色器正在执行某些操作!
- glGetError() 不会 return 任何错误
- 我的 texLocation、mProgram 和 mTestTexture 似乎都是有效的 ID
有谁知道为什么我在使用着色器时看不到我的纹理?
glUniform1i(texLocation, mTestTexture);
^^^^^^^^^^^^ texture object
纹理单元索引绑定到采样器,而不是纹理对象。
改用纹理单元零:
glUniform1i(texLocation, 0);