Unity シェーダー AlphaTest 透過性テスト

フラグメントの透明度が条件を満たさない場合 (通常は特定のしきい値未満)、対応するフラグメントは破棄されます。破棄されたフラグメントはそれ以上処理されず、カラー バッファーに影響を与えません。それ以外の場合は、通常の不透明なオブジェクトと同じ方法で処理されます。通常はクリップ機能を使用します。

例:

Shader "Unlit/AlphaTest"
{
    Properties
    {
        _Color("Color", Color) = (1,1,1,1)
        _MainTex("Texture", 2D) = "white" {}
        _Cutoff("Alpha Cutoff", Range(0,1)) = 0.5
    }
    SubShader
    {
        //指定 AlphaTest 渲染队列    不受投影器影响          
        Tags {"Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }

        Pass
        {
            //定义此Pass在光照流水线中的角色,从而正确获取内置光照变量
            Tags { "LightMode" = "ForwardBase" }
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
                float3 worldVertex : TEXCOORD1;
                float3 worldNormal : TEXCOORD2;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _Color;
            float _Cutoff;

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                o.worldVertex = mul(unity_ObjectToWorld,v.vertex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                //归一化世界空间法线
                fixed3 worldNormal = normalize(i.worldNormal);
                //归一化世界空间光照方向
                fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldVertex));

                fixed4 texColor = tex2D(_MainTex, i.uv);
                //Alpha test
                clip(texColor.a - _Cutoff);
                // clip(texColor.a - _Cutoff) 即为下方这段代码
                // if ((texColor.a - _Cutoff)< 0.0)
                // {
                //     discard;
                // }

                fixed4 albedo = texColor * _Color;
                //获取环境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * albedo;
                //计算漫反射光照
                fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(worldNormal,worldLightDir));
                return fixed4(ambient + diffuse, 1.0);
            }
        ENDCG
        }
    }
    Fallback "Transparent/Cutout/VertexLit"
}

元絵の説明

写真の透明度の値が異なるため、AlphaTest 値を設定すると、異なるくぼみが表示されます。

サンプルプロジェクト

おすすめ

転載: blog.csdn.net/st75033562/article/details/129320659