预先计算的可变量
原文地址http://timhobsonue4.snappages.com/culling-precomputed-visibility-volumes
预计算可见性量的主要好处是它将根据它们在世界上的位置存储Actors的可见性。这对于不支持硬件遮挡查询的移动平台非常有用,并且在渲染线程瓶颈方案(如控制台上的分屏)中保存渲染线程时间。预计算可见性减少了游戏中渲染线程时间,但代价是增加了运行时内存和照明构建时间。它通过减少动态遮挡系统(硬件遮挡查询)必须处理的基元数量来节省渲染线程时间,并且因为它可以立即工作,而动态遮挡系统需要时间收敛,这通常意味着性能不佳转角或快速旋转视图。此技术仅适用于中等大小或更小的级别,因为内存和计算要求随着级别大小而增长。它也仅适用于大多数静态环境,受限制的玩家移动和某些2D游戏区域的游戏。
设置游戏以使用预计算可见性
由于比例依赖于游戏,因此需要针对每个游戏调整可见性计算的参数。它们位于 Engine / Config文件夹 中BaseLightmass.ini的DevOptions.PrecomputedVisibility部分 。如果您希望这是您的游戏项目的默认设置,您可以使用DevOptions.PrecomputedVisibility部分和已编辑的值将DefaultLightmass.ini文件添加到项目Config的文件夹中。 调整的主要设置是:
| 属性 | 描述 |
| PlayAreaHeight | 这是相机可以在表面上方的高度。这通常是你最高的球员眼球高度加上他们的跳高。默认值为220。 |
您无需重新启动编辑器即可更改配置文件。您只需进行编辑并保存config .ini文件即可生效。
在下面的示例中,角色的高度为192个单位。由于模板字符可以跳过高于PlayAreaHeight的值,因此建议在此实例中将其调整到更高的高度。重建照明后,可见性单元格(蓝色框)将调整为配置文件中的高度。
| PlayAreaHeight:220(默认) | PlayAreaHeight:500 |
设置级别以使用预计算可见性
首先, 通过从“ 模式” 面板中拖动一个或多个 预计算可见性体积围绕级别的游戏区域 。这些不必是矩形或轴对齐,任何画笔形状都可以。它们应尽可能紧密地绑定游戏区域,以实现最佳内存使用和构建时间。
接下来,您可以在“ 世界设置” >“ 预计算可见性”部分中启用 预计算可见 性 ,然后点击主工具栏中的“ 构建” 按钮,为您的关卡构建照明。 现在,当您的相机位于可见性单元格内时,渲染器将剔除任何被确定为被遮挡的对象。
可见性单元格 放置在已放置的预计算可见性体积内的阴影投射几何体上方,并沿着Matinee相机移动轨迹放置,即使它们位于可见性体积之外。预计算可见性仅在查看器位于其中一个单元格内时才有效,因此大多数情况下,当您在编辑器中飞行时,它将不会处于活动状态。
此图像显示放置在Infinity游戏市场中免费提供的Infinity Blades:Grass Lands包中绿色能见度体积内的表面上的蓝色能见度单元格 。
此图像显示沿着日场相机移动轨迹放置的蓝色可见性单元格:
为了使预计算可见性起作用,您需要构建场景。您可以使用“构建”图标旁边的下拉箭头,然后选择“ 预计算静态可见性”。
可视化预先计算的可见性单元格
要在预计算可见性体积内可视化单元格放置,只需使用 视口中的 显示 > 可视化 > 预计算可见性单元格选项即可启用此视图。
如果尚未在“世界设置”中启用“预计算可见性”,或者为该级别启用了内置照明,则无法看到可见性单元格。此外,如果您已调整卷的位置或设置,则还必须重建光照以使其生效。
设置
可见性设置
| 属性 | 描述 |
| 预计算可见性 | 是否将可见性单元格放置在预计算可见性卷内以及此级别的摄像机轨迹中。预计算可见性以某些运行时内存为代价减少了渲染线程时间,并略微增加了照明构建时间。 |
| 仅沿着摄像机轨道放置单元格 | 启用此功能后,可见性单元格将仅沿摄像机轨道放置。 |
| 可见细胞 | x和y中预先计算的可见性单元的世界空间大小。较小的尺寸可以增加运行时内存使用和照明构建时间,从而产生更有效的遮挡剔除。 |
| 可见性攻击性 | 确定预先计算的可见性应该是多么激进。更激进的设置会剔除更多对象,但也会导致更多可见性错误,如弹出。 |
相关统计数据
有一些相关的统计数据可以帮助您了解预计算可见性的有效性。您可以调出控制台窗口并输入控制台命令 Stat InitViews。
在下面你会想看看统计的图像 静态遮挡的图元 和 闭塞元 确定如何以及预计算可见正在为您的场景时。
这些统计数据在游戏或PIE中最可靠,而不是在编辑器中,因为在编辑器中绘制了所有调试内容。
| 统计 | 描述 |
| 静态封闭的原始 | 这显示了在截锥体剔除发生后,预先计算的可见性确定了多少原始图像是不可见的。仅当摄像机视图位于可见性单元格内时,才会显示此信息。 |
| 封闭的原始人 | 这显示了预先计算的可见性和动态遮挡系统都确定了多少原始图像是不可见的。 |
| 解压缩遮挡 | 这显示了解压缩预计算可见性所花费的时间。大容量或更小的单元大小会增加使用的内存,这将影响解压缩所需的时间。 |
这两个统计数据之间的差异是动态遮挡系统剔除了预先计算的可见性错过的原始数量。当预计算可见性运行良好时, 静态遮挡基元 应在Occluded基元的 50-80%范围内 。预计算可见性会剔除较少的对象,因为它存储大型单元格的信息,并且不处理动态或屏蔽的遮挡物(请参阅“限制”部分)。
您可以提出的另一个统计视图是游戏中的 统计 记忆 。这将显示为游戏分配内存使用情况的位置。通过记录预计算可见性内存的统计信息,您可以查看预计算可见性正在使用的 内存量。
该统计数据在PIE中不可靠。相反,在编辑器或游戏中检查它,因为它在PIE时计算PIE和编辑器内存。
| 统计 | 描述 |
| 预计算可见性记忆 | 显示预计算可见性使用的运行时内存量。 |
预计算的可见性覆盖量
如果不希望自动生成PrecomputedVisibilityVolume的结果,则预计算可见性覆盖卷可让您手动覆盖其在世界中的位置的Actors /级别的可见性。
| 属性 | 描述 |
| 预计算可见性覆盖量 | |
| 覆盖Visibile Actors | 这是一个演员阵列,在此卷中查看时,预计算可见性始终被视为可见。 |
| 覆盖隐形演员 | 这是一系列演员,从该音量内部查看时,预计算可见性始终被视为不可见。 |
| 覆盖隐形级别 | 这是一个级别名称数组,当在此卷中查看时,其预计算可见性始终被视为不可见。 |
限制
当前预计算可见性的实现具有以下限制:
- 不处理可移动物体或可移动封堵器
- 不处理非不透明的遮挡物,因为遮盖的遮挡物通常具有难以检测的小孔。
- 只将细胞放在表面上方,因此具有飞行模式的游戏不会带来太多好处
- 不能有效地处理流级别,所有数据都存储在持久级别中,而不是与流级别一起流入和流出
- 只有静态阴影投射三角形才会遮挡。这意味着光照贴图的interpactor会在不应该遮挡的时候遮挡,而不投射阴影的不可移动的对象也不会遮挡。
调试可见性问题
调试预先计算的可见性问题时,有一些控制台命令可能会有所帮助:
| 属性 | 描述 | |
| r.AllowPrecomputedVisibility | 如果为0,则预计算可见性将不会用于剔除基元。 | |
| r.ShowPrecomputedVisibilityCells | 如果不为0,则将在预计算可见性卷中绘制所有预先计算的可见性单元格。 | |
| r.ShowReleveantPrecomputedVisibilityCells |
|
如果对象消失并将 r.AllowPrecomputedVisibility设置 为0导致它们显示,则预计算可见性导致问题,您需要调整现有卷或添加新卷以确保完全覆盖该区域。您还可以使用预计算的计算覆盖卷来覆盖任何不必要的遮挡。