Shader "Hidden/CopyDepth" { SubShader { ZTest Off ZWrite Off Pass { HLSLPROGRAM #pragma vertex Vertex #pragma fragment DownsampleDepthFrag #pragma enable_d3d11_debug_symbols #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct Attributes { float4 positionOS : POSITION; float2 texcoord : TEXCOORD0; }; struct Varyings { float2 uv : TEXCOORD0; float4 positionCS : SV_POSITION; }; Varyings Vertex(Attributes input) { Varyings output = (Varyings)0; output.positionCS = TransformObjectToHClip(input.positionOS.xyz); output.uv = input.texcoord; return output; } #if UNITY_REVERSED_Z # define MIN_DEPTH(l, r) min(l, r) #else # define MIN_DEPTH(l, r) max(l, r) #endif TEXTURE2D_FLOAT(_InputDepth); SAMPLER(sampler_InputDepth); float4 _InputScaleAndMaxIndex;//xy: inputeTexsize/outputTextureSize , zw:textureSize - 1 half4 DownsampleDepthFrag(Varyings input) : SV_Target { int2 texCrood = int2(input.positionCS.xy) * _InputScaleAndMaxIndex.xy; uint2 maxIndex = _InputScaleAndMaxIndex.zw; int2 texCrood00 = min(texCrood + uint2(0, 0), maxIndex); int2 texCrood10 = min(texCrood + uint2(1, 0), maxIndex); int2 texCrood01 = min(texCrood + uint2(0, 1), maxIndex); int2 texCrood11 = min(texCrood + uint2(1, 1), maxIndex); float p00 = LOAD_TEXTURE2D_LOD(_InputDepth,texCrood00,0); float p01 = LOAD_TEXTURE2D_LOD(_InputDepth,texCrood10,0); float p10 = LOAD_TEXTURE2D_LOD(_InputDepth,texCrood01,0); float p11 = LOAD_TEXTURE2D_LOD(_InputDepth,texCrood11,0); return MIN_DEPTH(MIN_DEPTH(p00 ,p01), MIN_DEPTH(p10, p11)); } ENDHLSL } Pass { HLSLPROGRAM #pragma vertex Vertex #pragma fragment CopyDepthFrag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct Attributes { float4 positionOS : POSITION; float2 texcoord : TEXCOORD0; }; struct Varyings { float2 uv : TEXCOORD0; float4 positionCS : SV_POSITION; }; Varyings Vertex(Attributes input) { Varyings output = (Varyings)0; output.positionCS = TransformObjectToHClip(input.positionOS.xyz); output.uv = input.texcoord; return output; } #if UNITY_REVERSED_Z # define MIN_DEPTH(l, r) min(l, r) #else # define MIN_DEPTH(l, r) max(l, r) #endif TEXTURE2D_FLOAT(_InputDepth); SAMPLER(sampler_InputDepth); half4 CopyDepthFrag(Varyings input) : SV_Target { return SAMPLE_TEXTURE2D(_InputDepth, sampler_InputDepth, input.uv); } ENDHLSL } } }