1

glBlendFunc を

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

テスト目的で、このようにフラグメントシェーダーに色を設定しました

gl_FragColor = vec4(1.0,0.0,0.0,0.0);

オブジェクトは完全に透明であるべきではありませんか? そうでない場合、その理由は何でしょうか?

4

1 に答える 1

2

の最初の引数glBlendFunc()はソース ファクターで、2 番目の引数は宛先ファクターです。あなたの場合:

sfactor = 1.0;
dfactor = 1.0 - src.alpha;

src.alpha = 0.0あなたからgl_FragColor

sfactor = 1.0;
dfactor = 1.0;

したがって、バッファに入れられる色は次のようになります。

buffer = sfactor * src + dfactor * dst;

置換しています...

buffer = (1.0,0.0,0.0,0.0) + dst;

簡単に言えば、既存のバッファの赤チャンネルに 1 を追加します。

出力を完全に透明にしたい場合、通常の関数は次のとおりです。

glBlendFunc(GL_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

あなたが書いたものは、通常、ソースの事前に乗算されたアルファに使用されます。しかし、(1, 0, 0, 0) は明らかに事前に乗算されたアルファ値ではありません!

于 2014-01-12T10:00:15.587 に答える