マルチテクスチャのためにテクスチャを正しくバインドするにはどうすればよいですか?

私は色のついたテキストをスクリーンにレンダリングしようとしています。私は、表示するテキストの黒(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
あなたのブレンド機能は何ですか?あなたはglGetErrorを呼び出しますか?
追加された 著者 Luca,
colorRect の価値は?テクスチャパラメータとは何ですか?
追加された 著者 Luca,
@ニコル:すみません、何?あなたはシェイダーコード内に制服をセットしません...
追加された 著者 Mason Wheeler,
@Luca:Blend関数は、 glBlendFunc(GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA)ですが、フラグメントシェーダーでレンダリングするときに問題はありますか?そして、いいえ、私のコードはglGetErrorを呼び出すのではありませんが、私はgDEBuggerの下でそれを実行しています。
追加された 著者 Mason Wheeler,
これらのサンプラーユニフォームを設定するシェーダーコードはどこにありますか?
追加された 著者 Nicol Bolas,
十分に公正:サンプラーの制服を設定するC ++コード。また、サンプラーをシェーダーコードで設定することもできます適切な拡張機能/ GLバージョン
追加された 著者 Nicol Bolas,

2 答え

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

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

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

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

あなたのカラーテクスチャは色でいっぱいですか?

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

アルファチャンネルをオーバーライドするには、次のコードを試しましたか?

  gl_FragColor = vec4( texture2DRect(texRGB, gl_TexCoord[1].st).rgb, 1.0 );
0
追加された
ちょうどそれを試みた。それは私に黒い箱を与えます。私が言ったように、texture2DRectコールは(0、0、0、0)を返すようです。
追加された 著者 Mason Wheeler,
いいえ、どちらもうまく動作しています。 2つのテクスチャを切り替えた場合、出力としてカラークワッドが得られます。私はgDEBuggerでできること全てを検証しました。すべてが期待どおりに機能しています。そして残念ながら、gDEBuggerはシェーダ自体の中に私を連れていくことができないので、それが失われてしまうのです。
追加された 著者 Mason Wheeler,
画像へのリンクを投稿できますか?あなたのテクスチャのinitコードのコピー?私はあなたのテクスチャやテクスチャの初期化から問題が発生すると思います。
追加された 著者 rotoglup,
申し訳ありませんが、アイデアがなくなり、シェーダコードが正常に表示されます。私は、あなたが均一なサンプラーの値の割り当てをチェックしたと仮定します。GLInterceptシェーダーエディタを使って、あなたのシェイダーコードを変更してライブを試してみてください。これがあなたにリードを与えるかもしれません。
追加された 著者 rotoglup,