2011-12-18 9 views
0

色付きのテキストを画面に表示しようとしています。私は、表示するテキストの黒(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のテクスチャをバインドしましたが、何らかの理由で実際にフラグメントシェーダの内部にアクセスできないようです。私は間違って何をしていますか?

+0

サンプラーユニフォームを設定するシェーダーコードはどこですか? –

+0

@ニコル:すみません、何?シェイダーコード内にユニフォームを設定していません... –

+0

十分に適切です:これらのサンプラーユニフォームを設定するC++コード。また、サンプラーをシェーダーコードで設定することもできます。 [正しい拡張機能/ GLバージョン](http://www.opengl.org/wiki/GLSL_Sampler#Verison_4.20_binding) –

答えて

0

全体がきれいに見えます。ユニット1のテクスチャーが崩れて、テクスチャーの着色部分の外側でサンプリングされる可能性があります。

色のテクスチャは色でいっぱいですか?

「何も表示しない」とはどういう意味ですか? ?これは、カラーテクスチャのアルファチャンネルが0に設定されている場合を除いては起こりません。

アルファチャンネルをオーバーライドしてみましたか?

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

ちょうどそれを試みた。それは私に黒い箱を与えます。私が言ったように、texture2DRectコールは(0、0、0、0)を返すようです。 –

+0

画像へのリンクを投稿できますか?あなたのテクスチャのinitコードのコピー?私はあなたのテクスチャやテクスチャの初期化から問題が発生すると思います。 – rotoglup

+0

いいえ、どちらも問題なく動作しています。 2つのテクスチャを切り替えた場合、出力としてカラークワッドが得られます。私はgDEBuggerでできること全てを検証しました。すべてが期待どおりに機能しています。そして残念ながら、gDEBuggerはシェーダ自体の中に私を連れていくことができないので、それが失われてしまうのです。 –

0

フォントアウトラインテクスチャに有効なアルファ値が含まれていますか?テクスチャは白黒ですが、あなたはアルファ値を使っています! の代わりにのコンポーネントを使用する代わりに、rを使用してみてください。

ブレンドは、フラグメントシェーダーの出力に影響を与えます。これは、フラグメントカラーを対応するものとブレンドします。

+0

はい、フォントアウトラインには有効なアルファ値が含まれているはずです。私はgDEBuggerでそれを確認しました。空白画素は(0,0,0,0)であり、黒画素は(0,0,0,255)である。 (ええ、その間には何もありません。ベースケースが正しく機能するようになると、私はアンチエイリアシングについて心配します)。 –

関連する問題