EnviroSkybox.shader 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. Shader "Enviro/Skybox"
  2. {
  3. Properties
  4. {
  5. _MoonTex("Moon Tex", 2D) = "black" {}
  6. _MoonGlowTex("Moon Glow Tex", 2D) = "black" {}
  7. _SunTex("Sun Tex", 2D) = "black" {}
  8. _StarsTex ("Stars Tex", Cube) = "black" {}
  9. _GalaxyTex ("Galaxy Tex", Cube) = "black" {}
  10. }
  11. SubShader
  12. {
  13. Lod 300
  14. Tags { "Queue"="Background" "RenderType"="Background" "PreviewType"="Skybox" "IgnoreProjector"="True" }
  15. Pass
  16. {
  17. Cull Back
  18. ZWrite Off
  19. CGPROGRAM
  20. #pragma vertex vert
  21. #pragma fragment frag
  22. #include "UnityCG.cginc"
  23. #include "../Includes/SkyInclude.cginc"
  24. #pragma target 3.0
  25. #pragma multi_compile __ UNITY_COLORSPACE_GAMMA
  26. //#pragma multi_compile_fog
  27. uniform float4 _SkyMoonParameters;
  28. uniform float4 _SkySunParameters;
  29. uniform sampler2D _MoonTex;
  30. //uniform sampler2D _MoonGlowTex;
  31. uniform sampler2D _SunTex;
  32. uniform float4 _MoonColor;
  33. uniform float _MoonGlowIntensity;
  34. uniform float _StarIntensity;
  35. uniform float _GalaxyIntensity;
  36. uniform float _CirrusClouds;
  37. uniform float _FlatClouds;
  38. uniform float _Aurora;
  39. uniform samplerCUBE _StarsTex;
  40. uniform samplerCUBE _GalaxyTex;
  41. uniform float4x4 _StarsMatrix;
  42. struct VertexInput
  43. {
  44. float4 vertex : POSITION;
  45. float3 texcoord : TEXCOORD0;
  46. float3 worldPos : TEXCOORD1;
  47. UNITY_VERTEX_INPUT_INSTANCE_ID
  48. };
  49. struct v2f {
  50. float4 position : POSITION;
  51. float4 sunAndMoonPos : TEXCOORD1;
  52. float3 starPos : TEXCOORD2;
  53. //float2 moonGlowPos : TEXCOORD3;
  54. float3 texcoord : TEXCOORD3;
  55. float3 cirrusCoords : TEXCOORD4;
  56. float3 flatCoords : TEXCOORD5;
  57. float3 worldPos : TEXCOORD6;
  58. UNITY_VERTEX_OUTPUT_STEREO
  59. };
  60. v2f vert(VertexInput v) {
  61. v2f o;
  62. UNITY_SETUP_INSTANCE_ID(v);
  63. UNITY_INITIALIZE_OUTPUT(v2f, o);
  64. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  65. o.position = UnityObjectToClipPos(v.vertex);
  66. float3 rSun = normalize(cross(_SunDir.xyz, float3(0, -1, 0)));
  67. float3 uSun = cross(_SunDir.xyz, rSun);
  68. float3 rMoon = normalize(cross(_MoonDir.xyz, float3(0, -1, 0)));
  69. float3 uMoon = cross(_MoonDir.xyz, rMoon);
  70. o.sunAndMoonPos.xy = float2(dot(rSun, v.vertex.xyz), dot(uSun, v.vertex.xyz)) * (21.0 - _SkySunParameters.x) + 0.5;
  71. o.sunAndMoonPos.zw = float2(dot(rMoon, v.vertex.xyz), dot(uMoon, v.vertex.xyz)) * (20.7 - _SkyMoonParameters.z) + 0.5;
  72. //o.moonGlowPos.xy = float2(dot(rMoon, v.vertex.xyz), dot(uMoon, v.vertex.xyz)) * (21.0 - (_SkyMoonParameters.y)) + 0.5;
  73. o.starPos = mul((float3x3)_StarsMatrix,v.vertex.xyz);
  74. o.texcoord = v.texcoord;
  75. o.worldPos = mul( unity_ObjectToWorld, v.vertex ).xyz;
  76. if(_CirrusClouds > 0.0)
  77. {
  78. o.cirrusCoords = normalize(v.vertex).xyz;
  79. float3 cirrusCoords = normalize(o.cirrusCoords + float3(0,1,0));
  80. o.cirrusCoords.y *= 1 - dot(cirrusCoords.y + 10, float3(0,-0.15,0));
  81. }
  82. if(_FlatClouds > 0.0)
  83. {
  84. o.flatCoords = normalize(v.vertex).xyz;
  85. float3 flatCoords = normalize(o.flatCoords + float3(0,1,0));
  86. o.flatCoords.y *= 1 - dot(flatCoords.y + 200, float3(0,-0.1,0));
  87. }
  88. return o;
  89. }
  90. float MoonPhaseFactor(float2 uv, float phase)
  91. {
  92. float alpha = 1.0;
  93. float srefx = uv.x - 0.5;
  94. float refx = abs(uv.x - 0.5);
  95. if (phase > 0)
  96. {
  97. srefx = (1 - uv.x) - 0.5;
  98. refx = abs((1 - uv.x) - 0.5);
  99. }
  100. phase = abs(_SkyMoonParameters.x);
  101. float refy = abs(uv.y - 0.5);
  102. float refxfory = sqrt(0.25 - refy * refy);
  103. float xmin = -refxfory;
  104. float xmax = refxfory;
  105. float xmin1 = (xmax - xmin) * (phase / 2) + xmin;
  106. float xmin2 = (xmax - xmin) * phase + xmin;
  107. if (srefx < xmin1)
  108. {
  109. alpha = 0;
  110. }
  111. else if (srefx < xmin2 && xmin1 != xmin2)
  112. {
  113. alpha = (srefx - xmin1) / (xmin2 - xmin1);
  114. }
  115. return alpha;
  116. }
  117. float3 ScreenSpaceDither(float2 vScreenPos, float3 clr)
  118. {
  119. float _DitheringIntensity = 0.05;
  120. float d = dot(float2(131.0, 312.0), vScreenPos.xy + _Time.y);
  121. float3 vDither = float3(d, d, d);
  122. vDither.rgb = frac(vDither.rgb / float3(103.0, 71.0, 97.0)) - float3(0.5, 0.5, 0.5);
  123. return (vDither.rgb / 15.0) * _DitheringIntensity;
  124. }
  125. float4 frag(v2f i) : COLOR
  126. {
  127. float4 skyColor = float4(0, 0, 0, 1);
  128. float3 viewDir = normalize(i.texcoord);
  129. skyColor = GetSkyColor(viewDir, 0.005f);
  130. //Stars
  131. float4 starsTex = texCUBE(_StarsTex, i.starPos.xyz) * saturate(viewDir.y);
  132. float4 stars = starsTex * _StarIntensity;
  133. //skyColor += stars;
  134. //Galaxy
  135. float4 galaxyTex = texCUBE(_GalaxyTex, i.starPos.xyz) * saturate(viewDir.y);
  136. float4 galaxy = galaxyTex * _GalaxyIntensity;
  137. //skyColor += galaxy;
  138. //Sun
  139. float4 sun = float4(0,0,0,1);
  140. float hideBackSun = saturate(dot(_SunDir.xyz, viewDir));
  141. float4 sunDisk = tex2D(_SunTex, i.sunAndMoonPos.xy) * hideBackSun;
  142. sun = sunDisk * _SunColor * 10;
  143. skyColor += sun;
  144. //Moon
  145. if(_SkyMoonParameters.w > 0.0)
  146. {
  147. float hideBackMoon = saturate(dot(-_MoonDir.xyz, viewDir));
  148. float4 moon = tex2D(_MoonTex, i.sunAndMoonPos.zw) * hideBackMoon;
  149. float alpha = MoonPhaseFactor(i.sunAndMoonPos.zw, _SkyMoonParameters.x);
  150. float3 moonArea = clamp(moon * 10, 0, 1);
  151. float starsBehindMoon = 1 - clamp((moonArea * 5), 0, 1);
  152. moon = lerp(float4(0, 0, 0, 0), moon, alpha);
  153. moon = moon * _MoonColor;
  154. //float4 moonGlow = tex2D(_MoonGlowTex, i.moonGlowPos.xy) * hideBackMoon;
  155. //moonGlow = moonGlow * _MoonColor * _MoonGlowIntensity;
  156. skyColor += stars * starsBehindMoon;
  157. skyColor += galaxy * starsBehindMoon;
  158. skyColor += moon;
  159. }
  160. else
  161. {
  162. skyColor += stars;
  163. skyColor += galaxy;
  164. }
  165. //Aurora
  166. if(_Aurora > 0.0)
  167. {
  168. float4 aurora = Aurora(i.worldPos);
  169. skyColor.rgb += aurora.rgb;
  170. }
  171. //Dithering
  172. skyColor.rgb += ScreenSpaceDither(i.position.xy,skyColor.rgb);
  173. //Cirrus
  174. if(_CirrusClouds > 0.0)
  175. {
  176. float4 cirrus = CirrusClouds(i.cirrusCoords);
  177. skyColor.rgb = skyColor.rgb * (1 - cirrus.a) + cirrus.rgb * cirrus.a;
  178. }
  179. //2D Clouds
  180. if(_FlatClouds > 0.0)
  181. {
  182. float4 clouds = Clouds2D(i.flatCoords, i.worldPos);
  183. skyColor.rgb = skyColor.rgb * (1 - clouds.a) + clouds.rgb * clouds.a;
  184. }
  185. #if defined(UNITY_COLORSPACE_GAMMA)
  186. skyColor.rgb = LinearToGammaSpace(skyColor.rgb);
  187. #endif
  188. return skyColor;
  189. }
  190. ENDCG
  191. }
  192. }
  193. FallBack "None"
  194. }