2012-05-01 9 views
4

OpenGLでイメージをマスクしてその一部が透明になるようにしようとしています。ここで働いていない私のコード、です: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); 

ここでは、私が描くしようとしていた上で、私の背景画像は、次のとおりです。ここで

background image

(それぞれ、テクスチャとマスクですマスクの白は)あなたが見ることができますので、私はちょうどそれを平坦化し、本当に透明である:

texturemask

これは私が得ることを期待するものである:

expected result

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

actual result

問題が何であるか任意のアイデア?

初心者のためのよく

答えて

4

、私は、これはあなたが期待するものでしょうとは思わない:

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

、これはバックグラウンドでマスクをブレンドされていますが、「常にマスクの100%を取ると言っていますと0%の宛先は常に "。このステップの後に、すべてをマスクテクスチャで置き換えたので、フレームバッファには赤のピクセルがなくなります。

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

とすればよいと思います。

このようなエフェクトは、一般的にはglTexEnvでマルチテクスチャ処理を行っていると思われますが、マルチテクスチャを使用したくない場合は、これが有効です。

+0

ありがとうございました!今私はそれがなぜそれをしているのか理解しています - 私は2番目のブレンドが間違っていると思っていましたが、本当に働いていました。 – Skyler

関連する問題