如何让我的纹理正确绑定以进行多重纹理?

时间:2011-12-18 21:19:45

标签: opengl glsl multitexturing

我正在尝试将彩色文字渲染到屏幕上。我有一个纹理,包含要显示的文本的黑色(RGBA 0,0,05,255)表示,我有另一个纹理包含我想要渲染文本的颜色模式。这应该是公平的简单的多纹理运动,但我似乎无法让第二个纹理起作用。两种纹理都是矩形纹理,因为整数坐标值更容易使用。

渲染代码:

glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, TextHandle);

glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, ColorsHandle);

glBegin(GL_QUADS);
  glMultiTexCoord2iARB(GL_TEXTURE0_ARB, 0, 0);
  glMultiTexCoord2iARB(GL_TEXTURE1_ARB, colorRect.Left, colorRect.Top);
  glVertex2f(x, y);

  glMultiTexCoord2iARB(GL_TEXTURE0_ARB, 0, textRect.Height);
  glMultiTexCoord2iARB(GL_TEXTURE1_ARB, colorRect.Left, colorRect.Top + colorRect.Height);
  glVertex2f(x, y + textRect.Height);

  glMultiTexCoord2iARB(GL_TEXTURE0_ARB, textRect.Width, textRect.Height);
  glMultiTexCoord2iARB(GL_TEXTURE1_ARB, colorRect.Left + colorRect.Width, colorRect.Top + colorRect.Height);
  glVertex2f(x + textRect.Width, y + textRect.Height);

  glMultiTexCoord2iARB(GL_TEXTURE0_ARB, textRect.Width, 0);
  glMultiTexCoord2iARB(GL_TEXTURE1_ARB, colorRect.Left + colorRect.Width, colorRect.Top);
  glVertex2f(x + textRect.Width, y);
glEnd;

顶点着色器:

void main()
{
   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
   gl_TexCoord[0] = gl_MultiTexCoord0;
   gl_TexCoord[1] = gl_MultiTexCoord1;
}

片段着色器:

uniform sampler2DRect texAlpha;
uniform sampler2DRect texRGB;
void main()
{   
   float alpha = texture2DRect(texAlpha, gl_TexCoord[0].st).a;
   vec3 rgb = texture2DRect(texRGB, gl_TexCoord[1].st).rgb;
   gl_FragColor = vec4(rgb, alpha);
}

这看起来非常简单,但它最终会呈现纯黑色文本而不是彩色文本。如果片段着色器的最后一行显示gl_FragColor = texture2DRect(texAlpha, gl_TexCoord[0].st);,我会得到完全相同的结果。将最后一行更改为gl_FragColor = texture2DRect(texRGB, gl_TexCoord[1].st);会导致它根本不呈现任何内容。

基于此,似乎在texRGB上调用texture2DRect总是返回(0,0,0,0)。我确保GL_MULTISAMPLE已启用,并在单元1上绑定纹理,但无论出于何种原因,我似乎无法在片段着色器中实际访问它。我做错了什么?

2 个答案:

答案 0 :(得分:0)

工作服看起来很好。单位1的texcoords可能会混乱,导致在纹理的彩色部分之外进行采样。

你的颜色纹理是否完全充满了颜色?

你是什么意思“导致它什么都不渲染”。 ?除非颜色纹理中的Alpha通道设置为0,否则不应发生这种情况。

您是否尝试使用以下代码来覆盖Alpha通道?

  gl_FragColor = vec4( texture2DRect(texRGB, gl_TexCoord[1].st).rgb, 1.0 );

答案 1 :(得分:0)

您确定字体轮廓纹理包含有效的Alpha值吗?你说纹理是黑色和白色,但你使用的是alpha值!不要使用 a 组件,请尝试使用 r 组件。

混合会影响片段着色器输出:它会将片段颜色与相应的片段颜色混合。