leonard Wu
2018-08-02 8175a85734cf5ae2a2d26d913ff30a14c2377029
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// Upgrade NOTE: replaced '_Projector' with 'unity_Projector'
// Upgrade NOTE: replaced '_ProjectorClip' with 'unity_ProjectorClip'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
 
Shader "DynamicShadowProjector/Projector/Mipmapped Shadow" {
    Properties {
        _ShadowTex ("Cookie", 2D) = "gray" {}
        _ClipScale ("Near Clip Sharpness", Float) = 100
        _Alpha ("Shadow Darkness", Range (0, 1)) = 1.0
        _Ambient ("Ambient", Range (0, 1)) = 0.3
        _DSPMipLevel ("Max Mip Level", float) = 4.0
        _Offset ("Offset", Range (-1, -10)) = -1.0
    }
    Subshader {
        Tags {"Queue"="Transparent-1"}
        Pass {
            Name "PASS"
            ZWrite Off
            ColorMask RGB
            Blend DstColor Zero
            Offset -1, [_Offset]
 
            CGPROGRAM
            #pragma vertex DSPProjectorVertMipmap
            #pragma fragment DSPProjectorFragMipmap
            #pragma multi_compile_fog
            #pragma target 3.0
            #include "UnityCG.cginc"
            #include "DSPProjector.cginc"
 
            uniform half _DSPMipLevel;
 
            DSP_V2F_PROJECTOR DSPProjectorVertMipmap(float4 vertex : POSITION, float3 normal : NORMAL)
            {
                DSP_V2F_PROJECTOR o;
                o.pos = UnityObjectToClipPos (vertex);
                o.uvShadow = mul (unity_Projector, vertex);
                float z = mul(unity_ProjectorClip, vertex).x;
                o.uvShadow.z = _DSPMipLevel * z;
                o.alpha.x = _ClipScale * z;
                o.alpha.y = DSPCalculateDiffuseShadowAlpha(vertex, normal);
                UNITY_TRANSFER_FOG(o, o.pos);
                return o;
            }
 
            fixed4 DSPGetMipmappedShadowTex(DSP_V2F_PROJECTOR i)
            {
                float3 uv;
                uv.xy = saturate(i.uvShadow.xy/i.uvShadow.w);
                uv.z = i.uvShadow.z;
                return tex2Dlod(_ShadowTex, uv.xyzz);
            }
 
            fixed4 DSPProjectorFragMipmap(DSP_V2F_PROJECTOR i) : SV_Target
            {
                fixed4 shadow = DSPGetMipmappedShadowTex(i);
                return DSPCalculateFinalShadowColor(shadow, i);
            }
            ENDCG
        }
    }
}