4

画像の一部が透明になるように、OpenGL で画像をマスクしようとしています。動作していない私のコードは次のとおりです。

draw_img(background);

...

glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_ONE, GL_ZERO);
draw_img(mask);
glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);

draw_img(foreground);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

これが私の背景画像で、その上に描画しようとしています:

背景画像

それぞれテクスチャとマスクを次に示します (マスクの白は本当に透明です。見やすいように平らにしました)。

テクスチャーマスク

これは私が期待するものです:

期待される結果

そして、これは私が実際に得るものです:

実結果

何が問題なのですか?

4

1 に答える 1

4

まず第一に、これはあなたが期待することをしないと思います:

glBlendFunc(GL_ONE, GL_ZERO);
draw_img(mask);

これはマスクを背景とブレンドしていますが、「マスクの 100% を常に取得し、目的地の 0% を常に取得する」と言っています。フレーム バッファのすべてのチャネルをマスク テクスチャに置き換えたので、この手順の後、フレーム バッファに赤いピクセルはなくなります。

おそらく、アルファチャンネルだけを置き換えて、色はそのままにしておくつもりだったのではないでしょうか? マスクを描画する前にカラー チャネルをマスクすると、これを行うことができます。glColorMask(GL_FALSE,GL_FALSE,GL_FALSE, GL_TRUE);

それができれば何とかなると思います。

この種の効果は通常、glTexEnv を使用したマルチテクスチャリング操作で行われると思いますが、マルチテクスチャリングを使用したくない場合は、これでうまくいくはずです。

于 2012-05-01T16:58:54.793 に答える