kidoOooOoooOOom

ゲーム開発やってます

Unityでアルファマスクを使うshaderについて理解

githubで公開されている下記shaderについて学んだのでメモる。
github.com


shader コードはここ
unity-alphamask/SpriteWithMask.shader at master · keijiro/unity-alphamask · GitHub

まずは

Blend SrcAlpha OneMinusSrcAlpha

Blendingに関する設定。Blending は透過のカラー作成に使用する。
Blend SrcAlpha OneMinusSrcAlpha は Traditional transparency とのこと。


グラフィックスがレンダリングされて、さらにすべてのシェーダーが実行されて、すべてのテクスチャが適用されると、画面にピクセルが描画されます。すでに存在しているピクセルに対して、どのように合成するかはブレンディングで制御されます。
Blend Off : ブレンディングを無効にします(デフォルト)。
SrcAlpha: このステージの値はソースα値を乗算する。
OneMinusSrcAlpha: このステージの値はフレームバッファの(1 - Source Alpha)を乗算します。

docs.unity3d.com

struct v2f {
                float4 pos : SV_POSITION;
                float2 uv1 : TEXCOORD0;
                float2 uv2 : TEXCOORD1;
            };

vertext shaderから fragment shader へ渡す値のstruct宣言。
TEXCOORD0 と TEXCOORD1 で、マルチパスレンダリングのターゲットを2つ設定している。
ameblo.jp

o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

mul は行列乗算。vertex shader に渡されたローカル座量(v.vertex) を model*view*projection 変換が詰まったUNITY_MATRIX_MVPの座標変換行列と乗算して、カメラに映る位置に変換している。
esakun.hateblo.jp

www.dfx.co.jp

o.uv1 = TRANSFORM_TEX (v.texcoord, _MainTex);
o.uv2 = TRANSFORM_TEX (v.texcoord, _MaskTex);

TRANSFORM_TEXマクロはテクスチャに設定されたタイリングとオフセットを反映したUV座標(テクスチャ座標)を取得するためのマクロ。
alfa.hatenablog.jp

half4 frag (v2f i) : COLOR
            {
                half4 base = tex2D (_MainTex, i.uv1);
                half4 mask = tex2D (_MaskTex, i.uv2);
                base.w = mask.x * mask.x * mask.x;
                return base * (_Color * 2.0f);
            }

tex2D関数はUV座標(テクスチャ座標)を指定してテクスチャのピクセルカラーを取得することができる。
color でいうところの RGBA が half4 で XYZW となるので、base.w は アルファ値、mask.x はマスクtextureのR値を参照している。
最後に base * (_Color * 2.0f) しているのは、_Color のデフォルト値が 0.5 だからだと思われる。