diff --git a/Assets/Shaders/DitheredParticles.shader b/Assets/Shaders/DitheredParticles.shader index d8389ebbe..6a6893ed0 100644 --- a/Assets/Shaders/DitheredParticles.shader +++ b/Assets/Shaders/DitheredParticles.shader @@ -54,6 +54,33 @@ Shader "Aetheria/Dithered Particles" ditherClip(screenUV + i.ditherOffset, c.a); return c; } + + // The particle in the G-buffer: black, unreflective, emissive, so deferred lighting adds nothing and its depth is in the + // depth texture the nebula march fogs by. A forward pass draws after that texture is taken, so the fog paints over it. + struct GBufferOut + { + half4 albedo : SV_Target0; + half4 specular : SV_Target1; + half4 normal : SV_Target2; + half4 emission : SV_Target3; + }; + + GBufferOut frag_deferred(v2f i) + { + float4 c = tex2D(_MainTex, i.texcoord) * _Color * i.color; + float2 screenUV = i.screenPos.xy / i.screenPos.w; + ditherClip(screenUV + i.ditherOffset, c.a); + GBufferOut o; + o.albedo = 0; + o.specular = 0; + o.normal = half4(.5, 1, .5, 1); + float3 light = c.rgb; + #ifndef UNITY_HDR_ON + light = exp2(-light); + #endif + o.emission = half4(light, 1); + return o; + } float4 frag_shadow(v2f i) : COLOR { @@ -71,12 +98,23 @@ Shader "Aetheria/Dithered Particles" Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" } Pass { + Tags { "LightMode" = "ForwardBase" } CGPROGRAM #pragma vertex vert #pragma fragment frag ENDCG } Pass + { + Name "DEFERRED" + Tags { "LightMode" = "Deferred" } + CGPROGRAM + #pragma vertex vert + #pragma fragment frag_deferred + #pragma multi_compile ___ UNITY_HDR_ON + ENDCG + } + Pass { Name "ShadowCaster" Tags { "LightMode" = "ShadowCaster" }