色付きのテキストを画面に表示しようとしています。私は、表示するテキストの黒(RGBA 0、0、0、255)表現を含むテクスチャを持っており、テキストをレンダリングするカラーパターンを含む別のテクスチャを持っています。シンプルなマルチテクスチャのエクササイズですが、2番目のテクスチャを動作させることができません。どちらのテクスチャもRectangleテクスチャです。これは、整数座標値が扱いやすいためです。マルチテクスチャのためにテクスチャを正しくバインドするにはどうすればよいですか?
レンダリングコード:
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のテクスチャをバインドしましたが、何らかの理由で実際にフラグメントシェーダの内部にアクセスできないようです。私は間違って何をしていますか?
サンプラーユニフォームを設定するシェーダーコードはどこですか? –
@ニコル:すみません、何?シェイダーコード内にユニフォームを設定していません... –
十分に適切です:これらのサンプラーユニフォームを設定するC++コード。また、サンプラーをシェーダーコードで設定することもできます。 [正しい拡張機能/ GLバージョン](http://www.opengl.org/wiki/GLSL_Sampler#Verison_4.20_binding) –