UDN
Search public documentation:

PrecomputedVisibilityCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 主页 > 渲染 > 预计算可见性
UE3 主页 > 移动设备主页 > 预计算可见性

预计算可见性


文档变更记录:由 Daniel Wright 创建。

概述


关于 cl 572477(将会记录在 QA_APPROVED_BUILD_AUG_2010 中),UE3 可以在光照构建过程中预计算可见性。

预计算可见性的主要优点是适用于不支持硬件遮挡查找的移动平台,在渲染线程瓶颈情景(例如,游戏机平台上的分屏)中节省渲染线程时间。预计算可见性会减少游戏中的渲染线程时间,但是代价是稍稍增加了运行时内存和光照构建时间。它会通过减少必须由动态遮挡系统(硬件遮挡查询)进行处理的图元数目节省渲染线程时间,而且还有个原因该系统可以立即作用,然而动态遮挡系统需要时间才能汇合,通常这意味着差性能会快速转向某个角或旋转视图。该技术只适用于中等规格或更小的的关卡,因为内存和计算需求会随着关卡规格增大而增加。它还适用于包含大部分静态环境、受限的玩家活动以及 2d 游戏区域的游戏。

注意: 构建预计算可见性需要 Lightmass 。‏

将游戏设置为使用预计算可见性


由于缩放比例与游戏本身相关,所以需要为每个游戏调整可见性计算的参数。这些参数在 BaseLightmass.ini 中的 DevOptions.PrecomputedVisibility 部分。游戏通过在其 DefaultLightmass.ini 中创建一个 DevOptions.PrecomputedVisibility 部分覆盖这些参数。需要调整的主要设置是:

  • PlayAreaHeight - 相机可以在表面上方的高度。这通常是最高的玩家眼睛高度 + 跳动高度。默认值是 220。

将关卡设置为使用预计算可见性


首先,在您的关卡游戏区域放置一个或多个 PrecomputedVisibilityVolume(预计算可见性体积)。这些不需要是矩形或中心线对齐,任何画刷形状都可以。为了得到最佳内存使用及构建次数,它们应该尽可能与游戏区域紧密相连。

VolumeMenu.jpg

下一步,在 View(视图)->WorldInfo(世界信息)->PrecomputedVisibility(预计算可见性)下方启用 bPrecomputeVisibility(预计算可见性),然后为您的关卡构建光照。当相机在可见性单元格内部时,渲染器将剔除任何已确定被遮挡的对象。

单元格放置


可见性单元格就放置在您已放置的 PrecomputedVisibilityVolume(预计算可见性体积)内部阴影投射几何体上方,而即使它们在可见性体积外部,也会沿着 matinee 相机活动轨迹放置。只有在观察者在这些网格单元其中一个的内部时,才可以使用预计算可见性,所以当您在编辑器中到处乱动时,大多数情况不会激活该项功能。

在 UDK 的 DM-Sanctuary 中,该图片会显示放置绿色可见性体积内表面上的蓝色可见性单元格:

CellPlacementSmall.jpg

该图片会显示沿着 matinee 相机活动轨迹放置的蓝色可见性网格单元:

CellPlacementCameraTrackSmall.jpg

可视化结果


编辑器可以将一个视图看作是另一个视图‘遮挡父代’,请参阅遮挡预览。我们也可以将此项功能用于可视化预计算遮挡。

  1. 首先,设置关卡预计算可见性和构建光照。
  2. 设置您的视口。1x1 垂直分屏可以正常工作。所有视图需要启用实时更新。将您的透视图视口移至游戏区域内(在可视性体积内部,稍微靠近地面),这样它才会处于一个单元格内部。您将会知道,当您在控制台上输入‘stat initviews’并为透视图启用统计时,为‘Statically Occluded Primitives(静态遮挡的图元)’赋予一个非零值的情况下,它才会有用。
  3. 将‘ToggleOcclusion(触发遮挡)’键入控制台,关闭动态遮挡系统。您的记录中应该会收到‘现在已禁用遮挡查询’消息。这将会使我们只浏览预计算遮挡的结果。
  4. 在透视图视图中,单击视口下拉菜单中的‘视图踢除/遮挡’。

