2

glBindFragDataLocationIndexed() を使用し、フラグメント シェーダーで 2 つの色を記述しています。以下は私のコードです:

glBindFragDataLocationIndexed(shader_data.psId, 0, 0, "Frag_Out_Color0");
glBindFragDataLocationIndexed(shader_data.psId, 0, 1, "Frag_Out_Color1");

glActiveTexture ( GL_TEXTURE0 );
LoadTexture(texture1);    
glBindTexture ( GL_TEXTURE_2D, tex_id1);
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA,width, height, 0, GL_RGBA,GL_UNSIGNED_BYTE, texture1_data);

glActiveTexture ( GL_TEXTURE1 );
LoadTexture(texture2);
glBindTexture ( GL_TEXTURE_2D, tex_id2);
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA,width, height, 0, GL_RGBA,GL_UNSIGNED_BYTE, texture2_data);


glEnable(GL_BLEND);
glBlendFunc(GL_SRC_COLOR, GL_SRC1_COLOR);

glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

フラグメント シェーダーは次のとおりです。

#version 150
in vec2 texcoord;

uniform sampler2D basetexture1;
uniform sampler2D basetexture2;

out vec4 Frag_Out_Color0;
out vec4 Frag_Out_Color1;

void main(void)
{
    Frag_Out_Color0 = texture2D(basetexture1, texcoord);

    Frag_Out_Color1 = texture2D(basetexture2, texcoord);

}

OGL3.3仕様は次のように述べています:

Data written to the first of these outputs becomes the first source
color input to the blender (corresponding to SRC_COLOR and SRC_ALPHA). Data
written to the second of these outputs generates the second source color input to
the blender (corresponding to SRC1_COLOR and SRC1_ALPHA).

glBlendFunc() への入力として GL_SRC_COLOR、GL_SRC1_COLOR を渡しました。結果が正しいかどうかはわかりません。添付の画像を見つけてください。また、GL_ONE,GL_ONE を渡すと、最初のテクスチャのみがレンダリングされ、2 番目のテクスチャの兆候はまったくありません。コードの残りの部分が正常であること (およびブレンディングが正しく行われていること) を確認するにはどうすればよいですか?

以下は、それぞれ texture 1 、 texture 2 、および結果です。

テクスチャ 1 テクスチャー 2 結果

4

1 に答える 1

3

宛先の色が黒であると仮定すると、結果は期待どおりになります。正確に何をしようとしているのかは明らかでglBlendFunc(GL_SRC_COLOR, GL_SRC1_COLOR);はありません。しかし、それが行うことは、ブレンディングが常に行うことです。

ソース係数 ( GL_SRC_COLOR) は、ソース カラー (より正確には、source0 カラー) で乗算されます。宛先係数 ( GL_SRC1_COLOR) に宛先カラーが乗算されます。これらの乗算の結果が加算されます。

あなたの場合、これは source0 の色がそれ自体で乗算されることを意味します(したがって、結果が暗くなります)。宛先の色は source1 の色で乗算されます。宛先が 0 の場合は 0 になります。したがって、source0 の色をそれ自体で乗算したものが出力として得られます。

デュアル ソース ブレンディングは、2 つのソース カラーと宛先カラーの間で何らかの操作を実行する必要がある場合にのみ役立ちます (シェーダーでは実行できないという点で) 。として表現できる場合は、シェーダーで行う必要があります。(Src0 op Src1) op Dest

于 2013-04-01T09:06:55.537 に答える