| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 | Shader "Hidden/EnviroVolumetricCloudsReproject"{    Properties    {        //_MainTex ("Texture", any) = "white" {}    }     SubShader    {        Tags { "RenderType"="Opaque" }        LOD 100    	Pass        {            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #pragma multi_compile _ ENVIRO_DEPTH_BLENDING            #pragma multi_compile _ ENVIROURP            #include "UnityCG.cginc"                        UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);            float4 _MainTex_TexelSize;            UNITY_DECLARE_SCREENSPACE_TEXTURE(_UndersampleCloudTex);            float4 _UndersampleCloudTex_TexelSize;            UNITY_DECLARE_SCREENSPACE_TEXTURE(_DownsampledDepth);            float4x4 _PrevVP;            float4x4 _CamToWorld;            float4 _ProjectionExtents;            float4 _ProjectionExtentsRight;            float2 _TexelSize;            float _BlendTime;              struct appdata             {                float4 vertex : POSITION;                float2 uv : TEXCOORD0;                UNITY_VERTEX_INPUT_INSTANCE_ID            };            struct v2f            {                float4 vertex : SV_POSITION;                float2 uv : TEXCOORD0;                float2 ray : TEXCOORD1;                float4 screenPos : TEXCOORD2;                UNITY_VERTEX_OUTPUT_STEREO            };             v2f vert(appdata v)             {                 v2f o;                 UNITY_SETUP_INSTANCE_ID(v); 		        UNITY_INITIALIZE_OUTPUT(v2f, o); 		        UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);                      #if defined(ENVIROURP)		        o.vertex = float4(v.vertex.xyz,1.0);		        #if UNITY_UV_STARTS_AT_TOP                o.vertex.y *= -1;                #endif                 #else		        o.vertex = UnityObjectToClipPos(v.vertex);                #endif                   o.uv = v.uv;                if(unity_StereoEyeIndex == 0)                     o.ray = (2.0 * v.uv - 1.0) * _ProjectionExtents.xy + _ProjectionExtents.zw;                else                    o.ray = (2.0 * v.uv - 1.0) * _ProjectionExtentsRight.xy + _ProjectionExtentsRight.zw;                o.screenPos = ComputeScreenPos(o.vertex);                return o;            }             float2 PrevUV(float4 wspos, out half outOfBound)             {                float4x4 prev = mul(unity_CameraProjection,_PrevVP);                float4 prevUV = mul(prev, wspos);                prevUV.xy = 0.5 * (prevUV.xy / prevUV.w) + 0.5;                half oobmax = max(0.0 - prevUV.x, 0.0 - prevUV.y);                half oobmin = max(prevUV.x - 1.0, prevUV.y - 1.0);                outOfBound = step(0, max(oobmin, oobmax));                                return prevUV;            }            float4 ClipAABB(float4 aabbMin, float4 aabbMax, float4 prevSample)            {                float4 p_clip = 0.5 * (aabbMax + aabbMin);                float4 e_clip = 0.5 * (aabbMax - aabbMin);                float4 v_clip = prevSample - p_clip;                float4 v_unit = v_clip / e_clip;                float4 a_unit = abs(v_unit);                float ma_unit = max(max(a_unit.x, max(a_unit.y, a_unit.z)), a_unit.w);                if (ma_unit > 1.0)                    return p_clip + v_clip / ma_unit;                else                    return prevSample;            }                    float4 frag(v2f i) : SV_Target            {                UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);                float3 vspos = float3(i.ray, 1.0);                       float4 raymarchResult = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_UndersampleCloudTex,UnityStereoTransformScreenSpaceTex(i.uv));                float distance = raymarchResult.y;		                float intensity = raymarchResult.x;                half outOfBound;                float4 worldPos = mul(_CamToWorld, float4(normalize(vspos) * distance, 1.0));                        worldPos /= worldPos.w;                  float2 prevUV = PrevUV(worldPos, outOfBound);                          {	                     float4 prevSample = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, UnityStereoTransformScreenSpaceTex(prevUV));                     float4 m1 = float4(0.0f,0.0f,0.0f,0.0f);                     float4 m2 = float4(0.0f,0.0f,0.0f,0.0f);                                        float sampleCount = 1.0f;#if ENVIRO_DEPTH_BLENDING                    float originalPointDepth = LinearEyeDepth(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_DownsampledDepth, UnityStereoTransformScreenSpaceTex(i.uv)));#endif                    [unroll]                    for (int x = -1; x <= 1; x ++)                     {                        [unroll]                        for (int y = -1; y <= 1; y ++ )                         {                            float4 val;                            if (x == 0 && y == 0)                             {                                val = raymarchResult;                                m1 += val;                                m2 += val * val;                            }                            else                             {                                float2 uv = i.uv + float2(x * _UndersampleCloudTex_TexelSize.x, y * _UndersampleCloudTex_TexelSize.y);                                val = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_UndersampleCloudTex, UnityStereoTransformScreenSpaceTex(uv));#if ENVIRO_DEPTH_BLENDING                                float depth = LinearEyeDepth(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_DownsampledDepth,UnityStereoTransformScreenSpaceTex(uv)));                                if (abs(originalPointDepth - depth < 1.5f))                                 {                                    m1 += val;                                    m2 += val * val;                                    sampleCount += 1.0f;                                }#else                                m1 += val;                                m2 += val * val;                                sampleCount += 1.0f;#endif                            }                        }                    }                    float gamma = _BlendTime;                    float4 mu = m1 / sampleCount;                    float4 sigma = sqrt(abs(m2 / sampleCount - mu * mu));                    float4 minc = mu - gamma * sigma;                    float4 maxc = mu + gamma * sigma;                    prevSample = ClipAABB(minc, maxc, prevSample);	                      //Blend.                    raymarchResult = lerp(prevSample, raymarchResult, max(0.01f, outOfBound));                                   }                return raymarchResult;            }            ENDCG		}    }}
 |