咬合剔除简介

介绍

在游戏中渲染3D世界视图时,不可避免地浪费在处理玩家看不见的元素上的资源。 这些资源可以更好地用于增加可见元素的视觉复杂性或减少制作框架所需的时间。 为此,我们必须确定播放器不可见的对象。 确定由于被特定元素前面的元素所遮蔽而从特定角度看不见的元素集称为遮挡剔除。

在实时交互式应用程序中,传统上将遮挡剔除用作渲染优化技术。 它允许以产生连续运动感觉的速率生产框架。 但是,除了纯渲染外,可见性信息还有多种用途。 了解对象当前是否可见可用于:

  • 影响AI行为
  • 简化或禁用物理模拟和动画
  • 减少在网络上复制播放器位置所需的网络流量。

在评估遮挡剔除系统的价值时,一些理想的属性是:

它可以自动通用

理想情况下,遮挡剔除系统可以自动处理任何类型的3D内容,从简单的对象查看器到庞大的虚拟世界,而无需艺术家来构建和建模游戏世界。 此外,该系统不应限制艺术家的创造力。 最后,系统不应依赖于任何特定的硬件功能,渲染约定或创作方法或工具。

保守地讲是正确的

有时确定完全或部分可见的对象被完全遮挡的系统必然会产生渲染伪像,而有时报告完全被遮挡的对象可见的系统通常可以生成正确的视觉输出。

它增加了价值

出于渲染目的,必须根据简单渲染视锥中的所有内容的参考解决方案来判断遮挡剔除。 例如,基于竞技场的体育游戏在任何给定时间仅遮挡了少量的全部内容,因此对于遮挡系统而言并不是一个好的选择。 由于无法获得任何好处,因此浪费在确定咬合上的精力被浪费了。 但是,当需要复杂的3D世界中的视觉复杂性和大量细节时,遮挡系统的好处开始显着增加。在本文中,我们首先简要介绍问题领域,并了解一下当前用于遮挡的流行方法淘汰,突显了他们在游戏开发环境中所面临的挑战。 然后,我们描述了一种新颖的遮挡剔除方法,旨在满足合作伙伴和客户构建下一代游戏引擎的需求。

这种方法称为Umbra 3遮挡剔除系统。

背景

3D图形中遮挡剔除的根源在于隐藏线和隐藏表面确定算法。 这些算法对于在3D空间中生成2D投影的视觉正确图像是必需的。

这个问题很容易解决-从世界表面朝向您的眼睛传播的光线中,只有那些不会在途中遇到障碍的光线才有助于最终图像。 这是可见性问题的一个实例,该提法很容易为3D渲染提出了一种可能的解决方案:我们可以简单地将光线从眼睛中追溯回去,并找到每条光线与之相交的第一表面。

所有现代的多边形栅格化渲染器(包括软件和硬件)都跟踪每个样本的最小距离值,并且仅在遇到小于当前最小值的距离值时更新样本。 这种解决方案称为Z缓冲或深度缓冲,用于保持Z值的附加缓冲区。 给定2D投影和栅格采样已经完成的工作量,Z分量的计算相对便宜,并且可以保证正确的视觉效果。 可以通过从前到后的顺序引入图元来减少计算:首先渲染给定样本的最接近的图元意味着深度测试可以拒绝所有其他图元沿着同一射线的贡献,因此,任何计算可以跳过用于确定隐藏样本的最终输出(例如插值顶点属性或进行纹理查找)的操作。

具有从前到后的原始渲染顺序的Z缓冲非常接近只为每个输出像素计算单个值的理想状态。 不幸的是,剔除在3D游戏应用程序的渲染流程中进行得非常晚。 在渲染器拒绝遮挡的样本时,样本已经历了图形流水线的多个阶段,从将输入几何图形和相关资源馈送到GPU进行逐顶点处理,三角形设置和栅格化。 渲染管线中存在用于早期Z剔除的方法,但最终通过将引擎的最大可渲染实体剔除后再将其输入到渲染子系统中,可以最大程度地节省计算量。传统上,遮挡剔除是指这种类型的渲染优化。

