CTI_Internal-DeferredShading.shader 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. Shader "Hidden/CTI/Internal-DeferredShading" {
  2. Properties {
  3. _LightTexture0 ("", any) = "" {}
  4. _LightTextureB0 ("", 2D) = "" {}
  5. _ShadowMapTexture ("", any) = "" {}
  6. _SrcBlend ("", Float) = 1
  7. _DstBlend ("", Float) = 1
  8. }
  9. SubShader {
  10. // Pass 1: Lighting pass
  11. // LDR case - Lighting encoded into a subtractive ARGB8 buffer
  12. // HDR case - Lighting additively blended into floating point buffer
  13. Pass {
  14. ZWrite Off
  15. Blend [_SrcBlend] [_DstBlend]
  16. CGPROGRAM
  17. #pragma target 3.0
  18. #pragma vertex vert_deferred
  19. #pragma fragment frag
  20. #pragma multi_compile_lightpass
  21. #pragma multi_compile ___ UNITY_HDR_ON
  22. #pragma exclude_renderers nomrt
  23. #include "UnityCG.cginc"
  24. #include "UnityDeferredLibrary.cginc"
  25. #include "UnityPBSLighting.cginc"
  26. #include "UnityStandardUtils.cginc"
  27. #include "UnityStandardBRDF.cginc"
  28. sampler2D _CameraGBufferTexture0;
  29. sampler2D _CameraGBufferTexture1;
  30. sampler2D _CameraGBufferTexture2;
  31. half4 CalculateLight (unity_v2f_deferred i)
  32. {
  33. float3 wpos;
  34. float2 uv;
  35. float atten, fadeDist;
  36. UnityLight light;
  37. UNITY_INITIALIZE_OUTPUT(UnityLight, light);
  38. UnityDeferredCalculateLightParams (i, wpos, uv, light.dir, atten, fadeDist);
  39. half4 gbuffer0 = tex2D (_CameraGBufferTexture0, uv);
  40. half4 gbuffer1 = tex2D (_CameraGBufferTexture1, uv);
  41. half4 gbuffer2 = tex2D (_CameraGBufferTexture2, uv);
  42. // Check for translucent material
  43. half TransMat = floor(gbuffer2.a * 3 + 0.5f) == 2 ? 1 : 0;
  44. light.color = _LightColor.rgb * atten;
  45. half3 baseColor = gbuffer0.rgb;
  46. // Rewrite specColor if needed
  47. half3 specColor = (TransMat == 1)? gbuffer1.rrr : gbuffer1.rgb;
  48. half oneMinusRoughness = gbuffer1.a;
  49. half3 normalWorld = gbuffer2.rgb * 2 - 1;
  50. normalWorld = normalize(normalWorld);
  51. float3 eyeVec = normalize(wpos-_WorldSpaceCameraPos);
  52. half oneMinusReflectivity = 1 - SpecularStrength(specColor.rgb);
  53. light.ndotl = LambertTerm(normalWorld, light.dir);
  54. UnityIndirect ind;
  55. UNITY_INITIALIZE_OUTPUT(UnityIndirect, ind);
  56. ind.diffuse = 0;
  57. ind.specular = 0;
  58. // Energy conserving wrapped around diffuse lighting / http://blog.stevemcauley.com/2011/12/03/energy-conserving-wrapped-diffuse/
  59. half wrap1 = 0.4;
  60. half NdotLDirect = saturate( ( dot(normalWorld, light.dir) + wrap1 ) / ( (1 + wrap1) * (1 + wrap1) ) );
  61. //light.ndotl = (gbuffer2.a == 0) ? wrappedNdotL1 : LambertTerm(normalWorld, light.dir); // As Unity 5.5. does not know light.ndotl anymore
  62. NdotLDirect = /*TransMat ? NdotLDirect :*/ saturate(dot(normalWorld, light.dir));
  63. half4 res = UNITY_BRDF_PBS (baseColor, specColor, oneMinusReflectivity, oneMinusRoughness, normalWorld, -eyeVec, light, ind);
  64. /* Deprecated
  65. // Thin Layer Translucency
  66. // Only using dotNL gives us more lively lighting beyond the shadow distance.
  67. half backlight = saturate( dot(-normalWorld, light.dir) + 0.2);
  68. half fresnel = (1.0 - backlight) * (1.0 - backlight);
  69. fresnel *= fresnel;
  70. //#if defined (DIRECTIONAL) || defined (DIRECTIONAL_COOKIE)
  71. res.rgb += baseColor * backlight * (1.0 - fresnel) * 4.0f * gbuffer1.b * light.color * TransMat;
  72. */
  73. UNITY_BRANCH
  74. if(TransMat * gbuffer1.b) {
  75. half transPower = gbuffer1.g * 10.0f;
  76. half3 transLightDir = light.dir + normalWorld * 0.01;
  77. half transDot = dot( transLightDir, eyeVec ); // sign(minus) comes from eyeVec
  78. transDot = exp2(saturate(transDot) * transPower - transPower);
  79. half3 lightScattering = transDot * light.color * (1.0 - saturate(dot(normalWorld, light.dir)) );
  80. res.rgb += baseColor * 4.0 * gbuffer1.b * lightScattering;
  81. }
  82. return res;
  83. }
  84. #ifdef UNITY_HDR_ON
  85. half4
  86. #else
  87. fixed4
  88. #endif
  89. frag (unity_v2f_deferred i) : SV_Target
  90. {
  91. half4 c = CalculateLight(i);
  92. #ifdef UNITY_HDR_ON
  93. return c;
  94. #else
  95. return exp2(-c);
  96. #endif
  97. }
  98. ENDCG
  99. }
  100. // Pass 2: Final decode pass.
  101. // Used only with HDR off, to decode the logarithmic buffer into the main RT
  102. Pass {
  103. ZTest Always Cull Off ZWrite Off
  104. Stencil {
  105. ref [_StencilNonBackground]
  106. readmask [_StencilNonBackground]
  107. // Normally just comp would be sufficient, but there's a bug and only front face stencil state is set (case 583207)
  108. compback equal
  109. compfront equal
  110. }
  111. CGPROGRAM
  112. #pragma target 3.0
  113. #pragma vertex vert
  114. #pragma fragment frag
  115. #pragma exclude_renderers nomrt
  116. sampler2D _LightBuffer;
  117. struct v2f {
  118. float4 vertex : SV_POSITION;
  119. float2 texcoord : TEXCOORD0;
  120. };
  121. v2f vert (float4 vertex : POSITION, float2 texcoord : TEXCOORD0)
  122. {
  123. v2f o;
  124. o.vertex = UnityObjectToClipPos(vertex);
  125. o.texcoord = texcoord.xy;
  126. #ifdef UNITY_SINGLE_PASS_STEREO
  127. o.texcoord = TransformStereoScreenSpaceTex(o.texcoord, 1.0f);
  128. #endif
  129. return o;
  130. }
  131. fixed4 frag (v2f i) : SV_Target
  132. {
  133. return -log2(tex2D(_LightBuffer, i.texcoord));
  134. }
  135. ENDCG
  136. }
  137. }
  138. Fallback Off
  139. }