2009-08-23 9 views
2

これは私の最後のquestionに関連しています。このイメージを取得するには:テクスチャにレンダリングするときの画像ブレンドの問題

http://img252.imageshack.us/img252/623/picture8z.png

  1. を私は白の背景(色= (1, 1, 1, 1))を描きます。

  2. I色を有する2つの左上四角形が(1, 0, 0, .8) =にテクスチャレンダリング機能(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)をブレンドし、次に色= (1, 1, 1, 1)とブレンド機能(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)とテクスチャを描きます。

  3. 私は色= (1, 0, 0, .8)とブレンド関数(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)で右下の四角形を描きます。私の計算で

、レンダリングにテクスチャ正方形は白の背景にそのテクスチャを描画した後、色

.8 * (1, 0, 0, .8) + (1 - .8) * (0, 0, 0, 0) = (.8, 0, 0, .64) 

などを持っている必要があり、彼らは色を持っている必要があり

(.8, 0, 0, .64) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84) 

右下の四角は色が付いているはずです

.8 * (1, 0, 0, .8) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84) 

これは同じに見えるはずです!私の推論は間違っていますか?私の計算は間違っていますか?

いずれにしても、私の目標は自分のシーンの一部をキャッシュすることです。テクスチャをレンダリングしてからそのテクスチャを描画すると、シーンをインラインで描画するのと同じようになります。

答えて

4

ブレンドコンテンツをテクスチャにレンダリングし、そのテクスチャを画面に合成する場合、最も簡単な方法は、あらかじめ掛け合わせたアルファをどこでも使用することです。これは、あなたのケースではうまくいくことを示すのが比較的簡単です:予め乗算された形の半透明の四角の色は(0.8,0,0,0.8)であり、これを(0,0,0,0)に(GL_ONEGL_ONE_MINUS_SRC_ALPHA)は本質的にあなたの四角形の色をテクスチャに渡します。不透明な白を(GL_ONE,GL_ONE_MINUS_SRC_ALPHA)でブレンド(0.8,0,0,0.8)すると、(1.0,0.2,0.2,1.0)が得られます。カラーチャンネルは3番目の計算と同じですが、アルファチャンネルはまだ1.0です。これはブレンドされたオブジェクトで覆われた不透明なオブジェクトに期待されるものです。

トムフォーサイス(Tom Forsyth)は、プレマルチプライアルについて約articleです。全体のことは読みに値するが、一般的なケースで数学がなぜ機能するのかについては、「半透明レイヤの合成」のセクションを参照してください。

0

わたしの計算は間違っています! 2行目は、実際に、私は(私は(1, .2, .2, .8)を着色する最後の正方形を変更すると、すべての3つの正方形は同じ色に見える)見るものと一致しているようだ

(.8, 0, 0, .64) + (1 - .64) * (1, 1, 1, 1) = (1, .36, .36, .84) 

でなければなりません。

0

最後の質問について:シーンの一部をテクスチャで置き換えることは簡単なことではありません。良い出発点はStefan JeschkeのPhD thesisです。

関連する問題