这是“Demystifying the PVS”系列的第四篇也是最后一篇。主要内容如下:
- 系列内容概述:已构建有向门户图,计算每个门户的可能可见叶列表,学会通过三个门户序列估计可见性,将三者混合得到最终叶到叶的可见性。
递归裁剪示例:以三个门户(源、通过、目标)为例,通过裁剪测试门户序列的可见性,深度优先遍历从目标叶开始,递归进入相邻叶。
- Python 中的门户流:
portal_flow
函数启动遍历,leaf_flow
函数递归处理叶,通过一系列裁剪和判断来确定可见性,mightsee
数组记录过滤后的门户到叶的可见性。 - 完整实现:代码实现了门户到叶的可见性矩阵计算,包括裁剪、过滤、早期退出测试等,处理过程中考虑了门户的循环和稀疏性。
- 按复杂度处理门户:按复杂度(粗粒度可见性中可能可见的叶数量)顺序处理门户,先处理较小区域的门户,以利用其最终结果进行早期退出。
- Python 中的门户流:
- 通过门户的叶可见性:叶的潜在可见集是其离开门户的 PVS 集合的并集,通过逻辑或操作计算最终的叶到叶可见性矩阵
final_vis
。 - 游戏中的应用:
vis
工具将最终叶到叶的可见性矩阵写入mapname.bsp
文件,游戏中按需解压缩,节省内存。 - 提高速度的方法:
vis.py
速度较慢,可进行多进程处理、使用边界球测试、更快地过滤mightsee
数组、缓存等优化。 回顾与思考:
- 预计算可见性使 Quake 地图在保持稳定帧率的同时增加多边形,PVS 在 Quake 及其后续作品中广泛应用。
- 工作流上,PVS 不佳,设计师需等待游戏测试,且需考虑无关技术概念;营销上,稳定帧率有助于销售虚幻世界的幻觉,但可能导致游戏设计受限。
- Doom 3 采用运行时测试门户和加载时 PVS 的方法,速度较快,但仍需放置门户和密封关卡。
- 资源与参考:提供了
vis.py
仓库、相关工具、原始代码参考、视频资源以及测试地图和门户数据等。 - 致谢:感谢相关人员的帮助和支持。还考虑写一本书并征集感兴趣的人。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。