现在,在边框视图上会将透视图的平截头体绘制为粉色,而您可以通过预计算的遮挡看到确定为可视的网格物体。

该场景会显示预计算可视性剔除 2487 图元(下面是‘Statically Occluded Primitives(静态遮挡的图元)’统计数据),它隐藏在右侧的边框中:

OcclusionPreviewOn.jpg

下面是同一场景,只是将相机稍稍移向任意可见性网格单元的外侧,所以不会发生遮挡,注意右侧边框中的新网格物体:

OcclusionPreviewOff.jpg

可见性设置


Settings.jpg

相关统计数据


  • 进行平截头体踢除之后,‘stat initviews’下方的‘Statically occluded primitives(静态遮挡的图元)’会显示通过预计算可视性确定为可视的图元数目。‘Occluded primitives(遮挡的图元)’会显示通过预计算可见性和动态遮挡系统确定为不可视的图元数目。这两种统计数据的不同之处是,动态遮挡系统确定的图元数目已剔除预计算可见性遗漏的数目。当预计算可见性正常工作时,‘Statically occluded primitives(静态遮挡的图元)’的数目应该在‘Occluded primitives(遮挡的图元)’的 50-80% 之间。预计算可见性会剔除相对较少的对象,因为它会为大型网格单元存储信息,而不会处理动态或遮罩的遮挡物(请参阅“限制”部分)。*请注意:* 该统计数据在游戏或 PIE 中最可靠,在编辑器中并没那么可靠,这是因为所有调试材料都与编辑器有关。
  • ‘stat initviews’下方的‘Decompress Occlusion(解压缩遮挡)’会显示解压缩预计算可见性所用时间。
  • ‘stat memory’下方的‘Precomputed Visibility Memory(预计算可见性内存)’会显示预计算可见性所用的运行时内存。*请注意:* 该统计数据在 PIE 中并不可靠,请转而在编辑器或游戏中查看,因为在 PIE 中 PIE. 和编辑器内存都要计算。

结果


这些来自于一个包含适宜遮挡物的战争机器 3 MP 关卡(没有很多小孔的大型不透明遮挡物),在分屏中,两个视图都面向地图中心:

  • 1739 图元已经静态地遮挡了超出 2180 个遮挡总数
  • 在 Xbox 360 上,使用预计算遮挡可以节省 2.7 毫秒的渲染线程时间(不使用预计算遮挡大概需要 35.4 毫秒 ->32.7 毫秒)。注意,使用预计算可见性的主要优点是立即作用,而动态遮挡系统要过一会才可以集中汇合。所以第一次拐弯或快速旋转视角的时候帧时间最好应该启用预计算可见性,但是准确估计这些情况很难。
  • 预计算可见性数据 627Kb
  • 移动到一个新的区域并解压缩该区域的遮挡时,会有 1 毫秒的短暂帧停顿

限制


当前,进行预计算可见性有以下限制:

  • 无法处理可移动对象或可移动遮挡物
  • 无法处理非不透明遮挡物,因为遮罩的遮挡物通常会有难以检测到的小孔
  • 只会将网格单元放置在表面上方,所以对于具有飞行模式的游戏益处不大
  • 无法有效地处理动态载入关卡,所有数据都存储在永久关卡中,而不是使用动态载入关卡载入载出
  • 只会遮挡静态阴影投射三角形。这就意味着一个光照贴图的 interpactor 会在它本不应该遮挡的时候会遮挡,而不会投射阴影的不可移动对象也会在本该遮挡的时候不遮挡。

这些可能会在以后的版本中有所改进。

调试可见性问题


这里有一些在调试预计算可视性问题时会有所帮助的控制台命令

  • TogglePrecomputedVisibility - 启动使用预计算可见性数据。
  • ShowPrecomputedVisibility - 启动预计算可见性单元的调试可视化。

如果您的一些物体渐渐变得模糊,而 TogglePrecomputedVisibility 要显示它们,那么预计算可见性就会引发一些问题,您将需要调整现有的 PrecomputedVisibilityVolumes 或添加新的 PrecomputedVisibilityVolumes,确保完全覆盖这块区域。