ToriaAssets/Sources/Shaders/HiZBuffer.cginc
2026-05-19 12:20:15 +02:00

98 lines
2.4 KiB
HLSL

#ifndef __HI_Z__
#define __HI_Z__
#include "UnityCG.cginc"
struct Input
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
};
Texture2D _MainTex;
SamplerState sampler_MainTex;
Texture2D _CameraDepthTexture;
SamplerState sampler_CameraDepthTexture;
float4 _MainTex_TexelSize;
Varyings vertex(in Input input)
{
Varyings output;
output.vertex = UnityObjectToClipPos(input.vertex.xyz);
output.uv = input.uv;
#if UNITY_UV_STARTS_AT_TOP
if (_MainTex_TexelSize.y < 0)
output.uv.y = 1. - input.uv.y;
#endif
return output;
}
float4 blit(in Varyings input) : SV_Target
{
//return _CameraDepthTexture.Sample(sampler_CameraDepthTexture, input.uv).r;
#if UNITY_REVERSED_Z
return _CameraDepthTexture.Sample(sampler_CameraDepthTexture, input.uv).r;
#else
return 1.0 - _CameraDepthTexture.Sample(sampler_CameraDepthTexture, input.uv).r;
#endif
}
// Original code
float4 reduce_original(in Varyings input) : SV_Target {
#if SHADER_API_METAL
int2 xy = (int2) (input.uv * (_MainTex_TexelSize.zw - 1.));
float4 texels[2] = {
float4(_MainTex.mips[0][xy].rg, _MainTex.mips[0][xy + int2(1, 0)].rg),
float4(_MainTex.mips[0][xy + int2(0, 1)].rg, _MainTex.mips[0][xy + 1].rg)
};
float4 r = float4(texels[0].rb, texels[1].rb);
float4 g = float4(texels[0].ga, texels[1].ga);
#else
float4 r = _MainTex.GatherRed(sampler_MainTex, input.uv);
float4 g = _MainTex.GatherGreen(sampler_MainTex, input.uv);
#endif
float minimum = min(min(min(r.x, r.y), r.z), r.w);
float maximum = max(max(max(g.x, g.y), g.z), g.w);
return float4(minimum, maximum, 0., 0.);
}
// As we do not use maximum
float4 reduce(in Varyings input) : SV_Target{
#if SHADER_API_METAL
int2 xy = (int2) (input.uv * (_MainTex_TexelSize.zw - 1.));
float4 texels[2] = {
float4(_MainTex.mips[0][xy].rg, _MainTex.mips[0][xy + int2(1, 0)].rg),
float4(_MainTex.mips[0][xy + int2(0, 1)].rg, _MainTex.mips[0][xy + 1].rg)
};
float4 r = float4(texels[0].rb, texels[1].rb);
//float4 g = float4(texels[0].ga, texels[1].ga);
#else
float4 r = _MainTex.GatherRed(sampler_MainTex, input.uv);
//float4 g = _MainTex.GatherGreen(sampler_MainTex, input.uv);
#endif
float minimum = min(min(min(r.x, r.y), r.z), r.w);
//float maximum = max(max(max(g.x, g.y), g.z), g.w);
return float4(minimum, 0., 0., 0.);
}
#endif