feat: CSM 软阴影——sampler2DShadow 硬件 PCF + 3×3 纹素 tap

- 阴影采样器开启硬件深度比较(compareOp=eLess + linear filter):
  单次采样 = 2×2 深度比较插值,clamp-to-border 白色语义不变
- ShadowFactor 改 3×3 纹素偏移 tap(等效 36 次比较),影中保留
  0.3 环境感并按 PCF 结果插值——阴影边缘软过渡,消除二值硬边锯齿
This commit is contained in:
2026-09-23 23:18:36 +08:00
parent 960bdf2662
commit 8c0a11d2e8
2 changed files with 32 additions and 14 deletions
+5 -2
View File
@@ -103,7 +103,9 @@ namespace Engine::Passes
ENGINE_FATAL("SceneGpu: failed to create shader objects");
}
// 阴影采样器:clamp-to-border 白色 = 光视锥之外无阴影
// 阴影采样器:clamp-to-border 白色 = 光视锥外自动无阴影
//(省 shader 出界分支);开启硬件深度比较(sampler2DShadow)
// ——单次采样即 2×2 PCF,配合 shader 3×3 tap 得软阴影
vk::SamplerCreateInfo shadowSamplerInfo;
shadowSamplerInfo.setMagFilter(vk::Filter::eLinear)
.setMinFilter(vk::Filter::eLinear)
@@ -113,7 +115,8 @@ namespace Engine::Passes
.setAddressModeW(vk::SamplerAddressMode::eClampToBorder)
.setBorderColor(vk::BorderColor::eFloatOpaqueWhite)
.setUnnormalizedCoordinates(VK_FALSE)
.setCompareEnable(VK_FALSE);
.setCompareEnable(VK_TRUE)
.setCompareOp(vk::CompareOp::eLess);
shadowSampler = device.GetDevice().createSampler(shadowSamplerInfo);
// per-slot 描述符分配 + Set0 绑定(buffer 句柄全程稳定,不用重绑)