Files
ZHGD_Web/Assets/Art/Art Plugins/Horizon Based Ambient Occlusion/Shaders/HBAO_Composite.cginc

151 lines
3.9 KiB
HLSL
Raw Normal View History

2025-07-13 23:16:20 +08:00
#ifndef HBAO_COMPOSITE_INCLUDED
#define HBAO_COMPOSITE_INCLUDED
#include "UnityCG.cginc"
#include "HBAO_Common.cginc"
inline half4 FetchOcclusion(float2 uv) {
return UNITY_SAMPLE_SCREENSPACE_TEXTURE(_HBAOTex, uv * _TargetScale.zw);
}
inline half4 FetchSceneColor(float2 uv) {
return UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, uv);
}
inline half4 FetchGBuffer0(float2 uv) {
return UNITY_SAMPLE_SCREENSPACE_TEXTURE(_TempTex, uv);
}
inline half4 FetchGBuffer3(float2 uv) {
return UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, uv);
}
inline half3 MultiBounceAO(float visibility, half3 albedo) {
half3 a = 2.0404 * albedo - 0.3324;
half3 b = -4.7951 * albedo + 0.6417;
half3 c = 2.7552 * albedo + 0.6903;
float x = visibility;
return max(x, ((x * a + b) * x + c) * x);
}
half4 Composite_Frag(Varyings input) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
//uint2 positionSS = input.uv * _ScreenSize.xy;
half4 ao = FetchOcclusion(input.uv);
ao.a = saturate(pow(abs(ao.a), _Intensity));
half3 aoColor = lerp(_BaseColor.rgb, half3(1.0, 1.0, 1.0), ao.a);
half4 col = FetchSceneColor(input.uv);
#if LIGHTING_LOG_ENCODED
col.rgb = -log2(col.rgb);
#endif
#if MULTIBOUNCE
aoColor = lerp(aoColor, MultiBounceAO(ao.a, lerp(col.rgb, _BaseColor.rgb, _BaseColor.rgb)), _MultiBounceInfluence);
#endif
col.rgb *= aoColor;
#if COLOR_BLEEDING
//col.rgb += 1 - ao.rgb;
col.rgb += ao.rgb;
#endif
#if LIGHTING_LOG_ENCODED
col.rgb = exp2(-col.rgb);
#endif
#if DEBUG_AO
col.rgb = aoColor;
#elif DEBUG_COLORBLEEDING && COLOR_BLEEDING
//col.rgb = 1 - ao.rgb;
col.rgb = ao.rgb;
#elif DEBUG_NOAO_AO || DEBUG_AO_AOONLY || DEBUG_NOAO_AOONLY
if (input.uv.x <= 0.4985) {
#if DEBUG_NOAO_AO || DEBUG_NOAO_AOONLY
col = FetchSceneColor(input.uv);
#endif // DEBUG_NOAO_AO || DEBUG_NOAO_AOONLY
return col;
}
if (input.uv.x > 0.4985 && input.uv.x < 0.5015) {
return half4(0, 0, 0, 1);
}
#if DEBUG_AO_AOONLY || DEBUG_NOAO_AOONLY
col.rgb = aoColor;
#endif // DEBUG_AO_AOONLY) || DEBUG_NOAO_AOONLY
#endif // DEBUG_AO
return col;
}
half4 Composite_Frag_BlendAO(Varyings input) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
half4 ao = FetchOcclusion(input.uv);
ao.a = saturate(pow(abs(ao.a), _Intensity));
half3 aoColor = lerp(_BaseColor.rgb, half3(1.0, 1.0, 1.0), ao.a);
#if MULTIBOUNCE
half4 col = FetchSceneColor(input.uv);
aoColor = lerp(aoColor, MultiBounceAO(ao.a, lerp(col.rgb, _BaseColor.rgb, _BaseColor.rgb)), _MultiBounceInfluence);
#endif
return float4(aoColor, 1);
}
half4 Composite_Frag_BlendCB(Varyings input) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
half4 ao = FetchOcclusion(input.uv);
return float4(ao.rgb, 1);
}
struct CombinedOutput {
half4 gbuffer0 : SV_Target0; // albedo (RGB), occlusion (A)
half4 gbuffer3 : SV_Target1; // emission (RGB), unused(A)
};
CombinedOutput Composite_Lit_Frag(Varyings input)
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
half4 ao = FetchOcclusion(input.uv);
ao.a = saturate(pow(abs(ao.a), _Intensity));
half3 aoColor = lerp(_BaseColor.rgb, half3(1.0, 1.0, 1.0), ao.a);
half4 albedoOcc = FetchGBuffer0(input.uv);
half4 emission = FetchGBuffer3(input.uv);
#if LIGHTING_LOG_ENCODED
emission.rgb = -log2(emission.rgb);
#endif
CombinedOutput o;
o.gbuffer0 = half4(albedoOcc.rgb, albedoOcc.a * ao.a);
o.gbuffer3 = half4(emission.rgb * lerp(aoColor, half3(1.0, 1.0, 1.0), saturate((emission.r + emission.g + emission.b) / 3)), emission.a);
#if COLOR_BLEEDING
//o.gbuffer3.rgb += 1 - ao.rgb;
o.gbuffer3.rgb += ao.rgb;
#endif
#if LIGHTING_LOG_ENCODED
o.gbuffer3.rgb = exp2(-o.gbuffer3.rgb);
#endif
return o;
}
#endif // HBAO_COMPOSITE_INCLUDED