0

我正在尝试将彩色文本呈现到屏幕上。我有一个纹理,其中包含要显示的文本的黑色 (RGBA 0, 0, 0, 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 上,但无论出于何种原因,我似乎实际上并没有在我的片段着色器中访问它。我究竟做错了什么?

4

2 回答 2

0

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

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

于 2011-12-20T09:20:19.140 回答
0

工装裤看起来不错。您的单元 1 的 texcoords 可能搞砸了,导致在纹理的彩色部分之外进行采样。

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

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

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

  gl_FragColor = vec4( texture2DRect(texRGB, gl_TexCoord[1].st).rgb, 1.0 );
于 2011-12-18T21:47:07.877 回答