我正在尝试将彩色文字渲染到屏幕上。我有一个纹理,包含要显示的文本的黑色(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上绑定纹理,但无论出于何种原因,我似乎无法在片段着色器中实际访问它。我做错了什么?
答案 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 组件。
混合会影响片段着色器输出:它会将片段颜色与相应的片段颜色混合。