2

我有点进退两难,我敢肯定我不是第一个遇到这个问题的人。

我正在尝试为具有多个房间的办公楼建模。我希望玩家能够打开/关闭每个房间的灯。以下是我遇到的问题:

问题 1:使用前向渲染时,我不能使用阴影,因此我的点光源会从墙壁漏出(即关闭灯的房间不是漆黑的,因为它们正在接收来自相邻房间的光)。

解决方案:最初,我通过两次光照映射我的场景来解决这个问题 - 一次打开灯,一次关闭灯。当玩家关闭灯光时,我将房间中的所有渲染器切换为全黑光照贴图并关闭灯光。

问题2:上述解决方案还不错,但是我所有的动态对象仍然接收到通过墙壁泄漏的光。我想我可以使用 lightprobes 解决这个问题。但是,我不确定如何更改单个探针的光照贴图(即房间内的探针使用关闭光照贴图,房间外的探针使用开启光照贴图)。

如果我使用带有阴影的延迟照明,一切都会很好,但我的 fps 从 60 下降到 ~20。

谢谢

4

1 回答 1

3

拥有两个光照贴图确实是一种解决方案,但会将您限制在静态漫反射场景中。其他任何东西(移动物体或镜面场景)都需要更高级的技术。

  • 一个简单廉价的解决方案是使用“单元和门户”(例如,本文)并保留您的第一个解决方案。这种方法构建了一个表示不同房间之间链接的图表,并且应该防止光线泄漏 - 至少是近似的。

  • 更好的解决方案是使用阴影贴图。您基本上从每个光源的角度渲染场景的深度图一次(如果准时!),然后一个简单的测试允许您确定当前点是否在阴影中。如果您有很多房间,您当然可以将此方法与单元和门户分解合并以加快计算速度。

  • 一个可能更好的解决方案是使用影子卷。这种方法计算每个光锥(或聚光灯具有的任何形状)与场景的几何形状之间的几何交集。使用它,您可以确定当前点是在阴影体积内部还是外部。

如果您在网上搜索,所有这些都已扩展到软阴影。

于 2013-03-09T00:03:05.133 回答