SHOW:
|
|
- or go back to the newest paste.
1 | Shader "Custom/Snow Interactive" { | |
2 | Properties{ | |
3 | [Header(Main)] | |
4 | _Noise("Snow Noise", 2D) = "gray" {} | |
5 | _NoiseScale("Noise Scale", Range(0,2)) = 0.1 | |
6 | _NoiseWeight("Noise Weight", Range(0,2)) = 0.1 | |
7 | [HDR]_ShadowColor("Shadow Color", Color) = (0.5,0.5,0.5,1) | |
8 | ||
9 | [Space] | |
10 | [Header(Tesselation)] | |
11 | _MaxTessDistance("Max Tessellation Distance", Range(10,100)) = 50 | |
12 | _Tess("Tessellation", Range(1,32)) = 20 | |
13 | ||
14 | [Space] | |
15 | [Header(Snow)] | |
16 | [HDR]_Color("Snow Color", Color) = (0.5,0.5,0.5,1) | |
17 | [HDR]_PathColorIn("Snow Path Color In", Color) = (0.5,0.5,0.7,1) | |
18 | [HDR]_PathColorOut("Snow Path Color Out", Color) = (0.5,0.5,0.7,1) | |
19 | _PathBlending("Snow Path Blending", Range(0,3)) = 0.3 | |
20 | _MainTex("Snow Texture", 2D) = "white" {} | |
21 | _SnowHeight("Snow Height", Range(0,2)) = 0.3 | |
22 | _SnowDepth("Snow Path Depth", Range(-2,2)) = 0.3 | |
23 | _SnowTextureOpacity("Snow Texture Opacity", Range(0,2)) = 0.3 | |
24 | _SnowTextureScale("Snow Texture Scale", Range(0,2)) = 0.3 | |
25 | ||
26 | [Space] | |
27 | [Header(Sparkles)] | |
28 | _SparkleScale("Sparkle Scale", Range(0,10)) = 10 | |
29 | _SparkCutoff("Sparkle Cutoff", Range(0,10)) = 0.8 | |
30 | _SparkleNoise("Sparkle Noise", 2D) = "gray" {} | |
31 | ||
32 | [Space] | |
33 | [Header(Rim)] | |
34 | _RimPower("Rim Power", Range(0,20)) = 20 | |
35 | [HDR]_RimColor("Rim Color Snow", Color) = (0.5,0.5,0.5,1) | |
36 | } | |
37 | HLSLINCLUDE | |
38 | ||
39 | // Includes | |
40 | #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" | |
41 | #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" | |
42 | #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl" | |
43 | #include "SnowTessellation.hlsl" | |
44 | #pragma vertex TessellationVertexProgram | |
45 | #pragma hull hull | |
46 | #pragma domain domain | |
47 | // Keywords | |
48 | ||
49 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN | |
50 | #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS | |
51 | #pragma multi_compile _ _SHADOWS_SOFT | |
52 | #pragma multi_compile_fog | |
53 | ||
54 | ||
55 | ControlPoint TessellationVertexProgram(Attributes v) | |
56 | { | |
57 | ControlPoint p; | |
58 | p.vertex = v.vertex; | |
59 | p.uv = v.uv; | |
60 | p.normal = v.normal; | |
61 | return p; | |
62 | } | |
63 | ENDHLSL | |
64 | ||
65 | SubShader{ | |
66 | Tags{ "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline"} | |
67 | ||
68 | Pass{ | |
69 | Tags { "LightMode" = "UniversalForward" } | |
70 | ||
71 | HLSLPROGRAM | |
72 | // vertex happens in snowtessellation.hlsl | |
73 | #pragma fragment frag | |
74 | #pragma target 4.0 | |
75 | ||
76 | ||
77 | sampler2D _MainTex, _SparkleNoise; | |
78 | float4 _Color, _RimColor; | |
79 | float _RimPower; | |
80 | float4 _PathColorIn, _PathColorOut; | |
81 | float _PathBlending; | |
82 | float _SparkleScale, _SparkCutoff; | |
83 | float _SnowTextureOpacity, _SnowTextureScale; | |
84 | float4 _ShadowColor; | |
85 | ||
86 | ||
87 | half4 frag(Varyings IN) : SV_Target{ | |
88 | ||
89 | // Effects RenderTexture Reading | |
90 | float3 worldPosition = mul(unity_ObjectToWorld, IN.vertex).xyz; | |
91 | float2 uv = IN.worldPos.xz - _Position.xz; | |
92 | uv /= (_OrthographicCamSize * 2); | |
93 | uv += 0.5; | |
94 | ||
95 | // effects texture | |
96 | float4 effect = tex2D(_GlobalEffectRT, uv); | |
97 | ||
98 | // mask to prevent bleeding | |
99 | effect *= smoothstep(0.99, 0.9, uv.x) * smoothstep(0.99, 0.9,1- uv.x); | |
100 | effect *= smoothstep(0.99, 0.9, uv.y) * smoothstep(0.99, 0.9,1- uv.y); | |
101 | ||
102 | // worldspace Noise texture | |
103 | float3 topdownNoise = tex2D(_Noise, IN.worldPos.xz * _NoiseScale).rgb; | |
104 | ||
105 | // worldspace Snow texture | |
106 | float3 snowtexture = tex2D(_MainTex, IN.worldPos.xz * _SnowTextureScale).rgb; | |
107 | ||
108 | //lerp between snow color and snow texture | |
109 | float3 snowTex = lerp(_Color.rgb,snowtexture * _Color.rgb, _SnowTextureOpacity); | |
110 | ||
111 | //lerp the colors using the RT effect path | |
112 | float3 path = lerp(_PathColorOut.rgb * effect.g, _PathColorIn.rgb, saturate(effect.g * _PathBlending)); | |
113 | float3 mainColors = lerp(snowTex,path, saturate(effect.g)); | |
114 | ||
115 | // lighting and shadow information | |
116 | float shadow = 0; | |
117 | half4 shadowCoord = TransformWorldToShadowCoord(IN.worldPos); | |
118 | ||
119 | #if _MAIN_LIGHT_SHADOWS_CASCADE || _MAIN_LIGHT_SHADOWS | |
120 | Light mainLight = GetMainLight(shadowCoord); | |
121 | shadow = mainLight.shadowAttenuation; | |
122 | #else | |
123 | Light mainLight = GetMainLight(); | |
124 | #endif | |
125 | ||
126 | // extra point lights support | |
127 | float3 extraLights; | |
128 | int pixelLightCount = GetAdditionalLightsCount(); | |
129 | for (int j = 0; j < pixelLightCount; ++j) { | |
130 | Light light = GetAdditionalLight(j, IN.worldPos, half4(1, 1, 1, 1)); | |
131 | float3 attenuatedLightColor = light.color * (light.distanceAttenuation * light.shadowAttenuation); | |
132 | extraLights += attenuatedLightColor; | |
133 | } | |
134 | ||
135 | float4 litMainColors = float4(mainColors,1) ; | |
136 | extraLights *= litMainColors.rgb; | |
137 | // add in the sparkles | |
138 | float sparklesStatic = tex2D(_SparkleNoise, IN.worldPos.xz * _SparkleScale).r; | |
139 | float cutoffSparkles = step(_SparkCutoff,sparklesStatic); | |
140 | litMainColors += cutoffSparkles *saturate(1- (effect.g * 2)) * 4; | |
141 | ||
142 | ||
143 | // add rim light | |
144 | half rim = 1.0 - dot((IN.viewDir), IN.normal) * topdownNoise; | |
145 | litMainColors += _RimColor * pow(abs(rim), _RimPower); | |
146 | ||
147 | // ambient and mainlight colors added | |
148 | half4 extraColors; | |
149 | extraColors.rgb = litMainColors.rgb * mainLight.color.rgb * (shadow + unity_AmbientSky.rgb); | |
150 | extraColors.a = 1; | |
151 | ||
152 | // colored shadows | |
153 | float3 coloredShadows = (shadow + (_ShadowColor.rgb * (1-shadow))); | |
154 | litMainColors.rgb = litMainColors.rgb * mainLight.color * (coloredShadows); | |
155 | // everything together | |
156 | float4 final = litMainColors+ extraColors + float4(extraLights,0); | |
157 | // add in fog | |
158 | final.rgb = MixFog(final.rgb, IN.fogFactor); | |
159 | return final; | |
160 | ||
161 | } | |
162 | ENDHLSL | |
163 | ||
164 | } | |
165 | ||
166 | // casting shadows is a little glitchy, I've turned it off, but maybe in future urp versions it works better? | |
167 | // Shadow Casting Pass | |
168 | // Pass | |
169 | // { | |
170 | // Name "ShadowCaster" | |
171 | // Tags { "LightMode" = "ShadowCaster" } | |
172 | // ZWrite On | |
173 | // ZTest LEqual | |
174 | // Cull Off | |
175 | ||
176 | // HLSLPROGRAM | |
177 | // #pragma target 3.0 | |
178 | ||
179 | // // Support all the various light ypes and shadow paths | |
180 | // #pragma multi_compile_shadowcaster | |
181 | ||
182 | // // Register our functions | |
183 | ||
184 | // #pragma fragment frag | |
185 | // // A custom keyword to modify logic during the shadow caster pass | |
186 | ||
187 | // half4 frag(Varyings IN) : SV_Target{ | |
188 | // return 0; | |
189 | // } | |
190 | ||
191 | // ENDHLSL | |
192 | // } | |
193 | } | |
194 | } |