かなり複雑なブレンド操作(修正済み)の効果を再現しようとしています。複雑なOpenGLブレンドのリファクタリング
(1-(1-src_alpha)*dest_alpha)*src+(1-src_alpha)*dest_alpha*dest
src
とdest
は、送信元と宛先バッファ内のそれぞれのRGBA成分を指します。私がしたいのは、glBlendFunc
とglBlendFuncSeparate
を使って、上記の式と同じ結果を出すために、おそらく同じシーンを複数回レンダリングすることで、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
これが完了したら、あなたの目的地のアルファは何になりますか? –
シェーダを使ってこの計算をしてから、ブレンダ関数を使ってクワッドをレンダリングすることはできませんか?私はまったくブレンドに精通していないので、ただ疑問に思っています。 – Jas
@Jas:シェーダでは(ブレンドは三角形ベースではできません)、GPUのハードワイヤード回路です。もちろん、OPは実際にはいくつかのレイヤーから画像を合成することができます。この場合、これはもはやブレンドされずに合成されます。 – datenwolf