From 25085fd4b423dabbe9f352976ffd91851c0da942 Mon Sep 17 00:00:00 2001 From: FIocker <4461558+FIocker@users.noreply.github.com> Date: Sat, 30 May 2026 20:45:56 +0200 Subject: [PATCH 1/2] fix(emat): preserve parallax for grayscale complex masks --- package/Shaders/Lighting.hlsl | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index 60d66b7ecf..ca140bc0b9 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1110,16 +1110,13 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) if (SharedData::extendedMaterialSettings.EnableComplexMaterial) { const float kMaskEpsilon = (4.0 / 255.0); - complexMaterial = TexEnvMaskSampler.SampleLevel(SampEnvMaskSampler, uv, 15).w < (1.0 - kMaskEpsilon); - - // Detect texture saved in the wrong format - if ((abs(envMaskSample.x - envMaskSample.y) < kMaskEpsilon) && - (abs(envMaskSample.x - envMaskSample.z) < kMaskEpsilon) && - (abs(envMaskSample.y - envMaskSample.z) < kMaskEpsilon)) - complexMaterial = false; + float4 mipSample = TexEnvMaskSampler.SampleLevel(SampEnvMaskSampler, uv, 15); + float mipAlpha = mipSample.w; + complexMaterial = mipAlpha < (1.0 - kMaskEpsilon); if (complexMaterial) { - if (envMaskSample.w > kMaskEpsilon && envMaskSample.w < (1.0 - kMaskEpsilon)) { + // Height maps can hit 0 or 1 locally, so decide POM at material level + if (mipAlpha > kMaskEpsilon) { complexMaterialParallax = true; mipLevel = ExtendedMaterials::GetMipLevel(uv, TexEnvMaskSampler, screenNoise); uv = ExtendedMaterials::GetParallaxCoords(viewPosition.z, uv, mipLevel, viewDirection, tbnTr, screenNoise, TexEnvMaskSampler, SampTerrainParallaxSampler, 3, displacementParams, pixelOffset @@ -1136,6 +1133,12 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) } envMaskBase = complexMaterialColor.x; } + + // Disable complex lighting for grayscale RGB masks without blocking alpha-driven POM + if ((abs(mipSample.x - mipSample.y) < kMaskEpsilon) && + (abs(mipSample.x - mipSample.z) < kMaskEpsilon) && + (abs(mipSample.y - mipSample.z) < kMaskEpsilon)) + complexMaterial = false; } # endif // ENVMAP From 0427e190e26a33c25440b28dfe70b4a5588c9cc2 Mon Sep 17 00:00:00 2001 From: FIocker <4461558+FIocker@users.noreply.github.com> Date: Sun, 31 May 2026 22:51:05 +0200 Subject: [PATCH 2/2] fix(emat): allow solid-black height-only masks --- package/Shaders/Lighting.hlsl | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index ca140bc0b9..6c4d1ee2af 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1110,13 +1110,21 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) if (SharedData::extendedMaterialSettings.EnableComplexMaterial) { const float kMaskEpsilon = (4.0 / 255.0); - float4 mipSample = TexEnvMaskSampler.SampleLevel(SampEnvMaskSampler, uv, 15); - float mipAlpha = mipSample.w; - complexMaterial = mipAlpha < (1.0 - kMaskEpsilon); + const float4 mipSample = TexEnvMaskSampler.SampleLevel(SampEnvMaskSampler, uv, 15); + complexMaterial = mipSample.w < (1.0 - kMaskEpsilon); + + const bool grayscaleMask = (abs(mipSample.x - mipSample.y) < kMaskEpsilon) && + (abs(mipSample.x - mipSample.z) < kMaskEpsilon) && + (abs(mipSample.y - mipSample.z) < kMaskEpsilon); + // Preserve height-only masks while rejecting grayscale environment masks + const bool solidBlackHeightMask = all(mipSample.xyz < kMaskEpsilon) && + mipSample.w > kMaskEpsilon && + mipSample.w < (1.0 - kMaskEpsilon); + if (grayscaleMask && !solidBlackHeightMask) + complexMaterial = false; if (complexMaterial) { - // Height maps can hit 0 or 1 locally, so decide POM at material level - if (mipAlpha > kMaskEpsilon) { + if (envMaskSample.w > kMaskEpsilon && envMaskSample.w < (1.0 - kMaskEpsilon)) { complexMaterialParallax = true; mipLevel = ExtendedMaterials::GetMipLevel(uv, TexEnvMaskSampler, screenNoise); uv = ExtendedMaterials::GetParallaxCoords(viewPosition.z, uv, mipLevel, viewDirection, tbnTr, screenNoise, TexEnvMaskSampler, SampTerrainParallaxSampler, 3, displacementParams, pixelOffset @@ -1133,12 +1141,6 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) } envMaskBase = complexMaterialColor.x; } - - // Disable complex lighting for grayscale RGB masks without blocking alpha-driven POM - if ((abs(mipSample.x - mipSample.y) < kMaskEpsilon) && - (abs(mipSample.x - mipSample.z) < kMaskEpsilon) && - (abs(mipSample.y - mipSample.z) < kMaskEpsilon)) - complexMaterial = false; } # endif // ENVMAP