123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- Shader "Hidden/EnviroVolumetricCloudsBlend"
- {
- Properties
- {
- //_MainTex ("Texture", any) = "white" {}
- }
- SubShader
- {
- Tags { "RenderType"="Opaque" }
- LOD 100
- Pass
- {
- Cull Off ZWrite Off ZTest Always
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #pragma multi_compile __ ENVIRO_DEPTH_BLENDING
- #pragma multi_compile __ ENVIROURP
- #pragma multi_compile __ UNITY_COLORSPACE_GAMMA
-
- #include "UnityCG.cginc"
- //#include "../Includes/SkyInclude.cginc"
- #include "../Includes/FogInclude.cginc"
- UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
- #ifdef STEREO_INSTANCING_ON
- UNITY_DECLARE_TEX2DARRAY (_CloudTex);
- #else
- UNITY_DECLARE_TEX2D (_CloudTex);
- #endif
- UNITY_DECLARE_SCREENSPACE_TEXTURE(_DownsampledDepth);
- UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);
- float4 _CloudTex_TexelSize;
- float4 _MainTex_TexelSize;
- SamplerState Point_Clamp_Sampler;
- float4 _ProjectionExtents;
- float4 _ProjectionExtentsRight;
- float3 _AmbientColor;
- float3 _DirectLightColor;
- float _AtmosphereColorSaturateDistance;
- float4x4 _CamToWorld;
-
- struct appdata
- {
- float4 vertex : POSITION;
- float2 uv : TEXCOORD0;
- UNITY_VERTEX_INPUT_INSTANCE_ID
- };
- struct v2f
- {
- float4 vertex : SV_POSITION;
- float2 uv : TEXCOORD0;
- float4 screenPos : TEXCOORD1;
- float2 vsray : TEXCOORD2;
- half3 pos : TEXCOORD3;
- #ifdef ENVIRO_DEPTH_BLENDING
- float2 uv00 : TEXCOORD4;
- float2 uv10 : TEXCOORD5;
- float2 uv01 : TEXCOORD6;
- float2 uv11 : TEXCOORD7;
- #endif
- 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);
- o.pos = -v.vertex;
-
- #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.texcoord;
- if(unity_StereoEyeIndex == 0)
- o.vsray = (2.0 * v.texcoord - 1.0) * _ProjectionExtents.xy + _ProjectionExtents.zw;
- else
- o.vsray = (2.0 * v.texcoord - 1.0) * _ProjectionExtentsRight.xy + _ProjectionExtentsRight.zw;
- o.screenPos = ComputeScreenPos(o.vertex);
-
- #ifdef ENVIRO_DEPTH_BLENDING
- o.uv00 = v.texcoord - 0.5 * _CloudTex_TexelSize.xy;
- o.uv10 = o.uv00 + float2(_CloudTex_TexelSize.x, 0.0);
- o.uv01 = o.uv00 + float2(0.0, _CloudTex_TexelSize.y);
- o.uv11 = o.uv00 + _CloudTex_TexelSize.xy;
- #endif
- return o;
- }
- #ifdef ENVIRO_DEPTH_BLENDING
- float4 Upsample(v2f i)
- {
- float4 lowResDepth = 0.0f;
- float highResDepth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture,UnityStereoTransformScreenSpaceTex(i.uv)));
- lowResDepth.x = LinearEyeDepth(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_DownsampledDepth,UnityStereoTransformScreenSpaceTex(i.uv00)).r);
- lowResDepth.y = LinearEyeDepth(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_DownsampledDepth,UnityStereoTransformScreenSpaceTex(i.uv10)).r);
- lowResDepth.z = LinearEyeDepth(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_DownsampledDepth,UnityStereoTransformScreenSpaceTex(i.uv01)).r);
- lowResDepth.w = LinearEyeDepth(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_DownsampledDepth,UnityStereoTransformScreenSpaceTex(i.uv11)).r);
- float4 depthDiff = abs(lowResDepth - highResDepth);
- float accumDiff = dot(depthDiff, float4(1, 1, 1, 1));
- [branch]
- if (accumDiff < 1.5f)
- {
- #ifdef STEREO_INSTANCING_ON
- float3 uv = float3(UnityStereoTransformScreenSpaceTex(i.uv),unity_StereoEyeIndex);
- return _CloudTex.Sample(sampler_CloudTex, uv);
- #else
- return _CloudTex.Sample(sampler_CloudTex, UnityStereoTransformScreenSpaceTex(i.uv));
- #endif
- }
- else
- {
- float minDepthDiff = depthDiff[0];
- float2 nearestUv = i.uv00;
- if (depthDiff[1] < minDepthDiff)
- {
- nearestUv = i.uv10;
- minDepthDiff = depthDiff[1];
- }
- if (depthDiff[2] < minDepthDiff)
- {
- nearestUv = i.uv01;
- minDepthDiff = depthDiff[2];
- }
- if (depthDiff[3] < minDepthDiff)
- {
- nearestUv = i.uv11;
- minDepthDiff = depthDiff[3];
- }
- #ifdef STEREO_INSTANCING_ON
- float3 uv = float3(UnityStereoTransformScreenSpaceTex(nearestUv),unity_StereoEyeIndex);
- return _CloudTex.Sample(Point_Clamp_Sampler, uv);
- #else
- return _CloudTex.Sample(Point_Clamp_Sampler, UnityStereoTransformScreenSpaceTex(nearestUv));
- #endif
- }
- }
- #endif
- half4 frag(v2f i) : SV_Target
- {
- UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
-
- float4 vspos = float4(i.vsray, 1.0, 1.0);
- float4 worldPos = mul(_CamToWorld,vspos);
- float3 viewDir = normalize(worldPos.xyz - _WorldSpaceCameraPos);
- float4 sourceColor = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex,UnityStereoTransformScreenSpaceTex(i.uv));
-
- #ifdef ENVIRO_DEPTH_BLENDING
- float4 cloudsColor = Upsample(i);
- #else
- #ifdef STEREO_INSTANCING_ON
- float3 uv = float3(UnityStereoTransformScreenSpaceTex(i.uv),unity_StereoEyeIndex);
- float4 cloudsColor = _CloudTex.Sample(sampler_CloudTex, uv);
- #else
- float4 cloudsColor = _CloudTex.Sample(sampler_CloudTex, UnityStereoTransformScreenSpaceTex(i.uv));
- #endif
- #endif
- float3 sunColor = pow(_DirectLightColor.rgb,2) * 2.0f;
- float3 skyColor = GetSkyColor(viewDir,0.005f);
- //float3 ambient = lerp(_AmbientColor,skyColor,0);
- float4 finalColor = float4(cloudsColor.r * sunColor + _AmbientColor, cloudsColor.a);
- //finalColor.rgb = lerp(skyColor, finalColor.rgb, 0.75);
-
- // float4 volumeFog = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_EnviroVolumetricFogTex, i.uv);
- // skyColor.rgb *= volumeFog.rgb;
- //float cameraRemap = Remap(_WorldSpaceCameraPos.y - 2000,-2000,2000,0,1);
- float atmosphericBlendFactor = saturate(exp(-cloudsColor.g / _AtmosphereColorSaturateDistance));
- //if(_WorldSpaceCameraPos.y <= 2000)
- finalColor.rgb = lerp(skyColor, finalColor.rgb, atmosphericBlendFactor);
- #if defined(UNITY_COLORSPACE_GAMMA)
- finalColor.rgb = LinearToGammaSpace(finalColor.rgb);
- #endif
- #if ENVIRO_DEPTH_BLENDING
- float4 final = float4(sourceColor.rgb * (1 - finalColor.a) + finalColor.rgb * finalColor.a, 1);
-
- return final;
- #else
- float4 final = sourceColor;
- float sceneDepth = Linear01Depth( SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoTransformScreenSpaceTex(i.uv)));
-
- if (sceneDepth == 1.0f)
- final = half4(sourceColor.rgb * saturate(1 - finalColor.a) + finalColor.rgb * finalColor.a, 1);
-
- return final;
- #endif
- }
- ENDCG
- }
- }
- }
|