遮挡物栅格化

大多数运行时遮挡剔除策略通过对潜在被遮挡的单个对象或对象层次结构的转换范围进行等效于每个样本的深度测试,来判断对象是否可见。 挑战在于在实际渲染发生之前建立视图的深度缓冲区估计。

一种广泛使用的解决方案是使用单独的深度渲染通道或GPU上前一帧的深度结果,并使用遮挡查询。 遮挡查询返回可能通过深度测试的样本数,而无需实际处理或写入像素值。 这种方法的挑战在于,传输测试数据和获取遮挡信息所需的CPU和GPU之间的同步。 实际上,除了渲染优化之外,几乎不可能将这种方法用于其他任何事情。

好处是,在生成深度缓冲区时无需做任何额外的工作,并且它代表了任何类型的封堵器几何形状的确切最终图像。 为了使CPU和GPU异步运行并最大程度地减少它们之间的通信量,这些系统通常使用先前的帧深度缓冲区结果,因此不能保证保守的剔除。另一种方法是将封堵器几何形状的简化表示栅格化为CPU上较小的分辨率深度缓冲区。 为了获得保守的剔除,几何形状不得超过实际结果的栅格覆盖范围。 通常,内容美术师与真实模型并排手动创建这些遮挡模型。

潜在可见集(PVS)

当早期深度缓冲区生成和遮挡测试的运行时成本不可行并且封堵器几何形状大部分是静态的时,可行的替代方法是在预处理阶段确定并存储视图单元和可渲染实体之间的可见性关系。 从视图单元格确定可见的实体集称为潜在可见集。 运行时操作仅涉及查找当前摄像机位置的视单元并从内存中查找集合。 在简单的情况下,可见性关系可以由关卡设计人员手动构建,但是通常的方法是通过射线投射或在各个方向进行栅格化从视单元中采样可见性。 无论哪种情况,都难以保证保守的淘汰。 通过增加每个视图像元的样本数,可以以计算所需的时间为代价来管理错误量。 除了静态目标对象外,还可以将目标单元格形式的体积可见性信息存储在集合中,以具有剔除非静态实体的能力。

潜在可见集的生成可以自动进行,但是必须生成大量数据才能获得合理的剔除结果。 预处理阶段中的采样时间减慢了内容迭代周期,并且用于表示可见性关系的大量数据可能很快变得难以管理。 尤其如此,因为可见性关系本质上是全球性的。 封堵器几何形状的微小变化会导致可见度关系发生变化,并且远处在原始变化的所有方面,因此,有必要重新计算大面积的潜在可见度集。

门户和细胞

遮挡剔除系统的第三类基于将静态游戏世界划分为单元,并使用2D门户捕获相邻单元之间的可见性。 运行时操作是查找摄影机所在的单元格并遍历所形成的单元格图,通过将视锥平视图剪切到所遍历的门户来限制途中的可见性。 在预处理阶段将对象分配给单元,并通过访问对象所在的单元来确定其可见性。当世界上存在明显的关卡设计人员将门户放置在诸如门或门等热点时,这种方法最有效窗户在室内连接房间。

门户和单元数据是世界的简化阻塞模型,它存储非阻塞器及其连接而不是阻塞器。 虽然可以以相对轻的运行时成本获得准确和保守的遮挡结果,但是手动放置单元格和门户的工作非常费力,容易出错,并且极大地增加了内容修改的成本。

本影3:下一代遮挡剔除

Umbra 3遮挡剔除系统旨在克服前面各章中描述的挑战。

Umbra 3基于将3D世界从其详细的艺术家创建的多边形表示转换为简化的多边形的想法。 转换的重点是捕获基本的遮挡属性,同时忽略有关在遮挡剔除过程中没有相关性或相关性很小的细节的信息。 这种方法类似于手动构建的门户和单元图。 但是,Umbra 3使用的遮挡模型是自动生成的门户和单元图。

