2016-04-13 13 views
0

かなり複雑なブレンド操作(修正済み)の効果を再現しようとしています。複雑なOpenGLブレンドのリファクタリング

(1-(1-src_alpha)*dest_alpha)*src+(1-src_alpha)*dest_alpha*dest 

srcdestは、送信元と宛先バッファ内のそれぞれのRGBA成分を指します。私がしたいのは、glBlendFuncglBlendFuncSeparateを使って、上記の式と同じ結果を出すために、おそらく同じシーンを複数回レンダリングすることで、glBlend*が呼び出されるたびに1回だけレンダリングすることです。残念ながら私の複雑なブレンドは1つのglBlend*コールではできませんが、別のglBlend*パラメータを使用してシーンを何度もレンダリングすることで、私が残した効果をまだ達成できるかもしれません。私は3つのコールが必要かもしれないと思っていますが、それを2つにすることは可能かもしれません。

編集:

、ブレンド機能が何をしているかを理解する最初の正規アルファブレンドsrc * src_alpha + dest * (1 - src_alpha)を検討します。このスタイルのブレンドは、ソースが事前に乗算されたアルファを含んでいない事実上すべてのアルファブレンディングでうまくいきます。特に、スクリーンやその他のデバイスのような最終的なデバイスにレンダリングするときは、不透明である。

宛先がすでに不透明である場合、この複合ブレンド機能は、宛先を不透明にしながら、前述の共通ブレンド機能と同じ結果をもたらします。宛先が完全に透明になると、複雑なブレンド機能は低下します代わりにソースの透過を継承します。したがって、複雑なブレンド関数が実際に行うことは、デスティネーションアルファに基づいて、これらの2つの極端の間を単純に直線的に補間することです。

編集:上記のブレンド機能を修正する必要がありました。私はそれを誤って因数分解しました。私は、検証のために、以下の導出を示しています。

まず、私は基本的なブレンド機能を起動します。

src * src_alpha + dest * (1 - src_alpha) 

そして、何私がやりたいことはそう、dest_alphaに応じて、SRCとそれをブレンドしています上記の機能は、dest_alphaを掛け、と私は1を乗じたソースにそれを追加している - 次のように、dest_alpha:

src * (1-dest_alpha) + (src * src_alpha + dest * (1 - src_alpha)) * dest_alpha 

リファクタリングは算術私にこれを与える:

(1-(1-src_alpha)*dest_alpha)*src+(1-src_alpha)*dest_alpha*dest 
+1

これが完了したら、あなたの目的地のアルファは何になりますか? –

+1

シェーダを使ってこの計算をしてから、ブレンダ関数を使ってクワッドをレンダリングすることはできませんか?私はまったくブレンドに精通していないので、ただ疑問に思っています。 – Jas

+1

@Jas:シェーダでは(ブレンドは三角形ベースではできません)、GPUのハードワイヤード回路です。もちろん、OPは実際にはいくつかのレイヤーから画像を合成することができます。この場合、これはもはやブレンドされずに合成されます。 – datenwolf

答えて

0

誰がここで、この任意の必要性を持っているので、もし私が、それを考え出したが、私が発見したものです:

まず、私はその後、私は、通常のシーンを描く

glblendfuncseparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE) 

を呼び出します。これは、ソースにプレマルチプレイングされていないアルファがあり、不透明な背景とブレンドされていると仮定して、カラーチャンネル上のブレンドの正しいスタイルになるものを生成します。

glblendfuncseparate(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) 

そして私は以前とまったく同じシーンを再描画:desinationの元のアルファが保持されているが、それは次のステップで使用することができますので。これにより、元のソースと目的のアルファに基づく上記のブレンド結果との間のカラーチャネルがさらに線形に補間され、結果が常にソースアルファまたはアルファアルファのいずれかよりも大きいかまたは等しくなるようにアルファ成分が結合されるソースとアルファベットのアルファ値と同じように、常に0と1の間に制限されます。

関連する問題