当使用着色器渲染时,OpenGL纹理呈全黑状态

3

我有一个非常简单的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() 没有返回任何错误 - 我的 texLocation、mProgram 和 mTestTexture 都似乎是有效的 ID
有人知道为什么使用着色器时我看不到我的纹理吗?

1
在 [mcve] 中进行编辑。 - genpfault
1个回答

6
glUniform1i(texLocation, mTestTexture);
                         ^^^^^^^^^^^^ texture object

纹理单元的索引绑定到采样器,而非纹理对象。

使用纹理单元零代替:

glUniform1i(texLocation, 0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接