🦁

URP環境で動作するビルトインのSpriteシェーダまとめてみた

2022/06/28に公開


SpriteRenderのMaterialにアタッチして使用するシェーダである

Diffuse

インスペクターで以下である

SpriteとColorを設定するシンプルなシェーダー

External Alpha(_AlphaTex)、Enable External Alpha(_EnableExternalAlpha)に関しては、
下記のソース見る限り、ETC1(アルファチャンネル使用できない)の時、
_EnableExternalAlphaが0なので、color.aは、color.aを取得する
つまり、_MainTexで黒い箇所は、透明になるということなのか?
端末があれば分かるのだが、ETC1の端末がないから確認できない。。。

fixed4 SampleSpriteTexture (float2 uv)
{
    fixed4 color = tex2D (_MainTex, uv);

#if ETC1_EXTERNAL_ALPHA
    fixed4 alpha = tex2D (_AlphaTex, uv);
    color.a = lerp (color.a, alpha.r, _EnableExternalAlpha);
#endif

    return color;
}

fixed4 SpriteFrag(v2f IN) : SV_Target
{
    fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
    c.rgb *= c.a;
    return c;
}

PixelSnapは、アトラス化した際に謎の線がはいった時に使用するものらしい
https://kazupon.org/unity-use-pixel-snap/
https://www.f-sp.com/entry/2016/11/24/152957#f-6fe90710

Mask

インスペクターで以下である

Diffuseシェーダーとインスペクターは同じであるが、テクスチャを設定してもテクスチャが表示されない
下記のソースコード見る限り、テクスチャからカラーを取得してきていないので当然と言えば当然である。
何のためにあるのだろうか。。。

fixed4 frag(v2f_masking IN) : SV_Target
            {
                fixed4 c = SampleSpriteTexture(IN.uv);
                // for masks: discard pixel if alpha falls below MaskingCutoff
                clip (c.a - _Cutoff);
                return _Color;
            }

Discussion