PhtoShopのレイヤ結合計算式

さて、今回は画像の結合を行う必要があったので、普通のアルファブレンドではなく、Photoshopにおけるレイヤ結合の計算式を使用しました。
普通の合成と違ってMatrixのCompositeと似てるように思えます。
ゲームではほとんど、または全く使用されない類のものだと思います。


基本的には2枚の画像、src(上)、dest(下)を元に計算します。
何枚も重なる場合は、下から上に順に何回も行っていきます。
(たぶん上からでも大丈夫なんじゃないかな。そのほうが手前描画と同じ原理で最適化が利く事が多いかもしれません)
計算式はこんなかんじ。

src...上の画像
dest..下の画像
out...結合結果

da = (1.0 - src.a) * dest.a
out.a = src.a + dest.a

out.rgb = src.rgb * (src.a/out.a) + dest.rgb * (da/out.a)
  ↓
oa=1.0/out.a
out.rgb = src.rgb * (src.a*oa) + dest.rgb * (da*oa)

※例外
src.a==0.0...スキップ
src.a==1.0...dest.argb=src.argb
dest.a==0.0..dest.argb=src.argb

Alpha50%とAlpha50%を合成する場合、上の画像が50%、下の画像が0.5x0.5=25%の配分になるよー、ということ以外はアルファブレンドと似たような計算式です。
ただ50%と25%では100%にならないので、足した75%で割ることで、66.6%と33.3%に比率を調整する必要があり、割り算が発生します。
でも逆数(1.0/n)を一回求めておけば加算と乗算の式に置き換えることが出来るので、最適化する際は行列計算を上手く使えそうな気がします。
srcが100%と0%の時に最適化、destが0%の時に例外があるので、Shaderの時はちょっと考えないといけませんね。
上の式では「通常」合成に当たります。

ゲームでは割り算は御法度なため、alphaの計算にスクリーン*1を用いられることが常な用です。

*1:a1+a2)-(a1*a2