1. 程式人生 > >【UnityShader】雙面透光布料材質

【UnityShader】雙面透光布料材質

SubShader
{
    Tags { "RenderType"="Opaque" }
    LOD 100
 
    Pass
    {
        Tags { "LightMode"="ForwardBase" }
        cull off
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #pragma multi_compile_fog
        #pragma multi_compile_fwdbase 
             
        #include "UnityCG.cginc"
        #include "Lighting.cginc"
        #include "AutoLight.cginc"
 
        struct v2f
        {
            float2 uv : TEXCOORD0;
            float3 worldNormal : TEXCOORD1;
            float4 worldPos : TEXCOORD2;
            UNITY_FOG_COORDS(3)
            SHADOW_COORDS(4)
            float4 pos : SV_POSITION;
        };
 
        sampler2D _MainTex;
        float4 _MainTex_ST;
             
        v2f vert (appdata_base v)
        {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex);
            o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
            o.worldNormal = UnityObjectToWorldNormal(v.normal);
            o.worldPos = mul(unity_ObjectToWorld, v.vertex);
            UNITY_TRANSFER_FOG(o,o.pos);
            TRANSFER_SHADOW(o);
            return o;
        }
         
        fixed4 frag (v2f i) : SV_Target
        {
            fixed4 col = tex2D(_MainTex, i.uv);
            UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos)
            float3 litDir = normalize(UnityWorldSpaceLightDir(i.worldPos.xyz));
            float ndl = abs(dot(i.worldNormal, litDir))*0.5+0.5;
            col.rgb = col.rgb * (UNITY_LIGHTMODEL_AMBIENT.rgb + _LightColor0.rgb* ndl*atten);
            UNITY_APPLY_FOG(i.fogCoord, col);
            return col;
        }
        ENDCG
    }
    Pass{
        Name "ShadowCaster"
        Tags{ "LightMode" = "ShadowCaster" }
 
        cull off//確保正面和背面都正確的渲染到shadowmap
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #pragma multi_compile_shadowcaster
        #include "UnityCG.cginc"
 
        struct v2f {
            V2F_SHADOW_CASTER;
        };
 
        v2f vert(appdata_base v)
        {
            v2f o;
            TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
            return o;
        }
 
        float4 frag(v2f i) : SV_Target
        {
            SHADOW_CASTER_FRAGMENT(i)
        }
        ENDCG
 
    }
}
觀察shadowmap,現在背面也渲染到shadowmap了