98 lines
2.4 KiB
HLSL
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
|