From d719974b7910eab816eca257fa8dc546ab2e2e8f Mon Sep 17 00:00:00 2001 From: Jiaye Date: Thu, 14 May 2026 22:32:51 +0800 Subject: [PATCH] fix(foliage): flip foliage normal and fix sss --- package/Shaders/Common/PBR.hlsli | 7 +++++++ package/Shaders/Lighting.hlsl | 7 ++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/package/Shaders/Common/PBR.hlsli b/package/Shaders/Common/PBR.hlsli index 4f1d4dd911..638b4d0748 100644 --- a/package/Shaders/Common/PBR.hlsli +++ b/package/Shaders/Common/PBR.hlsli @@ -172,6 +172,7 @@ namespace PBR } [branch] if ((PBRFlags & Flags::Subsurface) != 0) +# if !defined(TREE_ANIM) { const float subsurfacePower = 12.234; float forwardScatter = exp2(saturate(-VdotL) * subsurfacePower - subsurfacePower); @@ -179,6 +180,12 @@ namespace PBR float subsurface = lerp(backScatter, 1, forwardScatter) * (1.0 - material.Thickness); lightingOutput.transmission += material.SubsurfaceColor * subsurface * softLightColor * BRDF::Diffuse_Lambert() * kD; } +# else + { + float subsurfaceFoliage = saturate(-NdotL) * (1.0 - material.Thickness); + lightingOutput.transmission += material.SubsurfaceColor * subsurfaceFoliage * detailedLightColor * BRDF::Diffuse_Lambert() * kD; + } +# endif else if ((PBRFlags & Flags::TwoLayer) != 0) { float coatNdotL = satNdotL; diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 802507bccf..d7c055cde2 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -2012,6 +2012,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) float3x3 tbnTr = ReconstructTBN(input.WorldPosition.xyz, worldNormal, screenUV); # else float3 worldNormal = normalize(mul(tbn, normal.xyz)); +# if defined(TREE_ANIM) + float3 viewNormal = normalize(FrameBuffer::WorldToView(worldNormal, false, eyeIndex)); + viewNormal = float3(viewNormal.xy, -abs(viewNormal.z)); + worldNormal = normalize(FrameBuffer::ViewToWorld(viewNormal, false, eyeIndex)); +# endif # if defined(SPARKLE) float3 projectedNormal = normalize(mul(tbn, float3(ProjectedUVParams2.xx * normal.xy, normal.z))); @@ -2512,7 +2517,7 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) } # if defined(SCREEN_SPACE_SHADOWS) && defined(DEFERRED) - if (!SharedData::InInterior) + if (!SharedData::InInterior && dirLightAngle >= 0.0) dirDetailedShadow *= ScreenSpaceShadows::GetScreenSpaceShadow(input.Position.xyz, screenUV, screenNoise, eyeIndex); # endif