传统上,成功采用门户网站剔除的游戏世界经过精心设计,可以使少数门户网站捕获粗糙级别的遮挡信息:通过狭窄通道连接的空旷空间,其中大部分连通性发生在地平面上或附近。 通用解决方案不能对世界做出这样的假设,而必须在所有三个维度上使用任意复杂的拓扑。 需要大量的单元和门户来捕获具有单独遮挡特征的大型室外区域的遮挡。

Umbra 3由两个组件组成:

优化器

在预处理阶段,优化器已集成到游戏编辑器中。 它以任何类型的多边形汤为输入,并将整个场景离散为体素以生成视图单元。 然后,视图单元通过门户连接。 将门户和单元格图数据存储到优化的数据结构中,然后在运行时对其进行访问。

运行时组件

运行时组件光栅化了用于测试可见性的软件深度缓冲区。 它允许每帧进行大量动态对象测试,而计算成本却非常低。 该算法的准确性接近硬件遮挡查询的准确性,但是-纯粹是软件实现-没有基于硬件的遮挡剔除通常存在的任何同步和可移植性问题。

下图描述了概念性的Umbra 3架构:

自动生成的门户和单元图的工程挑战可以归纳如下:

  • 必须以允许控制图形大小与遮挡粒度的方式,将随机的多边形汤转换为代表性的门户和单元格图形。
  • 需要一种有效的运行时剔除方法。 它必须使用门户和单元图,并且能够处理相对大量的门户。 此外,它必须在固定或有限的内存中产生保守的剔除结果,并且必须做到足够快,以免在最小遮挡场景中成为瓶颈。

以下两章介绍了在Umbra 3遮挡剔除系统中实现的这两个挑战的解决方案。

遮挡数据生成

在较高级别上,通过构建原始的,均匀分布的初始门户图来生成3D场景的图。 通过删除对总体遮挡几乎没有贡献的数据,可以逐步简化此图。 输入的封堵器网格仅在初始单元格生成阶段中用于确定将单个体素或轴对齐框视为实心还是空的。

体素化使算法独立于几何复杂度; 结果仅需要保守地逼近实际几何图形这一事实使得这成为可能。

初始细胞生成

通过首先将场景几何图形细分为与轴对齐的网格来定义初始图形。 选择初始网格节点大小以匹配我们要对场景遮挡特征进行采样的粒度。 接下来,基于将体素与几何体相交,我们进一步将几何体细分为标记为实心或空的体素。

通过对空体素进行泛洪填充(即通过将相邻的空体素递归分组在一起),可使用体素在多维数据集中查找未连接的区域。 空体素集是我们图形的初始候选像元。 对于每个这样的空体素组,我们找到与立方体面的相交并将相交的轴对齐范围存储为门户矩形。 要将初始单元格连接到图形中,门户必须与在多维数据集面的另一侧生成的邻居门户相匹配。

使用几何体的离散体积表示的优点应该是显而易见的。 可以用数值鲁棒的方式将任意多边形数据与轴对齐的框相交,并且一旦形成体素,该算法就与输入数据的复杂性无关,并且只需要处理简单的整数网格即可。 因为我们追求的是保守的咬合表示,所以我们不必完全遵循几何形状,只要我们偏向保守的一面即可。

此方法的唯一例外是网格节点内的连接性确定。 网格数据中小于选定体素大小的孔不会被空体素路径捕获,也不会有助于连通性。 幸运的是,小的隔离的透明通孔相对罕见,在游戏中通常是不希望的。

如果此时我们掌握了静态目标对象的信息,则可以通过查找相邻的空体素所属的像元,以类似方式对它们的几何体素进行像素化并将对象分配给初始像元。 自然地,如果将相同的几何图形同时用作遮挡物和静态目标对象,我们可以节省一半的工作。

图形简化

如果我们在“门户和单元”图中找到具有最小遮挡值的门户,则可以通过组合门户连接在一起的单元格来删除门户。 此方法形成简化的图,可将丢失的总体遮挡信息最小化。 迭代地进行直至达到门限阻塞阈值或固定的内存预算,我们可以控制最终图形的成本效益比。

