wangguan
2020-12-29 452c75675679c44cc39b04bdb7d330d7c5c14d5c
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
Shader "EffectShader/Effectshader_ice"
{
    Properties
    {
        _MainTex("MainTex", 2D) = "white" {}
        [Normal]_NormalTex("NormalTex", 2D) = "bump" {}
        _Shine("Shine", Float) = 1.2
        _Fresnel("Fresnel", Float) = -0.51
        _Power("Power", Float) = -0.51
        _Mask("Mask", 2D) = "white" {}
        [HDR]_Color0("Color 0", Color) = (0.5529412,0.8117648,1,1)
        [HideInInspector] _texcoord( "", 2D ) = "white" {}
        [HideInInspector] __dirty( "", Int ) = 1
    }
 
    SubShader
    {
        Tags{ "RenderType" = "Transparent"  "Queue" = "Transparent+0" "IgnoreProjector" = "True" "IsEmissive" = "true"  }
        Cull Off
        CGINCLUDE
        #include "UnityPBSLighting.cginc"
        #include "Lighting.cginc"
        #pragma target 3.0
        #ifdef UNITY_PASS_SHADOWCASTER
            #undef INTERNAL_DATA
            #undef WorldReflectionVector
            #undef WorldNormalVector
            #define INTERNAL_DATA half3 internalSurfaceTtoW0; half3 internalSurfaceTtoW1; half3 internalSurfaceTtoW2;
            #define WorldReflectionVector(data,normal) reflect (data.worldRefl, half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal)))
            #define WorldNormalVector(data,normal) half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal))
        #endif
        struct Input
        {
            float2 uv_texcoord;
            float3 worldPos;
            float3 worldNormal;
            INTERNAL_DATA
        };
 
        uniform sampler2D _NormalTex;
        uniform float4 _NormalTex_ST;
        uniform float4 _Color0;
        uniform sampler2D _MainTex;
        uniform float4 _MainTex_ST;
        uniform float _Fresnel;
        uniform sampler2D _Mask;
        uniform float4 _Mask_ST;
        uniform float _Power;
        uniform float _Shine;
 
        void surf( Input i , inout SurfaceOutputStandardSpecular o )
        {
            float2 uv0_NormalTex = i.uv_texcoord * _NormalTex_ST.xy + _NormalTex_ST.zw;
            o.Normal = UnpackNormal( tex2D( _NormalTex, uv0_NormalTex ) );
            float2 uv_MainTex = i.uv_texcoord * _MainTex_ST.xy + _MainTex_ST.zw;
            float4 tex2DNode38 = tex2D( _MainTex, uv_MainTex );
            float3 ase_worldPos = i.worldPos;
            float3 ase_worldViewDir = normalize( UnityWorldSpaceViewDir( ase_worldPos ) );
            float3 ase_worldNormal = WorldNormalVector( i, float3( 0, 0, 1 ) );
            float fresnelNdotV52 = dot( ase_worldNormal, ase_worldViewDir );
            float fresnelNode52 = ( 0.0 + 1.0 * pow( 1.0 - fresnelNdotV52, _Fresnel ) );
            float2 uv_Mask = i.uv_texcoord * _Mask_ST.xy + _Mask_ST.zw;
            float temp_output_54_0 = ( tex2DNode38.r * fresnelNode52 * tex2D( _Mask, uv_Mask ).r );
            float fresnelNdotV63 = dot( ase_worldNormal, ase_worldViewDir );
            float fresnelNode63 = ( 0.0 + 1.0 * pow( 1.0 - fresnelNdotV63, _Power ) );
            o.Emission = ( _Color0 * ( ( tex2DNode38 * temp_output_54_0 ) + ( fresnelNode63 * tex2DNode38.r ) ) ).rgb;
            float3 temp_cast_1 = (_Shine).xxx;
            o.Specular = temp_cast_1;
            o.Alpha = temp_output_54_0;
        }
 
        ENDCG
        CGPROGRAM
        #pragma surface surf StandardSpecular alpha:fade keepalpha fullforwardshadows exclude_path:deferred 
 
        ENDCG
        Pass
        {
            Name "ShadowCaster"
            Tags{ "LightMode" = "ShadowCaster" }
            ZWrite On
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 3.0
            #pragma multi_compile_shadowcaster
            #pragma multi_compile UNITY_PASS_SHADOWCASTER
            #pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2
            #include "HLSLSupport.cginc"
            #if ( SHADER_API_D3D11 || SHADER_API_GLCORE || SHADER_API_GLES || SHADER_API_GLES3 || SHADER_API_METAL || SHADER_API_VULKAN )
                #define CAN_SKIP_VPOS
            #endif
            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            #include "UnityPBSLighting.cginc"
            sampler3D _DitherMaskLOD;
            struct v2f
            {
                V2F_SHADOW_CASTER;
                float2 customPack1 : TEXCOORD1;
                float4 tSpace0 : TEXCOORD2;
                float4 tSpace1 : TEXCOORD3;
                float4 tSpace2 : TEXCOORD4;
                UNITY_VERTEX_INPUT_INSTANCE_ID
                UNITY_VERTEX_OUTPUT_STEREO
            };
            v2f vert( appdata_full v )
            {
                v2f o;
                UNITY_SETUP_INSTANCE_ID( v );
                UNITY_INITIALIZE_OUTPUT( v2f, o );
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o );
                UNITY_TRANSFER_INSTANCE_ID( v, o );
                Input customInputData;
                float3 worldPos = mul( unity_ObjectToWorld, v.vertex ).xyz;
                half3 worldNormal = UnityObjectToWorldNormal( v.normal );
                half3 worldTangent = UnityObjectToWorldDir( v.tangent.xyz );
                half tangentSign = v.tangent.w * unity_WorldTransformParams.w;
                half3 worldBinormal = cross( worldNormal, worldTangent ) * tangentSign;
                o.tSpace0 = float4( worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x );
                o.tSpace1 = float4( worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y );
                o.tSpace2 = float4( worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z );
                o.customPack1.xy = customInputData.uv_texcoord;
                o.customPack1.xy = v.texcoord;
                TRANSFER_SHADOW_CASTER_NORMALOFFSET( o )
                return o;
            }
            half4 frag( v2f IN
            #if !defined( CAN_SKIP_VPOS )
            , UNITY_VPOS_TYPE vpos : VPOS
            #endif
            ) : SV_Target
            {
                UNITY_SETUP_INSTANCE_ID( IN );
                Input surfIN;
                UNITY_INITIALIZE_OUTPUT( Input, surfIN );
                surfIN.uv_texcoord = IN.customPack1.xy;
                float3 worldPos = float3( IN.tSpace0.w, IN.tSpace1.w, IN.tSpace2.w );
                half3 worldViewDir = normalize( UnityWorldSpaceViewDir( worldPos ) );
                surfIN.worldPos = worldPos;
                surfIN.worldNormal = float3( IN.tSpace0.z, IN.tSpace1.z, IN.tSpace2.z );
                surfIN.internalSurfaceTtoW0 = IN.tSpace0.xyz;
                surfIN.internalSurfaceTtoW1 = IN.tSpace1.xyz;
                surfIN.internalSurfaceTtoW2 = IN.tSpace2.xyz;
                SurfaceOutputStandardSpecular o;
                UNITY_INITIALIZE_OUTPUT( SurfaceOutputStandardSpecular, o )
                surf( surfIN, o );
                #if defined( CAN_SKIP_VPOS )
                float2 vpos = IN.pos;
                #endif
                half alphaRef = tex3D( _DitherMaskLOD, float3( vpos.xy * 0.25, o.Alpha * 0.9375 ) ).a;
                clip( alphaRef - 0.01 );
                SHADOW_CASTER_FRAGMENT( IN )
            }
            ENDCG
        }
    }
    Fallback "Diffuse"
    CustomEditor "ASEMaterialInspector"
}