Files
2025-07-13 23:16:20 +08:00

68 lines
2.2 KiB
HLSL

#ifndef HBAO_COMMON_INCLUDED
#define HBAO_COMMON_INCLUDED
#include "UnityCG.cginc"
inline float FetchRawDepth(float2 uv) {
return SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv * _TargetScale.xy);
}
inline float LinearizeDepth(float depth) {
// References: https://docs.unity3d.com/Manual/SL-PlatformDifferences.html
#if ORTHOGRAPHIC_PROJECTION
#if UNITY_REVERSED_Z
depth = 1 - depth;
#endif // UNITY_REVERSED_Z
float linearDepth = _ProjectionParams.y + depth * (_ProjectionParams.z - _ProjectionParams.y); // near + depth * (far - near)
#else
float linearDepth = LinearEyeDepth(depth);
#endif // ORTHOGRAPHIC_PROJECTION
return linearDepth;
}
inline float3 FetchViewPos(float2 uv) {
uv = clamp(uv, 0, 1 - _Input_TexelSize.xy * 0.5); // uv guard
float depth = LinearizeDepth(FetchRawDepth(uv));
#if ORTHOGRAPHIC_PROJECTION
return float3((uv * _UVToView[unity_StereoEyeIndex].xy + _UVToView[unity_StereoEyeIndex].zw), depth);
#else
return float3((uv * _UVToView[unity_StereoEyeIndex].xy + _UVToView[unity_StereoEyeIndex].zw) * depth, depth);
#endif
}
inline float3 MinDiff(float3 P, float3 Pr, float3 Pl) {
float3 V1 = Pr - P;
float3 V2 = P - Pl;
return (dot(V1, V1) < dot(V2, V2)) ? V1 : V2;
}
inline float3 FetchViewNormals(float2 uv, float2 delta, float3 P) {
#if NORMALS_RECONSTRUCT
float3 Pr, Pl, Pt, Pb;
Pr = FetchViewPos(uv + float2(delta.x, 0));
Pl = FetchViewPos(uv + float2(-delta.x, 0));
Pt = FetchViewPos(uv + float2(0, delta.y));
Pb = FetchViewPos(uv + float2(0, -delta.y));
float3 N = normalize(cross(MinDiff(P, Pr, Pl), MinDiff(P, Pt, Pb)));
#else
#if NORMALS_CAMERA
float3 N = DecodeViewNormalStereo(UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraDepthNormalsTexture, uv * _TargetScale.xy));
#else
float3 N = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_CameraGBufferTexture2, uv * _TargetScale.xy).rgb * 2.0 - 1.0;
//N = mul((float3x3)_WorldToCameraMatrix, N);
N = mul((float3x3)UNITY_MATRIX_V, N);
#endif // NORMALS_CAMERA
N = float3(N.x, -N.yz);
#endif // NORMALS_RECONSTRUCT
return N;
}
inline float3 FetchViewNormals(float2 uv, float2 delta) {
float3 P = FetchViewPos(uv);
return FetchViewNormals(uv, delta, P);
}
#endif // HBAO_COMMON_INCLUDED