通过将门户网站连接的具有最差全局遮挡值的两个单元格组合在一起来实现最佳的图形简化,将需要进行昂贵的全局图分析,因为可见性本质上是全局属性。 但是,可以使用局部启发式方法来快速将最无用的门户网站剔除掉。 可以以分层的方式进行简化,随着我们在分层中向上扩展到更大的范围,可以降低门阻塞阈值。 在层次结构的每个新级别,我们都连接相邻卷的外部门户,并对新形成的组合图进行简化。

分层简化还提供了输出遮挡数据的详细程度版本的机会。 运行时算法可以根据与视点之间的距离,使用这些输出选择使用的遮挡级别。

查看树

门户和单元图可能变得非常复杂。 通过划分为相连的体素组并随后进行单元分组而形成的最终游戏单元,不再容易通过简单的几何形状捕获,并且即使是很小的场景,也无法存储完整的体素结构。 要将门户网站和单元格图用于运行时剔除,需要另一种数据结构来准确定位与图中的摄像机位置相对应的单元格。 该数据结构称为视图树。

简而言之,视图树的构建如下:

  • 属于同一单元的两个相邻的空体素可以折叠在一起,因为单独存储它们不会添加任何信息。 较大的空白区域可以折叠为视图树中与轴对齐的实体。
  • 在游戏应用中,不允许将相机任意靠近几何放置。 这确保了近裁剪平面不会与几何相交,因为那样会导致不必要的渲染结果。 因此,只要所得元素的大小不超过相机碰撞半径,我们就可以折叠属于单独单元的相邻实体素,甚至是空体素。
  • 最后,我们可以识别并简化不允许放入相机的体积中的体素组。这包括在墙内和地形下方形成的像元。

瓷砖

除了调整体素化的参数外,门户生成过程是自动的。 但是,可能需要一些时间才能完成。 从内容迭代的角度来看,这是不方便的,并且浪费了宝贵的艺术家和设计师时间。 内存使用也是一个问题。 未经简化的高分辨率体素化会消耗千兆字节的内存。

遮影3通过将世界划分为空间计算单元(图块)来避免此问题,这些计算单元可以彼此独立地进行计算。 然后可以以并行或分布式方式逐瓦计算世界。 仅当前处理的图块集需要用于高分辨率体素表示的内存。

由于门户网站生成过程是确定性的,因此也可以通过哈希输入来存储图块的计算结果。 这种方法支持增量更改,其中仅场景的更新部分需要重新计算。 结果也可以通过网络共享。 在运行时,可见性数据可以按图块流式传输。

运行时门户筛选

Umbra 3解决方案的另一个组件是运行时遮挡剔除算法。 该算法使用简化的遮挡模型来确定摄像机视图的可见性。

运行时剔除算法需要快速-完整的操作必须在几毫秒的时间内完成-才能满足以每秒60帧的速度运行的游戏中增加价值的要求。

由于已处理的门户网站图数据量可能很大,因此算法设计中的一个关键考虑因素是数据访问和缓存模式。 对于针对流并行数据进行了优化的硬件体系结构(例如PlayStation 3中的Cell处理器)尤其如此。

图遍历

自动生成的门户和单元图与传统的手工生成图从根本上没有什么不同。 因此,我们可以方便地使用传统的门户网站剔除算法,在将视锥从视图截断到所输入的门户网站时,递归遍历该图。 但是,这种遍历必须针对每个通向其中的可见路径访问每个单元一次。 在最坏的情况下,这会导致算法运行时间成指数增长,并导致灾难性的性能下降。

为了限制单元重入的数量,Umbra 3运行时剔除算法以一种广度优先的方式遍历该图。 代替几何门户求解器,软件光栅化用于将可见性信息收集到屏幕空间遮挡缓冲区中。 此方法几乎完全消除了过多的递归。 但是,考虑到从初始网格多维数据集构建单元的方式,甚至可能不存在真正的广度优先的单元处理顺序:图中的单元之间可能存在循环,别无选择,只能处理一次以上的单元。

