EnviroVolumetricCloudsBlend.shader 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. Shader "Hidden/EnviroVolumetricCloudsBlend"
  2. {
  3. Properties
  4. {
  5. //_MainTex ("Texture", any) = "white" {}
  6. }
  7. SubShader
  8. {
  9. Tags { "RenderType"="Opaque" }
  10. LOD 100
  11. Pass
  12. {
  13. Cull Off ZWrite Off ZTest Always
  14. CGPROGRAM
  15. #pragma vertex vert
  16. #pragma fragment frag
  17. #pragma multi_compile __ ENVIRO_DEPTH_BLENDING
  18. #pragma multi_compile __ ENVIROURP
  19. #pragma multi_compile __ UNITY_COLORSPACE_GAMMA
  20. #include "UnityCG.cginc"
  21. //#include "../Includes/SkyInclude.cginc"
  22. #include "../Includes/FogInclude.cginc"
  23. UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
  24. #ifdef STEREO_INSTANCING_ON
  25. UNITY_DECLARE_TEX2DARRAY (_CloudTex);
  26. #else
  27. UNITY_DECLARE_TEX2D (_CloudTex);
  28. #endif
  29. UNITY_DECLARE_SCREENSPACE_TEXTURE(_DownsampledDepth);
  30. UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);
  31. float4 _CloudTex_TexelSize;
  32. float4 _MainTex_TexelSize;
  33. SamplerState Point_Clamp_Sampler;
  34. float4 _ProjectionExtents;
  35. float4 _ProjectionExtentsRight;
  36. float3 _AmbientColor;
  37. float3 _DirectLightColor;
  38. float _AtmosphereColorSaturateDistance;
  39. float4x4 _CamToWorld;
  40. struct appdata
  41. {
  42. float4 vertex : POSITION;
  43. float2 uv : TEXCOORD0;
  44. UNITY_VERTEX_INPUT_INSTANCE_ID
  45. };
  46. struct v2f
  47. {
  48. float4 vertex : SV_POSITION;
  49. float2 uv : TEXCOORD0;
  50. float4 screenPos : TEXCOORD1;
  51. float2 vsray : TEXCOORD2;
  52. half3 pos : TEXCOORD3;
  53. #ifdef ENVIRO_DEPTH_BLENDING
  54. float2 uv00 : TEXCOORD4;
  55. float2 uv10 : TEXCOORD5;
  56. float2 uv01 : TEXCOORD6;
  57. float2 uv11 : TEXCOORD7;
  58. #endif
  59. UNITY_VERTEX_OUTPUT_STEREO
  60. };
  61. v2f vert(appdata_img v)
  62. {
  63. v2f o;
  64. UNITY_SETUP_INSTANCE_ID(v);
  65. UNITY_INITIALIZE_OUTPUT(v2f, o);
  66. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  67. o.pos = -v.vertex;
  68. #if defined(ENVIROURP)
  69. o.vertex = float4(v.vertex.xyz,1.0);
  70. #if UNITY_UV_STARTS_AT_TOP
  71. o.vertex.y *= -1;
  72. #endif
  73. #else
  74. o.vertex = UnityObjectToClipPos(v.vertex);
  75. #endif
  76. o.uv = v.texcoord;
  77. if(unity_StereoEyeIndex == 0)
  78. o.vsray = (2.0 * v.texcoord - 1.0) * _ProjectionExtents.xy + _ProjectionExtents.zw;
  79. else
  80. o.vsray = (2.0 * v.texcoord - 1.0) * _ProjectionExtentsRight.xy + _ProjectionExtentsRight.zw;
  81. o.screenPos = ComputeScreenPos(o.vertex);
  82. #ifdef ENVIRO_DEPTH_BLENDING
  83. o.uv00 = v.texcoord - 0.5 * _CloudTex_TexelSize.xy;
  84. o.uv10 = o.uv00 + float2(_CloudTex_TexelSize.x, 0.0);
  85. o.uv01 = o.uv00 + float2(0.0, _CloudTex_TexelSize.y);
  86. o.uv11 = o.uv00 + _CloudTex_TexelSize.xy;
  87. #endif
  88. return o;
  89. }
  90. #ifdef ENVIRO_DEPTH_BLENDING
  91. float4 Upsample(v2f i)
  92. {
  93. float4 lowResDepth = 0.0f;
  94. float highResDepth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture,UnityStereoTransformScreenSpaceTex(i.uv)));
  95. lowResDepth.x = LinearEyeDepth(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_DownsampledDepth,UnityStereoTransformScreenSpaceTex(i.uv00)).r);
  96. lowResDepth.y = LinearEyeDepth(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_DownsampledDepth,UnityStereoTransformScreenSpaceTex(i.uv10)).r);
  97. lowResDepth.z = LinearEyeDepth(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_DownsampledDepth,UnityStereoTransformScreenSpaceTex(i.uv01)).r);
  98. lowResDepth.w = LinearEyeDepth(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_DownsampledDepth,UnityStereoTransformScreenSpaceTex(i.uv11)).r);
  99. float4 depthDiff = abs(lowResDepth - highResDepth);
  100. float accumDiff = dot(depthDiff, float4(1, 1, 1, 1));
  101. [branch]
  102. if (accumDiff < 1.5f)
  103. {
  104. #ifdef STEREO_INSTANCING_ON
  105. float3 uv = float3(UnityStereoTransformScreenSpaceTex(i.uv),unity_StereoEyeIndex);
  106. return _CloudTex.Sample(sampler_CloudTex, uv);
  107. #else
  108. return _CloudTex.Sample(sampler_CloudTex, UnityStereoTransformScreenSpaceTex(i.uv));
  109. #endif
  110. }
  111. else
  112. {
  113. float minDepthDiff = depthDiff[0];
  114. float2 nearestUv = i.uv00;
  115. if (depthDiff[1] < minDepthDiff)
  116. {
  117. nearestUv = i.uv10;
  118. minDepthDiff = depthDiff[1];
  119. }
  120. if (depthDiff[2] < minDepthDiff)
  121. {
  122. nearestUv = i.uv01;
  123. minDepthDiff = depthDiff[2];
  124. }
  125. if (depthDiff[3] < minDepthDiff)
  126. {
  127. nearestUv = i.uv11;
  128. minDepthDiff = depthDiff[3];
  129. }
  130. #ifdef STEREO_INSTANCING_ON
  131. float3 uv = float3(UnityStereoTransformScreenSpaceTex(nearestUv),unity_StereoEyeIndex);
  132. return _CloudTex.Sample(Point_Clamp_Sampler, uv);
  133. #else
  134. return _CloudTex.Sample(Point_Clamp_Sampler, UnityStereoTransformScreenSpaceTex(nearestUv));
  135. #endif
  136. }
  137. }
  138. #endif
  139. half4 frag(v2f i) : SV_Target
  140. {
  141. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
  142. float4 vspos = float4(i.vsray, 1.0, 1.0);
  143. float4 worldPos = mul(_CamToWorld,vspos);
  144. float3 viewDir = normalize(worldPos.xyz - _WorldSpaceCameraPos);
  145. float4 sourceColor = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex,UnityStereoTransformScreenSpaceTex(i.uv));
  146. #ifdef ENVIRO_DEPTH_BLENDING
  147. float4 cloudsColor = Upsample(i);
  148. #else
  149. #ifdef STEREO_INSTANCING_ON
  150. float3 uv = float3(UnityStereoTransformScreenSpaceTex(i.uv),unity_StereoEyeIndex);
  151. float4 cloudsColor = _CloudTex.Sample(sampler_CloudTex, uv);
  152. #else
  153. float4 cloudsColor = _CloudTex.Sample(sampler_CloudTex, UnityStereoTransformScreenSpaceTex(i.uv));
  154. #endif
  155. #endif
  156. float3 sunColor = pow(_DirectLightColor.rgb,2) * 2.0f;
  157. float3 skyColor = GetSkyColor(viewDir,0.005f);
  158. //float3 ambient = lerp(_AmbientColor,skyColor,0);
  159. float4 finalColor = float4(cloudsColor.r * sunColor + _AmbientColor, cloudsColor.a);
  160. //finalColor.rgb = lerp(skyColor, finalColor.rgb, 0.75);
  161. // float4 volumeFog = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_EnviroVolumetricFogTex, i.uv);
  162. // skyColor.rgb *= volumeFog.rgb;
  163. //float cameraRemap = Remap(_WorldSpaceCameraPos.y - 2000,-2000,2000,0,1);
  164. float atmosphericBlendFactor = saturate(exp(-cloudsColor.g / _AtmosphereColorSaturateDistance));
  165. //if(_WorldSpaceCameraPos.y <= 2000)
  166. finalColor.rgb = lerp(skyColor, finalColor.rgb, atmosphericBlendFactor);
  167. #if defined(UNITY_COLORSPACE_GAMMA)
  168. finalColor.rgb = LinearToGammaSpace(finalColor.rgb);
  169. #endif
  170. #if ENVIRO_DEPTH_BLENDING
  171. float4 final = float4(sourceColor.rgb * (1 - finalColor.a) + finalColor.rgb * finalColor.a, 1);
  172. return final;
  173. #else
  174. float4 final = sourceColor;
  175. float sceneDepth = Linear01Depth( SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoTransformScreenSpaceTex(i.uv)));
  176. if (sceneDepth == 1.0f)
  177. final = half4(sourceColor.rgb * saturate(1 - finalColor.a) + finalColor.rgb * finalColor.a, 1);
  178. return final;
  179. #endif
  180. }
  181. ENDCG
  182. }
  183. }
  184. }