| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | Shader "Hidden/EnviroHeightFog"{    Properties    {        //_MainTex ("Texture", any) = "white" {}    }    SubShader    {        // No culling or depth        Cull Off ZWrite Off ZTest Always        Pass        {            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #pragma multi_compile __ ENVIROURP            #pragma multi_compile __ UNITY_COLORSPACE_GAMMA            #include "UnityCG.cginc"            #include "../Includes/FogInclude.cginc"              struct v2f            {                float2 uv : TEXCOORD0;                float4 position : SV_POSITION;                float3 ray : TEXCOORD1;                UNITY_VERTEX_OUTPUT_STEREO            };            v2f vert (appdata_img v)            {                v2f o;                UNITY_SETUP_INSTANCE_ID(v);                 UNITY_INITIALIZE_OUTPUT(v2f, o);                 UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);                #if defined(ENVIROURP)		        o.position = float4(v.vertex.xyz,1.0);		        #if UNITY_UV_STARTS_AT_TOP                o.position.y *= -1;                #endif                #else		        o.position = UnityObjectToClipPos(v.vertex);                #endif                 o.uv = v.texcoord;                 return o;            }            float4x4 _LeftWorldFromView;            float4x4 _RightWorldFromView;            float4x4 _LeftViewFromScreen;            float4x4 _RightViewFromScreen;            UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);            UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);            void InverseProjectDepth (float depth, float2 texcoord, out float3 worldPos, out float dist, out float3 viewDir)            {                float4x4 proj, eyeToWorld;                if (unity_StereoEyeIndex == 0)                {                    proj 		= _LeftViewFromScreen;                    eyeToWorld 	= _LeftWorldFromView;                }                else                {                    proj 		= _RightViewFromScreen;                    eyeToWorld 	= _RightWorldFromView;                }                #if !UNITY_UV_STARTS_AT_TOP                    texcoord.y = 1 - texcoord.y;                #endif                                float2 uvClip = texcoord * 2.0 - 1.0;                float clipDepth = depth; // Fix for OpenGl Core thanks to Lars Bertram				clipDepth = (UNITY_NEAR_CLIP_VALUE < 0) ? clipDepth * 2 - 1 : clipDepth;                float4 clipPos = float4(uvClip, clipDepth, 1.0);                float4 viewPos = mul(proj, clipPos); // inverse projection by clip position                viewPos /= viewPos.w; // perspective division                worldPos = mul(eyeToWorld, viewPos).xyz;                viewDir = worldPos - _WorldSpaceCameraPos.xyz;                dist = length(viewDir);                viewDir /= dist;            }               float4 frag (v2f i) : SV_Target            {                 UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);                float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);                float linearDepth = Linear01Depth(depth);                float viewDistance;                float3 worldPos, viewDir;                InverseProjectDepth(depth, i.uv.xy, worldPos, viewDistance, viewDir);                 float4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv);                 float4 fog = GetExponentialHeightFog(worldPos,linearDepth);                //this is not correct but LinearToGamma does produce even worse results..                 #if defined(UNITY_COLORSPACE_GAMMA)                 fog.rgb *= 1.5;                #endif                float3 final = ApplyVolumetricLights(fog,col.rgb, i.uv);                return float4(final.rgb,1);            }            ENDCG        }    }}
 |