网格阴影

第二个Pass将模型压扁,偏移,渲染成透明的黑色

Shader "chicai/MeshShadow"
{
    Properties
    {
        _DiffuseIntensity("Diffuse Intensity", float) = 1
        _SpecularIntensity("Specular Intensity", float) = 1
        _Gloss("Gloss", float) = 1
        _ShadowPos("ShadowPos", vector) = (0,0,0,0)
    }
   
    SubShader
    {
        Tags { "RenderType"="Opaque"}
        LOD 100
        Pass{}

        //只能在平面上用
        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha
            //透明渲染,会穿透渲染两层,过滤只一层
            Stencil
            {
                Ref 100
                Comp NotEqual
                Pass Replace
            }

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

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
            };

            float4 _ShadowPos;

            v2f vert(appdata v)
            {
                v2f o;
                float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
                float tempPosy = worldPos.y - _ShadowPos.y;//将脚上到头顶的顶点计算到从0开始
                worldPos.y = _ShadowPos.y;//地面在世界坐标中的高度,压扁
                worldPos.xz += _ShadowPos.xz * tempPosy;//偏移影子
                o.pos = mul(UNITY_MATRIX_VP, worldPos);
                return o;
            }

            fixed4 frag(v2f i):SV_TARGET
            {
                return fixed4(0,0,0,_ShadowPos.w) ;
            }

            ENDCG
        }
    }
}



首页 我的博客
粤ICP备17103704号