Unity : ShaderLab : Blend構文
Blend構文の記法
Blend SrcFactor DstFactor
画面に出力する色 = Shaderで計算した色 * SrcFactor + 既に画面に描画されている色 * DstFactor
計算式とBlend構文まとめ
$ A : シェーダーで計算した色
$ B : すでに画面に描画されている色
$ Output : AとBを合成した結果の色
■加算ブレンド
加算合成は以下のような計算式になる
$ Output = A + B
以下のようにも書ける
$ Output = {\bf 1.0}・A + {\bf 1.0} ・ B
code:ShaderLab
Blend One One
■加算ブレンド(アルファ値を使う場合)
アルファ値を使う加算合成は以下のような計算式になる
$ Output = {\bf アルファ値}・A + {\bf 1.0} ・ B
code:ShaderLab
Blend SrcAlpha One
■アルファブレンド
アルファブレンドは以下のような計算式になる
$ Output = アルファ値 ・ A + (1.0 - アルファ値) ・ B
code:ShaderLab
Blend SrcAlpha OneMinusSrcAlpha
■乗算合成
乗算合成は以下のような計算式になる
$ Output = A・B
これは以下のように書くこともできる
$ Output = B・A + 0.0・B
code:ShaderLab
Blend DstColor Zero
以下のように書くこともできる
$ Output = {\bf 0.0}・A + {\bf A}・B
code:ShaderLab
Blend Zero SrcColor
■乗算合成の2倍
乗算の2倍は以下のように書ける
$ Output = 2・A・B
これを式変形すると以下のようになる
$ Output = {\bf B}・A + {\bf A}・B
code:ShaderLab
Blend DstColor SrcColor
■スクリーン合成
スクリーン合成は以下のような計算式になる
$ Output = 1.0 - \{ (1.0 - A) ・ (1.0 - B) \}
これを式変形すると以下のようになる
$ Output = {\bf (1.0 - B)} ・A + {\bf 1.0}・B
code:ShaderLab
Blend OneMinusDstColor One
以下のように書くこともできる
$ Output = {\bf 1.0}・A + {\bf (1.0 - A)} ・B
code:ShaderLab
Blend One OneMinusSrcColor
模式図
ブレンドの処理がどのように流れているのか理解しづらいので、模式図を作ってみました。
DstColor: 元から描画されているスクリーンの色
SrcColor : シェーダーのfrag()関数がreturnした色(float4値)
https://gyazo.com/cbfff48e539ef139e3c4c2dbc8cce2de
応用 : 乗算色をアルファブレンドする
AとBの乗算色(A・B)と画面色Bをアルファブレンドすることを考えます。
$ Output = \alpha \cdot A \cdot B + (1 - \alpha) \cdot B
■STEP1 : Blend構文
まずは、以下のようなBlend命令を実装します。
code:ShaderLab
Blend DstColor OneMinusSrcAlpha
このBlend命令を計算式で表すと以下のようになります。
$ Output = A \cdot B + (1 - \alpha) \cdot B
$ A \cdot B の部分にアルファ値を乗算したいですが、Blend構文だけでは3つの値を乗算することはできません。
そこで、アルファ値の乗算はシェーダーのfrag()関数内で実装することにします。
■STEP2 : frag()内にアルファ乗算を実装する
シェーダーのfrag()関数の中で、float4値をreturnする前にRGB成分にアルファ値を乗算しておきます。
code:ShaderLab(glsl)
color.rgb *= color.a;
return color;
これで、Blend構文の シェーダー計算色の部分にアルファ値が乗算されるようになりました。
$ A の部分に $ \alpha が乗算された値が入り、以下のような計算式になります。
$ Output = \alpha \cdot A \cdot B + (1 - \alpha) \cdot B
求める結果が得られました。