OpenGLブレンド関数を期待どおりに(または賢明な画像編集プログラムから)期待どおりに機能させるのに苦労しました。例として、次の2つの画像を使用してブレンドします(白い背景では見づらいので、色がラベル付けされます)。
合成する画像
これは私が起こると期待していることです(そしてpaint.netで何が起こるか):
期待される結果
明らかに、openglのデフォルトのブレンド関数は、次のようになります(非常に間違っています)。
glBlendFunc(GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA)
たくさんのテストの後、これは私が「良い」ブレンド関数を作成するために得ることができる最も近いものです:
glBlendFuncSeparate(GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA、GL_ONE、GL_ONE_MINUS_SRC_ALPHA)
ただし、元の予想結果を振り返ると、一部の色が本来よりも少し暗くなっていることがわかります(中央左部分)。具体的には、それらは(.5アルファのため)カラー値の半分に事前に乗算されており、これを行わない関数を作成することはできません(ほとんど見えない赤い透明部分で奇妙な混合の問題を引き起こすことなしに)。
誰かがこの問題の解決策を知っていますか?ソースであらかじめ乗算されたアルファを使用する必要がありました(ゲームで使用するすべての色をあらかじめ乗算された色に変換するか、各シェーダーに何かを書き込むために追加の作業が必要なため、これを行いたくありません)。 :
glBlendFuncSeparate(GL_ONE、GL_ONE_MINUS_SRC_ALPHA、GL_ONE、GL_ONE_MINUS_SRC_ALPHA)(事前乗算なし)
明らかにそれも間違っていますが、これが実際に私がこれまでに得た唯一の正しい結果です。
glBlendFuncSeparate(GL_ONE、GL_ONE_MINUS_SRC_ALPHA、GL_ONE、GL_ONE_MINUS_SRC_ALPHA)(事前乗算された入力)
唯一の問題は、それを画面に表示するための事前乗算をどのようにして取り除くのですか?ブレンドするものごとに追加のレンダーサイクルが必要になる可能性があり、この問題には複雑すぎるように思われるので、私はまだ答えを探しています(OpenGLは非常に広く使用されているため、これについて何かを見つけることができないのは興味深いことです)他の誰かがこの問題に遭遇したと思います)。
出典:
オンラインブレンド機能検査- http://www.andersriggelsen.dk/glblendfunc.php
下層イメージ- http://i.stack.imgur.com/XjLNW.png
トップレイヤーイメージ- のhttp://i.stack.imgur .com / 9CN6w.png