| | |
| | | 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 |
| | | } |
| | | } |
| | | } |
| | | 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
|
| | | }
|
| | | }
|
| | | }
|