本日はシェーダー枠です。
昨日は透明度を持った半透明なオブジェクトの描画を行いました。
キーポイントとして透明度を持ったオブジェクトの描画には以下の二つがあります。
・不透明なオブジェクトが描画された後に描画する
・すでに描画されているピクセルと半透明シェーダーによって計算されたピクセルの色をどのように混ぜるかというAlphaBlendingの設定
先日の状態ではこのAlphaBlendingがOne Oneですでに描画されたピクセルに対して加算する形で混ぜていたため明るく描画されていました。

今回はこのAlphaBlendingについてみていきます。
〇AlphaBlendingとは?
AlphaBlendingとはシェーダーで描画した色をどのようにすでに描画されている色に合成するかというパラメータになります。

〇SrcColor DstColor
よく見かける例としてはBlend SrcColor DstColorです。
SubShader
{
Tags { "RenderType"="Transparent" }
LOD 100
Blend SrcColor DstColor
Pass
{
・・・
}

SrcColorはシェーダーによって出力される生の色を指します。
DstColorはすでに描画されている色を指します。
つまりこのシェーダーで描画した色をすでに描画している色と混ぜ合わせる処理になります。
これはガラスなどの物理的な透明度表現などによく使用されます。
〇SrcAlpha OneMinusSrcAlpha
こちらもよく見るブレンドです。
SubShader
{
Tags { "RenderType"="Transparent" }
LOD 100
Blend SrcAlpha OneMinusSrcAlpha
BlendOp Add
Pass
{
OneMinusSrcAlphaは1からSrcAlphaを引いた値になります。
SrcAlphaとはシェーダーで計算されたアルファを意味しています。
例えば次のようなシェーダーの場合SrcAlphaは0.6、OneMinusSrcAlphaは0.4となります。
float4 frag (v2f i) : SV_Target
{
float4 col = tex2D(_MainTex, i.uv);
col.a = 0.6f;
return col;
}
こちらは最終的な色味が必ず1になるため明るくも暗くもなることがなくポピュラーな透過に向いています。

〇One OneMinusSrcAlpha
SubShader
{
Tags { "RenderType"="Transparent" }
LOD 100
Blend One OneMinusSrcAlpha
BlendOp Add
Pass
{
Oneは数値の1を示しています。
この処理では特徴としてcol.a = 0.0f;としても以下のように完全に透明になることはありません。 ただしテクスチャで黒の部分は完全に透明になっているのが確認できると思います。

筆者としてまだ完全にマニュアルを解いて理解できたわけではありませんが、上記の表現が最も一般的なようです。