|
|
- Shader "Hidden/Post FX/Fog"
- {
- Properties
- {
- _MainTex("Main Texture", 2D) = "white" {}
- }
-
- CGINCLUDE
-
- #pragma multi_compile __ FOG_LINEAR FOG_EXP FOG_EXP2
- #include "UnityCG.cginc"
- #include "Common.cginc"
-
- #define SKYBOX_THREASHOLD_VALUE 0.9999
-
- struct Varyings
- {
- float2 uv : TEXCOORD0;
- float4 vertex : SV_POSITION;
- };
-
- Varyings VertFog(AttributesDefault v)
- {
- Varyings o;
- o.vertex = UnityObjectToClipPos(v.vertex);
- o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);
- return o;
- }
-
- sampler2D _CameraDepthTexture;
-
- half4 _FogColor;
- float _Density;
- float _Start;
- float _End;
-
- half ComputeFog(float z)
- {
- half fog = 0.0;
- #if FOG_LINEAR
- fog = (_End - z) / (_End - _Start);
- #elif FOG_EXP
- fog = exp2(-_Density * z);
- #else // FOG_EXP2
- fog = _Density * z;
- fog = exp2(-fog * fog);
- #endif
- return saturate(fog);
- }
-
- float ComputeDistance(float depth)
- {
- float dist = depth * _ProjectionParams.z;
- dist -= _ProjectionParams.y;
- return dist;
- }
-
- half4 FragFog(Varyings i) : SV_Target
- {
- half4 color = tex2D(_MainTex, i.uv);
-
- float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);
- depth = Linear01Depth(depth);
- float dist = ComputeDistance(depth);
- half fog = 1.0 - ComputeFog(dist);
-
- return lerp(color, _FogColor, fog);
- }
-
- half4 FragFogExcludeSkybox(Varyings i) : SV_Target
- {
- half4 color = tex2D(_MainTex, i.uv);
-
- float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);
- depth = Linear01Depth(depth);
- float skybox = depth < SKYBOX_THREASHOLD_VALUE;
- float dist = ComputeDistance(depth);
- half fog = 1.0 - ComputeFog(dist);
-
- return lerp(color, _FogColor, fog * skybox);
- }
-
- ENDCG
-
- SubShader
- {
- Cull Off ZWrite Off ZTest Always
-
- Pass
- {
- CGPROGRAM
-
- #pragma vertex VertFog
- #pragma fragment FragFog
-
- ENDCG
- }
-
- Pass
- {
- CGPROGRAM
-
- #pragma vertex VertFog
- #pragma fragment FragFogExcludeSkybox
-
- ENDCG
- }
- }
- }
|