16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 16:19:19 +02:00

support specular occlusion using bent normals

This commit is contained in:
Wls50
2025-11-28 23:36:26 +01:00
committed by Hirek
parent aa0b6e9965
commit 7316a35b00
5 changed files with 24 additions and 148 deletions

View File

@@ -39,6 +39,12 @@ void ApplyMaterialLighting(out float4 lit, in MaterialData material)
{
// Camera-centric world position
float3 view = mul((float3x3)g_InverseModelView, material.m_Position);
#ifdef GBUFFER_SSAO_HLSLI
float4 bent_normal = GetBentNormal(pixel_position);
bent_normal.a = min(material.m_MaterialParams.b, bent_normal.a);
bent_normal.xyz = mul((float3x3)g_InverseModelView, bent_normal.xyz);
#endif
// Convert material to surface data
SurfaceData surface_data;
@@ -47,7 +53,7 @@ void ApplyMaterialLighting(out float4 lit, in MaterialData material)
surface_data.m_Metalness = material.m_MaterialParams.r;
surface_data.m_Roughness = material.m_MaterialParams.g;
#ifdef GBUFFER_SSAO_HLSLI
surface_data.m_DiffuseOcclusion = min(material.m_MaterialParams.b, GetSSAO(pixel_position));
surface_data.m_DiffuseOcclusion = bent_normal.a;
#else
surface_data.m_DiffuseOcclusion = material.m_MaterialParams.b;
#endif
@@ -59,7 +65,12 @@ void ApplyMaterialLighting(out float4 lit, in MaterialData material)
surface_data.m_SpecularF0 = lerp(surface_data.m_SpecularF0, surface_data.m_Albedo, surface_data.m_Metalness);
surface_data.m_SpecularF = FresnelSchlickRoughness(surface_data.m_NdotV, surface_data.m_SpecularF0, surface_data.m_Roughness);
surface_data.m_HorizonFading = 1.6;
#ifdef GBUFFER_SSAO_HLSLI
float BNdotR = max(0., dot(surface_data.m_Reflect, bent_normal.xyz));
surface_data.m_SpecularOcclusion = ComputeSpecOcclusion(BNdotR, surface_data.m_DiffuseOcclusion, surface_data.m_Roughness);
#else
surface_data.m_SpecularOcclusion = ComputeSpecOcclusion(surface_data.m_NdotV, surface_data.m_DiffuseOcclusion, surface_data.m_Roughness);
#endif
lit.rgb = material.m_MaterialEmission * surface_data.m_Alpha;
lit.a = 1. - (saturate((1. - surface_data.m_Alpha) * lerp(1. - dot(surface_data.m_SpecularF, 1./3.), 0., surface_data.m_Metalness)));