Unity Shader案例04-------透明

发布时间 2023-03-28 17:59:54作者: 打工仔-也想飞
Shader "CLF/SetTransparent"
{
    Properties
    {
        _Diffuse("Diffuse",Color) = (1,1,1,1)  //  漫反射
        _MainTex("MainTex",2D) = "white"{}  //  2D纹理贴图
        _AlphaScale("Alpha Scale",Range(0,1)) = 1  //  控制Alpha参数
    }
    SubShader
    {
            Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }   //  渲染顺序设置Transparent
            LOD 100
            //  用两个pass通道来处理,防止出现渲染错误,第一个pass通道  每个pass通道都会渲染一次
            Pass  
            {
                ZWrite On  //  写入深度  为了确认渲染顺序
                ColorMask 0  //  掩码遮罩  代表这个pass通道不写入任何颜色值

            }
            //  第二个pass通道
            Pass  
            {
                Tags{"LightMode" = "ForwardBase"}

                ZWrite Off  //  关闭ZWrite(深度写入)
                Blend SrcAlpha OneMinusSrcAlpha  //  源颜色因子  正常透明混合

                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "UnityCG.cginc"
                #include "Lighting.cginc"

                struct v2f {

                    float4 vertex :SV_POSITION;  //  输出顶点信息
                    fixed3 worldNormal : TEXCOORD0;
                    float3 worldPos:TEXCOORD1;
                    float2 uv:TEXCOORD2;

                };

                fixed4 _Diffuse;
                float _AlphaScale;
                sampler2D _MainTex;
                float4 _MainTex_ST;  //  是MainTex的Tiling和Offset两个属性  不需要在外面定义

                v2f vert(appdata_base v)  //  顶点着色器
                {

                    v2f o;  //  用这个结构体
                    o.vertex = UnityObjectToClipPos(v.vertex);  //  顶点信息从模型转到裁剪空间再放到输出结构体
                    fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);  //  法线从模型变换到世界坐标
                    o.worldNormal = worldNormal;
                    o.worldPos = mul(unity_ObjectToWorld, v.vertex);  //  顶点信息从模型转到世界坐标系
                    //o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;  //  为了让MainTex的Tiling和Offset两个属性能影响到uv
                    o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);  //  unity纹理函数,和上面效果一样
                    return o;
                }

                fixed4 frag(v2f i) : SV_Target  //  片元着色器  片元高光反射
                {

                    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;  //  环境光

                    fixed4 texColor = tex2D(_MainTex, i.uv);  //  采样这个图



                    //  漫反射
                    //fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                    fixed3 worldLightDir = UnityWorldSpaceLightDir(i.worldPos);

                    fixed3 diffuse = texColor.rgb * _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldLightDir,i.worldNormal) * 0.5 + 0.5);  //  漫反射公式  图的纹理采样乘进来,纹理属于漫反射

                    fixed3 color = ambient + diffuse;
                    return fixed4(color, texColor.a * _AlphaScale);  //  texColor的a值就是颜色通道的值  乘上_AlphaScale来控制

                }
                ENDCG
            }
    }
     FallBack "Transparent/VertexLit"
}