为了缓解这种情况,将图形存储为盒形图块,每个图块包含数十到数百个单元格。 这些图块的生成方式可以在它们之间建立简单的前后顺序。 每块遍历还使图形数据访问在空间上是连贯的,因此对缓存友好。

切片的优势在于,处理完切片中的所有单元后,我们知道我们已经为所有单元积累了最终的可见性信息,因此可以安全地释放为捕获每个单元可见性而持有的任何资源。

门户栅格化

分层切片图遍历有助于管理在任何给定时间处于活动状态的单元格数量。 另一个重要的内存优化是阻塞缓冲区的数据布局。 同样,仅需要保守地正确的结果这一事实提供了一种经济高效的解决方案。 将门户矩形栅格化为低分辨率,每个样本1位的覆盖缓冲区。 缓冲区中的每个设置位代表通向该单元的不阻塞路径。

栅格化空白空间(门户)的概念,而不是代表遮挡的几何图形,乍一看似乎是非正统的。 但是,对变换后的四边形进行栅格化可以轻松保守地处理几何边。 光栅化程序针对门户边缘功能进行半空间测试,通过按层次划分屏幕矩形并针对矩形角像素进行测试,从而在较大的内部或外部区域节省了计算资源。 保守栅格化还允许基于运行时平台性能来缩放分辨率。

门户网站剔除算法所需的工作内存总量(包括遍历数据结构,输出深度缓冲区以及活动单元集的覆盖缓冲区)固定为85 KB。 这使其足够小以适合现代面向流的处理单元的本地存储器。

遮挡测试

通过查找覆盖缓冲区中是否存在与对象的屏幕空间边界重叠的可见像素,可以在遍历图形期间完成对驻留在单元格中的静态对象的遮挡测试。

在预处理阶段很容易将静态对象分配给单元,在此阶段我们可以负担体素表示的工作。 但是,我们要测试的任何动态实体将需要不同的解决方案。 为此,剔除算法会在遍历期间构建全局深度缓冲区。 根据当前的覆盖缓冲区,更新每个遍历单元的深度缓冲区,其中将单元边界框远距离用作深度写入值。 这样,在遍历期间,仅单个16位128×128深度缓冲区就需要保留在内存中。

从遍历输出单个深度缓冲区的能力使得可以在图形遍历后的任何时间进行动态对象遮挡测试。 如果要确定动画对象的确切位置和范围,同时进行门禁剔除遍历,则这一点尤其重要。

结论

当推开可以在游戏中表示的总体复杂性水平的界限时,准确的可见性信息是无价的资产。 确定从特定角度不可见的元素称为遮挡剔除。 已经开发出许多方法来解决遮挡剔除问题。 但是,每种传统方法都需要权衡取舍,因此,遮挡剔除仍然是活跃研究的领域。

Umbra 3遮挡剔除系统的设计旨在克服传统遮挡剔除解决方案中的取舍。 Umbra 3将任何类型的多边形输入场景自动处理为紧凑的运行时表示形式。 该表示可以用于有效且保守地正确的遮挡剔除。 关键方法是:

  • 体素化过程中的输入几何离散化
  • 运行时软件栅格化,可快速生成可见对象列表以及所需分辨率的保守深度缓冲区

门户图和运行时分辨率参数使系统可以从低端设备无缝扩展到高端设备。 因此,Umbra 3也是例如智能手机游戏的可行解决方案。

综上所述,Umbra 3能够从随机的多边形汤中构建大型3D游戏世界,而无需手动标记以提高可见度,同时始终保证保守地选择正确的淘汰结果。 Umbra 3还使可视性和空间推理信息可用于更广泛的游戏引擎子系统类别。 因此,世界各地的游戏开发人员(例如Bungie和许多其他人)在各种运行时平台的各种产品中使用Umbra 3。

想更多地了解Umbra技术? 请访问我们的网站www.umbra3d.com