Files
MinecraftLegends/Win32.DX11.Release/data/shaders/hlsl/depth_downsample.fragment.hlsl
T
2026-03-08 15:34:38 -05:00

43 lines
1.6 KiB
HLSL

#include "ShaderConstants.fxh"
struct PS_Input
{
float4 position : SV_Position;
float2 uv : TEXCOORD_0_FB_MSAA;
};
struct PS_Output
{
float4 color : SV_Target;
};
void main(in PS_Input PSInput, out PS_Output PSOutput)
{
PSOutput.color = float4(0.0, 0.0, 0.0, 1.0); //If we don't initialize this, compiler complaints :(
#if (VERSION >= 0xa100 /*D3D_FEATURE_LEVEL_10_1*/)
float4 samples = TEXTURE_0.Gather(TextureSampler0, PSInput.uv);
PSOutput.color.r = min(min(samples.x, samples.y), min(samples.z, samples.w));
// Don't reflect things that are too close to the player. IE ignore all low depth values ( the player's hands model for example ). We do this by pushing them to the far plane in the HiZ down sampling.
// If color.r is smaller than 0.1, force it to be 1.0
const float NEAR_TOLERANCE = 0.1;
PSOutput.color.r = lerp(1.0, PSOutput.color.r, sign(saturate(PSOutput.color.r - NEAR_TOLERANCE)));
#else
//Also works, but slower than using the gather command. Can be used for backward compatibility with older shaders. NOTE: GLSL also has a gather equivalent.
// Take minimum values.
float x_off = 0.5 / TEXTURE_DIMENSIONS.x;
float y_off = 0.5 / TEXTURE_DIMENSIONS.y;
float2 uv = PSInput.uv;
float depth0 = TEXTURE_0.Sample(TextureSampler0, uv + float2(-x_off, -y_off)).r;
float depth1 = TEXTURE_0.Sample(TextureSampler0, uv + float2(x_off, -y_off)).r;
float depth2 = TEXTURE_0.Sample(TextureSampler0, uv + float2(-x_off, y_off)).r;
float depth3 = TEXTURE_0.Sample(TextureSampler0, uv + float2(x_off, y_off)).r;
PSOutput.color.r = min(min(depth0, depth1), min(depth2, depth3));
#endif
}