使用着色器渲染时,OpenGL纹理全黑

Bor*_*ris 3 c++ opengl shader textures glsl

我有一个非常简单的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();
Run Code Online (Sandbox Code Playgroud)

然后我想引入一个简单的着色器.所以我修改了我的代码:

// 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...
Run Code Online (Sandbox Code Playgroud)

顶点着色器:

void main(void)
{
 gl_Position     = ftransform();
 gl_TexCoord[0]  = gl_MultiTexCoord0;
}
Run Code Online (Sandbox Code Playgroud)

片段着色器:

uniform sampler2D tex;

void main()
{
    vec4 color = texture2D(tex, gl_TexCoord[0].st);
    gl_FragColor = color;
}
Run Code Online (Sandbox Code Playgroud)

现在我得到的是一个黑色四边形 :-(

我已经尝试过很多东西:

  • 着色器编译正常(没有错误)
  • 四边形是可见的(顶点着色器似乎没问题)
  • 如果我更改着色器以产生固定颜色("gl_FragColor = vec4(1,0,0,1);"),我的四边形变为红色 - >片段着色器正在做某事!
  • glGetError()不会返回任何错误
  • 我的texLocation,mProgram和mTestTexture似乎都是有效的ID

有没有人知道为什么我在使用着色器时不会看到我的纹理?

gen*_*ult 6

glUniform1i(texLocation, mTestTexture);
                         ^^^^^^^^^^^^ texture object
Run Code Online (Sandbox Code Playgroud)

纹理单元索引绑定到采样器,而不是纹理对象.

使用纹理单位零代替:

glUniform1i(texLocation, 0);
Run Code Online (Sandbox Code Playgroud)