Unity shader AlphaTest透明度测试

当一个片元的透明度不满足条件(通常是小于某个阈值),那么就舍弃它对应的片元。被舍弃的片元将不会再进行任何处理,也不会对颜色缓冲产生任何影响。否则就按照普通的不透明物体方式来处理。通常会使用clip函数。

示例:

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