SkyIncludeHLSL.hlsl 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. uniform float4 _SunDir;
  2. uniform float4 _MoonDir;
  3. uniform float4 _SunColor;
  4. uniform half4 _FrontColor0;
  5. uniform half4 _FrontColor1;
  6. uniform half4 _FrontColor2;
  7. uniform half4 _FrontColor3;
  8. uniform half4 _FrontColor4;
  9. uniform half4 _FrontColor5;
  10. uniform half4 _FrontColor6;
  11. uniform half4 _BackColor0;
  12. uniform half4 _BackColor1;
  13. uniform half4 _BackColor2;
  14. uniform half4 _BackColor3;
  15. uniform half4 _BackColor4;
  16. uniform half4 _BackColor5;
  17. uniform half4 _BackColor6;
  18. uniform float _frontBackDistribution0;
  19. uniform float _frontBackDistribution1;
  20. uniform float _frontBackDistribution2;
  21. uniform float _frontBackDistribution3;
  22. uniform float _frontBackDistribution4;
  23. uniform float _Intensity;
  24. uniform float _MieScatteringIntensity;
  25. float Mie(float costh, float g)
  26. {
  27. g = min(g, 0.9381);
  28. float k = 1.55 * g - 0.55 * g * g * g;
  29. float kcosth = k * costh;
  30. return (1 - k * k) / ((4 * 3.14159265f) * (1 - kcosth) * (1 - kcosth));
  31. }
  32. float Remap(float org_val, float org_min, float org_max, float new_min, float new_max)
  33. {
  34. return new_min + saturate(((org_val - org_min) / (org_max - org_min))*(new_max - new_min));
  35. }
  36. //Cirrus Clouds
  37. uniform sampler2D _CirrusCloudMap;
  38. uniform float _CirrusCloudAlpha;
  39. uniform float _CirrusCloudCoverage;
  40. uniform float _CirrusCloudAltitude;
  41. uniform float4 _CirrusCloudColor;
  42. uniform float _CirrusCloudColorPower;
  43. uniform float2 _CirrusCloudAnimation;
  44. float4 CirrusClouds(float3 uvs)
  45. {
  46. uvs = normalize(uvs);
  47. float4 uv1;
  48. float4 uv2;
  49. uv1.xy = (uvs.xz * 0.2) + _CirrusCloudAnimation;
  50. uv2.xy = (uvs.xz * 0.6) + _CirrusCloudAnimation;
  51. float4 clouds1 = tex2D(_CirrusCloudMap, uv1.xy);
  52. float4 clouds2 = tex2D(_CirrusCloudMap, uv2.xy);
  53. float color1 = pow(clouds1.g + clouds2.g, 0.1);
  54. float color2 = pow(clouds2.b * clouds1.r, 0.2);
  55. float4 finalClouds = lerp(clouds1, clouds2, color1 * color2);
  56. float cloudExtinction = pow(uvs.y , 2);
  57. finalClouds.a *= _CirrusCloudAlpha;
  58. finalClouds.a *= cloudExtinction;
  59. if (uvs.y < 0)
  60. finalClouds.a = 0;
  61. finalClouds.rgb = finalClouds.a * pow(_CirrusCloudColor,_CirrusCloudColorPower);
  62. finalClouds.rgb = pow(finalClouds.rgb,1 - _CirrusCloudCoverage);
  63. return finalClouds;
  64. }
  65. //2D Clouds
  66. uniform sampler2D _FlatCloudsBaseTexture;
  67. uniform sampler2D _FlatCloudsDetailTexture;
  68. uniform float4 _FlatCloudsAnimation;
  69. uniform float3 _FlatCloudsLightDirection;
  70. uniform float3 _FlatCloudsLightColor;
  71. uniform float3 _FlatCloudsAmbientColor;
  72. uniform float4 _FlatCloudsLightingParams; // x = LightIntensity, y = AmbientIntensity, z = Absorbtion, w = HgPhase
  73. uniform float4 _FlatCloudsParams; // x = Coverage, y = Density, z = Altitude, w = tonemapping
  74. uniform float4 _FlatCloudsTiling; // x = Base, y = Detail
  75. //uniform float _FlatCloudsExposure;
  76. float HenryGreenstein(float cosTheta, float g)
  77. {
  78. float k = 3.0 / (8.0 * 3.1415926f) * (1.0 - g * g) / (2.0 + g * g);
  79. return k * (1.0 + cosTheta * cosTheta) / pow(abs(1.0 + g * g - 2.0 * g * cosTheta), 1.5);
  80. }
  81. half3 tonemapACES(half3 color, float Exposure)
  82. {
  83. color *= Exposure;
  84. // See https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/
  85. const half a = 2.51;
  86. const half b = 0.03;
  87. const half c = 2.43;
  88. const half d = 0.59;
  89. const half e = 0.14;
  90. return saturate((color * (a * color + b)) / (color * (c * color + d) + e));
  91. }
  92. float CalculateCloudDensity(float2 posBase, float2 posDetail,float3 worldPos, float coverage)
  93. {
  94. float4 baseNoise = tex2D(_FlatCloudsBaseTexture, posBase);
  95. float low_freq_fBm = (baseNoise.g * 0.625) + (baseNoise.b * 0.25) + (baseNoise.a * 0.125);
  96. float base_cloud = Remap(baseNoise.r, -(1.0 - low_freq_fBm), 1.0, 0.0, 1.0) * coverage;
  97. float4 detailNoise = tex2D(_FlatCloudsDetailTexture, posDetail * 2);
  98. float high_freq_fBm = (detailNoise.r * 0.625) + (detailNoise.g * 0.25) + (detailNoise.b * 0.125);
  99. float density = Remap(base_cloud, 1-high_freq_fBm * 0.5, 1.0, 0.0, 1.0);
  100. density *= pow(high_freq_fBm, 0.4);
  101. density *= _FlatCloudsParams.y;
  102. return density;
  103. }
  104. float4 Clouds2D (float3 uvs, float3 worldPos)
  105. {
  106. half4 col = 0;
  107. uvs = normalize(uvs);
  108. float4 uv1;
  109. uv1.xy = (uvs.xz * _FlatCloudsTiling.x) + _FlatCloudsAnimation.xy;
  110. uv1.zw = (uvs.xz * _FlatCloudsTiling.y) + _FlatCloudsAnimation.zw;
  111. float cloudExtinction = pow(uvs.y, 2);
  112. float density = CalculateCloudDensity(uv1.xy, uv1.zw, uvs, _FlatCloudsParams.x);
  113. //Lighting
  114. float absorbtion = exp2(-1 * (density * _FlatCloudsLightingParams.z));
  115. float3 viewDir = normalize(worldPos - _WorldSpaceCameraPos);
  116. float inscatterAngle = dot(normalize(_FlatCloudsLightDirection), -viewDir);
  117. float hg = HenryGreenstein(inscatterAngle, _FlatCloudsLightingParams.w) * 2 * absorbtion;
  118. float lighting = density * (absorbtion + hg);
  119. float3 lightColor = pow(_FlatCloudsLightColor, 2) * (_FlatCloudsLightingParams.x );
  120. col.rgb = lightColor * lighting;
  121. col.rgb = col.rgb + (_FlatCloudsAmbientColor * _FlatCloudsLightingParams.y);
  122. //Tonemapping
  123. // if (_FlatCloudsParams.w == 1)
  124. // col.rgb = tonemapACES(col.rgb, _CloudsExposure);
  125. col.a = saturate(density * cloudExtinction);
  126. if (uvs.y < 0)
  127. col.a = 0;
  128. return col;
  129. }
  130. float4 GetSkyColor (float3 viewDir, float mieSize)
  131. {
  132. float cosTheta = smoothstep(-0.25,1.15,saturate(dot(-_SunDir.xyz, viewDir)));
  133. half y = -viewDir.y / 0.02;
  134. float3 frontBack0 = lerp(_FrontColor0.rgb,_BackColor0.rgb,cosTheta);
  135. float3 frontBack1 = lerp(_FrontColor1.rgb,_BackColor1.rgb,cosTheta);
  136. float3 frontBack2 = lerp(_FrontColor2.rgb,_BackColor2.rgb,cosTheta);
  137. float3 frontBack3 = lerp(_FrontColor3.rgb,_BackColor3.rgb,cosTheta);
  138. float3 frontBack4 = lerp(_FrontColor4.rgb,_BackColor4.rgb,cosTheta);
  139. float3 frontBack5 = lerp(_FrontColor5.rgb,_BackColor5.rgb,cosTheta);
  140. float heightS1 = Remap(viewDir.y,-0.75,_frontBackDistribution0,0,1);
  141. float heightS2 = Remap(viewDir.y,_frontBackDistribution0,_frontBackDistribution1,0,1);
  142. float heightS3 = Remap(viewDir.y,_frontBackDistribution1,_frontBackDistribution2,0,1);
  143. float heightS4 = Remap(viewDir.y,_frontBackDistribution2,_frontBackDistribution3,0,1);
  144. float heightS5 = Remap(viewDir.y,_frontBackDistribution3,1,0,1);
  145. float3 sky1 = lerp(frontBack0.rgb,frontBack1.rgb,heightS1);
  146. float3 sky2 = lerp(sky1.rgb,frontBack2.rgb,heightS2);
  147. float3 sky3 = lerp(sky2.rgb,frontBack3.rgb,heightS3);
  148. float3 sky4 = lerp(sky3.rgb,frontBack4.rgb,heightS4);
  149. float3 sky5 = lerp(sky4.rgb,frontBack5.rgb,heightS5);
  150. float3 skyColor = sky5 * _Intensity;
  151. float eyeCos = dot(_SunDir, viewDir);
  152. float eyeCos2 = eyeCos * eyeCos;
  153. float fade = saturate(dot(_SunDir.xyz, viewDir));
  154. float mie = Mie(eyeCos, 0.7) * _MieScatteringIntensity * fade;
  155. skyColor.rgb += (mie * skyColor) * _SunColor.rgb;
  156. return float4(skyColor,1);
  157. }
  158. float4 GetSkyAndCloudsColor (float3 viewDir, float mieSize)
  159. {
  160. float cosTheta = smoothstep(-0.25,1.15,saturate(dot(-_SunDir.xyz, viewDir)));
  161. half y = -viewDir.y / 0.02;
  162. float3 frontBack0 = lerp(_FrontColor0.rgb,_BackColor0.rgb,cosTheta);
  163. float3 frontBack1 = lerp(_FrontColor1.rgb,_BackColor1.rgb,cosTheta);
  164. float3 frontBack2 = lerp(_FrontColor2.rgb,_BackColor2.rgb,cosTheta);
  165. float3 frontBack3 = lerp(_FrontColor3.rgb,_BackColor3.rgb,cosTheta);
  166. float3 frontBack4 = lerp(_FrontColor4.rgb,_BackColor4.rgb,cosTheta);
  167. float3 frontBack5 = lerp(_FrontColor5.rgb,_BackColor5.rgb,cosTheta);
  168. float heightS1 = Remap(viewDir.y,-0.75,_frontBackDistribution0,0,1);
  169. float heightS2 = Remap(viewDir.y,_frontBackDistribution0,_frontBackDistribution1,0,1);
  170. float heightS3 = Remap(viewDir.y,_frontBackDistribution1,_frontBackDistribution2,0,1);
  171. float heightS4 = Remap(viewDir.y,_frontBackDistribution2,_frontBackDistribution3,0,1);
  172. float heightS5 = Remap(viewDir.y,_frontBackDistribution3,1,0,1);
  173. float3 sky1 = lerp(frontBack0.rgb,frontBack1.rgb,heightS1);
  174. float3 sky2 = lerp(sky1.rgb,frontBack2.rgb,heightS2);
  175. float3 sky3 = lerp(sky2.rgb,frontBack3.rgb,heightS3);
  176. float3 sky4 = lerp(sky3.rgb,frontBack4.rgb,heightS4);
  177. float3 sky5 = lerp(sky4.rgb,frontBack5.rgb,heightS5);
  178. float3 skyColor = sky5 * _Intensity;
  179. float eyeCos = dot(_SunDir, viewDir);
  180. float eyeCos2 = eyeCos * eyeCos;
  181. float fade = saturate(dot(_SunDir.xyz, viewDir));
  182. float mie = Mie(eyeCos, 0.7) * _MieScatteringIntensity * fade;
  183. skyColor.rgb += (mie * skyColor) * _SunColor.rgb;
  184. float4 cirrus = CirrusClouds(viewDir);
  185. skyColor.rgb = skyColor.rgb * (1 - cirrus.a) + cirrus.rgb * cirrus.a;
  186. return float4(skyColor,1);
  187. }
  188. ///Aurora
  189. sampler2D _Aurora_Layer_1;
  190. sampler2D _Aurora_Layer_2;
  191. sampler2D _Aurora_Colorshift;
  192. float4 _AuroraColor;
  193. float _AuroraIntensity;
  194. float _AuroraBrightness;
  195. float _AuroraContrast;
  196. float _AuroraHeight;
  197. float _AuroraScale;
  198. float _AuroraSpeed;
  199. float _AuroraSteps;
  200. float4 _Aurora_Tiling_Layer1;
  201. float4 _Aurora_Tiling_Layer2;
  202. float4 _Aurora_Tiling_ColorShift;
  203. float randomNoise(float3 co)
  204. {
  205. return frac(sin(dot(co.xyz ,float3(17.2486,32.76149, 368.71564))) * 32168.47512);
  206. }
  207. float4 SampleAurora(float3 uv)
  208. {
  209. float2 uv_1 = uv.xy * _Aurora_Tiling_Layer1.xy + (_Aurora_Tiling_Layer1.zw * _AuroraSpeed * _Time.y);
  210. float4 aurora = tex2Dlod(_Aurora_Layer_1, float4(uv_1.xy,0,0));
  211. float2 uv_2 = uv_1 * _Aurora_Tiling_Layer2.xy + (_Aurora_Tiling_Layer2.zw * _AuroraSpeed * _Time.y);
  212. float4 aurora2 = tex2Dlod(_Aurora_Layer_2, float4(uv_2.xy,0,0));
  213. aurora += (aurora2 - 0.5) * 0.5;
  214. aurora.w = aurora.w * 0.8 + 0.05;
  215. float3 uv_3 = float3(uv.xy * _Aurora_Tiling_ColorShift.xy + (_Aurora_Tiling_ColorShift.zw * _AuroraSpeed * _Time.y), 0.0);
  216. float4 cloudColor = tex2Dlod(_Aurora_Colorshift, float4(uv_3.xy,0,0));
  217. float contrastMask = 1.0 - saturate(aurora.a);
  218. contrastMask = pow(contrastMask, _AuroraContrast);
  219. aurora.rgb *= lerp(float3(0,0,0), _AuroraColor.rgb * cloudColor.rgb * _AuroraBrightness, contrastMask);
  220. float cloudSub = 1.0 - uv.z;
  221. aurora.a = aurora.a - cloudSub * cloudSub;
  222. aurora.a = saturate(aurora.a * _AuroraIntensity);
  223. aurora.rgb *= aurora.a;
  224. return aurora;
  225. }
  226. float4 Aurora (float3 wpos)
  227. {
  228. if (_AuroraIntensity < 0.05)
  229. return float4(0,0,0,0);
  230. float3 viewDir = normalize(wpos);
  231. float viewFalloff = 1.0 - saturate(dot(viewDir, float3(0,1,0)));
  232. if (viewDir.y < 0 || viewDir.y > 1)
  233. return half4(0, 0, 0, 0);
  234. float3 traceDir = normalize(viewDir + float3(0, viewFalloff * 0.2 ,0));
  235. float3 worldPos = _WorldSpaceCameraPos + traceDir * ((_AuroraHeight - _WorldSpaceCameraPos.y) / max(traceDir.y, 0.01));
  236. float3 uv = float3(worldPos.xz * 0.01 * _AuroraScale, 0);
  237. half3 uvStep = half3(traceDir.xz * -1.0 * (1.0 / traceDir.y), 1.0) * (1.0 / _AuroraSteps);
  238. uv += uvStep * randomNoise(wpos + _SinTime.w);
  239. half4 finalColor = half4(0,0,0,0);
  240. [loop]
  241. for (int iCount = 0; iCount < _AuroraSteps; iCount++)
  242. {
  243. if (finalColor.a > 1)
  244. break;
  245. uv += uvStep;
  246. finalColor += SampleAurora(uv) * (1.0 - finalColor.a);
  247. }
  248. finalColor *= viewDir.y;
  249. return finalColor;
  250. }