DistantFog.shader 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. Shader "Hidden/VolumetricFog2/DistantFog"
  2. {
  3. Properties
  4. {
  5. [HideInInspector] _MainTex("Noise Texture", 2D) = "white" {}
  6. [HideInInspector] _Color("Color", Color) = (1,1,1)
  7. [HideInInspector] _DistantFogData("Distant Fog Data", Vector) = (100,0.1,400,0.5)
  8. [HideInInspector] _LightColor("Light Color", Color) = (1,1,1)
  9. [HideInInspector] _LightDiffusionPower("Sun Diffusion Power", Range(1, 64)) = 32
  10. [HideInInspector] _LightDiffusionIntensity("Sun Diffusion Intensity", Range(0, 1)) = 0.4
  11. [HideInInspector] _SunDir("Sun Direction", Vector) = (1,0,0)
  12. }
  13. SubShader
  14. {
  15. Tags { "RenderType" = "Transparent" "Queue" = "Transparent-1" "DisableBatching" = "True" "IgnoreProjector" = "True" "RenderPipeline" = "UniversalPipeline" }
  16. Blend SrcAlpha OneMinusSrcAlpha
  17. ZTest Always
  18. Cull Front
  19. ZWrite Off
  20. Pass
  21. {
  22. Tags { "LightMode" = "UniversalForward" }
  23. HLSLPROGRAM
  24. #pragma prefer_hlslcc gles
  25. #pragma exclude_renderers d3d11_9x
  26. #pragma target 3.0
  27. #pragma vertex vert
  28. #pragma fragment frag
  29. #include "CommonsURP.hlsl"
  30. #include "Primitives.cginc"
  31. #include "Raymarch2D.cginc"
  32. float4 _DistantFogData;
  33. #define START_DISTANCE _DistantFogData.x
  34. #define DISTANCE_DENSITY _DistantFogData.y
  35. #define MAX_HEIGHT _DistantFogData.z
  36. #define HEIGHT_DENSITY _DistantFogData.w
  37. struct appdata
  38. {
  39. float4 vertex : POSITION;
  40. UNITY_VERTEX_INPUT_INSTANCE_ID
  41. };
  42. struct v2f
  43. {
  44. float4 pos : SV_POSITION;
  45. float3 wpos : TEXCOORD0;
  46. float4 scrPos : TEXCOORD1;
  47. UNITY_VERTEX_INPUT_INSTANCE_ID
  48. UNITY_VERTEX_OUTPUT_STEREO
  49. };
  50. int _ForcedInvisible;
  51. v2f vert(appdata v)
  52. {
  53. v2f o;
  54. UNITY_SETUP_INSTANCE_ID(v);
  55. UNITY_TRANSFER_INSTANCE_ID(v, o);
  56. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  57. o.pos = TransformObjectToHClip(v.vertex.xyz);
  58. o.wpos = TransformObjectToWorld(v.vertex.xyz);
  59. o.scrPos = ComputeScreenPos(o.pos);
  60. #if defined(UNITY_REVERSED_Z)
  61. o.pos.z = o.pos.w * UNITY_NEAR_CLIP_VALUE * 0.99999; // 0.99999 avoids precision issues on some Android devices causing unexpected clipping of light mesh
  62. #else
  63. o.pos.z = o.pos.w - 1.0e-6f;
  64. #endif
  65. return o;
  66. }
  67. half4 frag(v2f i) : SV_Target {
  68. UNITY_SETUP_INSTANCE_ID(i);
  69. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
  70. float3 rayStart = GetRayStart(i.wpos);
  71. float3 ray = i.wpos - rayStart;
  72. float t1 = length(ray);
  73. float3 rayDir = ray / t1;
  74. CLAMP_RAY_DEPTH(rayStart, i.scrPos, t1); // clamp to geometry
  75. float3 hitPos = t1 * rayDir;
  76. float maxZ = _ProjectionParams.z * 0.99;
  77. float startDistance = min(maxZ, START_DISTANCE);
  78. float d = (t1 - startDistance) * DISTANCE_DENSITY;
  79. float hitPosY = max(1.0, hitPos.y + rayStart.y);
  80. float h = (MAX_HEIGHT / hitPosY) * HEIGHT_DENSITY;
  81. float f = min(d, h);
  82. f = max(f, 0);
  83. half sum = exp2(-f);
  84. sum = 1.0 - saturate(sum);
  85. half4 color = half4(_Color.rgb, sum * _Color.a);
  86. if (t1 > maxZ) { // skybox
  87. half diffusionIntensity = GetDiffusionIntensity(rayDir);
  88. color.rgb += diffusionIntensity;
  89. }
  90. color.rgb *= _LightColor.rgb;
  91. return color;
  92. }
  93. ENDHLSL
  94. }
  95. }
  96. }