EnviroApplyShadows.shader 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. Shader "Hidden/EnviroApplyShadows"
  2. {
  3. Properties
  4. {
  5. //_MainTex ("Texture", any) = "white" {}
  6. //_CloudsTex ("Texture", any) = "white" {}
  7. }
  8. SubShader
  9. {
  10. // No culling or depth
  11. Cull Off ZWrite Off ZTest Always
  12. Pass
  13. {
  14. CGPROGRAM
  15. #pragma vertex vert
  16. #pragma fragment frag
  17. #pragma multi_compile __ ENVIROURP
  18. #include "UnityCG.cginc"
  19. struct appdata
  20. {
  21. float4 vertex : POSITION;
  22. float2 uv : TEXCOORD0;
  23. UNITY_VERTEX_INPUT_INSTANCE_ID
  24. };
  25. struct v2f
  26. {
  27. float2 uv : TEXCOORD0;
  28. float4 vertex : SV_POSITION;
  29. UNITY_VERTEX_OUTPUT_STEREO
  30. };
  31. v2f vert (appdata v)
  32. {
  33. v2f o;
  34. UNITY_SETUP_INSTANCE_ID(v);
  35. UNITY_INITIALIZE_OUTPUT(v2f, o);
  36. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  37. #if defined(ENVIROURP)
  38. o.vertex = float4(v.vertex.xyz,1.0);
  39. #if UNITY_UV_STARTS_AT_TOP
  40. o.vertex.y *= -1;
  41. #endif
  42. #else
  43. o.vertex = UnityObjectToClipPos(v.vertex);
  44. #endif
  45. o.uv = v.uv;
  46. return o;
  47. }
  48. float _Intensity;
  49. //float4x4 _LeftWorldFromView;
  50. //float4x4 _RightWorldFromView;
  51. //float4x4 _LeftViewFromScreen;
  52. //float4x4 _RightViewFromScreen;
  53. UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
  54. UNITY_DECLARE_SCREENSPACE_TEXTURE(_CloudsTex);
  55. //UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);
  56. //UNITY_DECLARE_SHADOWMAP(_CascadeShadowMapTexture);
  57. /*float4 GetCascadeWeights_SplitSpheres(float3 wpos)
  58. {
  59. float3 fromCenter0 = wpos - unity_ShadowSplitSpheres[0].xyz;
  60. float3 fromCenter1 = wpos - unity_ShadowSplitSpheres[1].xyz;
  61. float3 fromCenter2 = wpos - unity_ShadowSplitSpheres[2].xyz;
  62. float3 fromCenter3 = wpos - unity_ShadowSplitSpheres[3].xyz;
  63. float4 distances2 = float4(dot(fromCenter0,fromCenter0), dot(fromCenter1,fromCenter1), dot(fromCenter2,fromCenter2), dot(fromCenter3,fromCenter3));
  64. float4 weights = float4(distances2 >= unity_ShadowSplitSqRadii);
  65. return weights;
  66. }
  67. float4 GetCascadeShadowCoord(float4 pos, float4 cascadeWeights)
  68. {
  69. return mul(unity_WorldToShadow[(int)dot(cascadeWeights, float4(1,1,1,1))], pos);
  70. }*/
  71. float4 frag (v2f i) : SV_Target
  72. {
  73. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
  74. float4 sceneColor = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex,i.uv);
  75. float cloudShadows = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CloudsTex,i.uv).b * _Intensity;
  76. //float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture,i.uv);
  77. //float linearDepth = LinearEyeDepth(depth);
  78. /*
  79. float4x4 proj, eyeToWorld;
  80. if (unity_StereoEyeIndex == 0)
  81. {
  82. proj = _LeftViewFromScreen;
  83. eyeToWorld = _LeftWorldFromView;
  84. }
  85. else
  86. {
  87. proj = _RightViewFromScreen;
  88. eyeToWorld = _RightWorldFromView;
  89. }
  90. //bit of matrix math to take the screen space coord (u,v,depth) and transform to world space
  91. float2 uvClip = i.uv * 2.0 - 1.0;
  92. float clipDepth = depth; // Fix for OpenGl Core thanks to Lars Bertram
  93. clipDepth = (UNITY_NEAR_CLIP_VALUE < 0) ? clipDepth * 2 - 1 : clipDepth;
  94. float4 clipPos = float4(uvClip, clipDepth, 1.0);
  95. float4 viewPos = mul(proj, clipPos); // inverse projection by clip position
  96. viewPos /= viewPos.w; // perspective division
  97. float3 wpos = mul(eyeToWorld, viewPos).xyz;
  98. float4 cascadeWeights = GetCascadeWeights_SplitSpheres(wpos);
  99. bool inside = dot(cascadeWeights, float4(1, 1, 1, 1)) < 4;
  100. float4 samplePos = GetCascadeShadowCoord(float4(wpos, 1), cascadeWeights);
  101. float sceneShadow = UNITY_SAMPLE_SHADOW(_CascadeShadowMapTexture, samplePos.xyz).r;
  102. float shadowsClouds = clamp((1-cloudShadows),0,1);
  103. //float shadowMod = clamp(sceneShadow,0,1);
  104. if(linearDepth > 0.99f)
  105. {
  106. //shadowsClouds = 1.0f;
  107. //shadowMod = 1.0f;
  108. }
  109. else
  110. {
  111. // shadowsClouds = cloudShadows * shadowMod;
  112. }
  113. shadowsClouds = cloudShadows * shadowMod;
  114. */
  115. float shadowsClouds = clamp((1-cloudShadows),0,1);
  116. float4 final = float4(sceneColor.rgb * shadowsClouds, sceneColor.a);
  117. return final;
  118. }
  119. ENDCG
  120. }
  121. }
  122. }