【问题标题】:How do I get my textures to bind properly for multitexturing?如何让我的纹理正确绑定以进行多重纹理处理?
【发布时间】: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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 刚刚试过。它给了我黑匣子。就像我说的,texture2DRect 调用似乎正在返回 (0, 0, 0, 0)。
  • 你能发布一个链接到你的图片吗?和你的纹理初始化代码的副本?我认为问题来自你的 texcoords,或者你的纹理初始化。
  • 不,它们都工作正常。如果我切换两个纹理,我会得到颜色四边形作为输出。我已经用 gDEBugger 验证了我所能做的一切,一切都按预期工作,直到我开始绘图。不幸的是,gDEBugger 不能带我进入着色器本身,所以这就是我迷路的地方。
  • 抱歉,我的想法已经用完了,您的着色器代码看起来不错。我想您检查了统一采样器值分配给...您可以尝试摆弄 GLIntercept 着色器编辑器,以实时更改您的着色器代码,这可能会给您带来领先...祝您好运!
【解决方案2】:

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

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

【讨论】:

  • 是的,我确定字体轮廓包含有效的 alpha 值。我已经在 gDEBUgger 中验证了这一点。空白像素为 (0, 0, 0, 0),黑色像素为 (0, 0, 0, 255)。 (是的,两者之间没有任何关系。一旦我的基本情况正常工作,我会担心抗锯齿。)
猜你喜欢
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多