【发布时间】:2011-12-20 17:20:19
【问题描述】:
我正在尝试将彩色文本呈现到屏幕上。我有一个纹理,其中包含要显示的文本的黑色 (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 上,但无论出于何种原因,我似乎实际上无法在片段着色器中访问它。我做错了什么?
【问题讨论】:
-
设置采样器制服的着色器代码在哪里?
-
@Nicol:对不起,什么?您没有在着色器代码中设置制服...
-
很公平:设置这些采样器制服的 C++ 代码。此外,您可以在着色器代码中设置采样器。 the right extensions/GL version.
-
你的混合功能是什么?你叫 glGetError 吗?
-
@Luca:混合函数是
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),但是当我使用片段着色器进行渲染时,这是否重要?不,我的代码没有调用 glGetError,但我在 gDEBugger 下运行它,并且我将它设置为在任何 GL 错误时中断。
标签: opengl glsl multitexturing