1

私が持っているのは、このブレンド機能をテストするためにレンダリングされている3x3グリッドの9つの正方形のセットです。これがアイデアです。

パス1:

  • バインドtexture1(ダート)
  • tex1=Dirtを使用して正方形をレンダリングします

パス2:

  • バインドtexture2(文字)
  • tex2=文字Wを使用して同じ正方形をレンダリングします

これはゲーム内エディター用です。入力時にテキストアトラスから文字の色を変更できるようにしたいと考えています。シェーダーは、テクスチャからフラグメントのアルファ値をチェックすることになっています。0に等しくないもの(つまり、Visible)は、属性としてシェーダーに渡される目的の色に変更する必要があります。

//Draw all Squares

glBindTexture(GL_TEXTURE_2D, textureID1);   //Dirt Texture

for (int Index = 0; Index < 9; Index++)
{
//Pass in Vertex Positions...
//Pass in UV's...
glDrawArrays(GL_TRIANGLES, 0, 6); // From index 0 to 6 -> 2 triangle
}

//Redraw Squares with letter texture bound.

glBindTexture(GL_TEXTURE_2D, textureID2);  //Letter Texture

glVertexAttrib3f(2,255,0,0);  //Desired Color of letter, passed to shaders.

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0.05f);  //Anything with alpha < 0.05 is discarded.

//Draw all Squares
for (int Index = 0; Index < 9; Index++)
{
   //Pass in Vertex Positions...
   //Pass in UV's...
glDrawArrays(GL_TRIANGLES, 0, 6); // From index 0 to 6 -> 2 triangle
}

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisable(GL_ALPHA_TEST);

//Draw blue vertex dots...etc...

これは、ソースイメージと、わずかに異なる2つのフラグメントシェーダーの出力を示す画像です。望ましい結果とともに。

フラグシェーダーと望ましい結果を含む画像ソース

テクスチャがロードされ、両方にアルファチャネル(GL_BGRA、Targas)があります。MIN /MAGFILTERSとしてGL_NEARESTを使用しています。

奇妙なことに、このシェーダーは、レターテクスチャのアルファチャネルで99%の白(つまり254)を使用すると機能し、フルホワイト(つまり255)を使用すると失敗します。

GL_BLENDを有効にして、さまざまなBlendFuncを使用してみましたが、機能しないようです。

質問はそうだと思います。マルチテクスチャシェーダーを使用せず、FBOにレンダリングせずに、これはこの種のブレンディングを行う正しい方法ですか?

4

1 に答える 1

0

これは、シェーダーが期待どおりに動作していた状況の1つでしたが、それが何を意味するのかを正確に誤解していました。

この場合、同じシェーダーを使用して、最初の背景テクスチャとオーバーレイテキストテクスチャの両方をレンダリングしていました。背景テクスチャのアルファチャネルは1.0(白)全体で塗りつぶされているため、ダートテクスチャは赤く塗りつぶされていました。次に、2回目のパスでテキストが適切にレンダリングされますが、これも赤でレンダリングされていたため、表示されませんでした。

この状況での問題を修正するには、代わりに文字テクスチャのアルファチャネルに黒(つまり透明)で文字を描画し、シェーダーでアルファテストを実行して必要に応じて反転します。この方法のは、文字がレンダリングされる前にブレンドを有効にし、レンダリング後にそれを無効にすることです。

結局、シェーダーはこのように機能します。

  • フラグメントalpha<1の場合
    、Color = vec4(in_color、(tex_color.a =(tex.color.a)?(1.0 --tex_color.a):1.0));

  • それ以外の場合、(Alpha = 1)アルファチャネル
    tex_color.a=0を反転します。
    色=tex_color;

これにより、ブレンドが有効になっているときにアルファチャネルで黒で描画されたものはすべて、透明ではなく色付きで表示されます。

結局のところ、マルチテクスチャリングがおそらく道のりですが、私の場合は、一度に1つのテクスチャのみを有効にしてそれを実行したいと思いました。

于 2012-11-28T21:15:47.357 に答える