标签为“Point Light”的页面如下
2026-04-27
KisekiEngine 点光源阴影排查:从单张透视 Shadow Map 到 6 面 Shadow Map Array
开源项目地址:https://github.com/sznswjr/kiseki_engine
相关提交:6b97d64 Refactor point light shadow mapping
背景 KisekiEngine 的 garden scene 里有房子、树、围栏、长椅、邮箱和地面。前一轮已经实现了基础 Blinn-Phong 光照、纹理、OBJ 加载和一张 2D shadow map。最初看起来阴影已经出现了,但继续观察就会发现两个问题:
围栏、立柱这类细长物体在地面上的阴影缺失或不完整。 改成点光源 cubemap 思路后,地面阴影又出现过位置错乱。 这两个现象很容易被误判成 bias、PCF 或 shadow map 分辨率问题。实际根因更底层:光源类型、shadow map 投影模型和 cubemap face 坐标约定没有匹配好。
这篇文章记录这次排查和重构过程。
问题一:围栏阴影为什么会缺失 最早的实现方式是:把 shadow camera 放在点光源位置,然后使用一张 2D 透视 shadow map。
这听起来合理,因为点光源确实有一个位置。但透视 shadow map 表达的是一个视锥,它天然适合 Spot Light,不适合完整的 Point Light。
点光源向所有方向发光。单张 2D shadow map 最多只能覆盖一个方向的锥形区域。为了让它“尽量覆盖当前场景所有物体”,只能不断扩大 FOV。
在这个场景里,点光源位于:
scene.light.position = {3.0f, 8.0f, 4.0f}; 围栏位于地面南侧:
addOBJObject(scene, fenceMesh, modelTexture, (simd_float3){i * 2.
继续阅读