You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
2.8 KiB
Plaintext

Shader "Hidden/Enviro/Upsample"
{
SubShader
{
Pass
{
ZTest Always Cull Off ZWrite Off Fog{ Mode Off }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile __ ENVIROURP
#include "UnityCG.cginc"
UNITY_DECLARE_SCREENSPACE_TEXTURE(_LowResTexture);
UNITY_DECLARE_SCREENSPACE_TEXTURE(_CameraDepthLowRes);
UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);
float2 _LowResPixelSize;
float2 _LowResTextureSize;
float _DepthMult;
float _Threshold;
float4 _MainTex_TexelSize;
struct appdata
{
float4 vertex : POSITION;
float4 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float2 uv00 : TEXCOORD1;
float2 uv10 : TEXCOORD2;
float2 uv01 : TEXCOORD3;
float2 uv11 : TEXCOORD4;
UNITY_VERTEX_OUTPUT_STEREO
};
v2f vert(appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_OUTPUT(v2f, o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
#if defined(ENVIROURP)
o.pos = float4(v.vertex.xyz,1.0);
#if UNITY_UV_STARTS_AT_TOP
o.pos.y *= -1;
#endif
#else
o.pos = UnityObjectToClipPos(v.vertex);
#endif
o.uv = UnityStereoTransformScreenSpaceTex(v.uv);
o.uv00 = v.uv - 0.5 * _LowResPixelSize;
o.uv10 = o.uv00 + float2(_LowResPixelSize.x, 0.0);
o.uv01 = o.uv00 + float2(0.0, _LowResPixelSize.y);
o.uv11 = o.uv00 + _LowResPixelSize;
return o;
}
fixed4 ClosestDepthFast(v2f i)
{
float z00 = DecodeFloatRGBA(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthLowRes, i.uv00));
float z10 = DecodeFloatRGBA(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthLowRes, i.uv10));
float z01 = DecodeFloatRGBA(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthLowRes, i.uv01));
float z11 = DecodeFloatRGBA(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthLowRes, i.uv11));
float zfull = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv));
float dist00 = abs(z00 - zfull);
float dist10 = abs(z10 - zfull);
float dist01 = abs(z01 - zfull);
float dist11 = abs(z11 - zfull);
float3 uvd00 = float3(i.uv00, dist00);
float3 uvd10 = float3(i.uv10, dist10);
float3 uvd01 = float3(i.uv01, dist01);
float3 uvd11 = float3(i.uv11, dist11);
float3 finalUV = lerp(uvd10, uvd00, saturate(99999 * (uvd10.z - uvd00.z)));
finalUV = lerp(uvd01, finalUV, saturate(99999 * (uvd01.z - finalUV.z)));
finalUV = lerp(uvd11, finalUV, saturate(99999 * (uvd11.z - finalUV.z)));
float maxDist = max(max(max(dist00, dist10), dist01), dist11) - _Threshold;
fixed r = saturate(maxDist * 99999);
float2 uv = lerp(i.uv, finalUV.xy, r);
return UNITY_SAMPLE_SCREENSPACE_TEXTURE(_LowResTexture, uv);
}
fixed4 frag(v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
return ClosestDepthFast(i);
}
ENDCG
}
}
Fallback Off
}