光线追踪大量动态几何体

《Proceedings of the ACM on Computer Graphics and Interactive Techniques》:Ray Tracing Massive Amounts of Animated Geometry

【字体: 大 中 小 】 时间:2026年07月06日 来源:Proceedings of the ACM on Computer Graphics and Interactive Techniques 3.1

编辑推荐:

  摘要 我们提出了一种高效处理大量具有独特动画效果的复杂网格几何体的光线追踪方法。该方法利用四面体笼将原始的静态三角形几何体分割成互不重叠的三角形集合。对于每个四面体,会在其包含的三角形上构建加速结构,同时为所有四面体单独构建加速结构。我们并非对实际三角形几何体应用动画变换,而

  摘要
我们提出了一种高效处理大量具有独特动画效果的复杂网格几何体的光线追踪方法。该方法利用四面体笼将原始的静态三角形几何体分割成互不重叠的三角形集合。对于每个四面体,会在其包含的三角形上构建加速结构,同时为所有四面体单独构建加速结构。我们并非对实际三角形几何体应用动画变换,而是仅对这些四面体笼应用变换,并调整与动画四面体相交的光线路径。只需每帧重新构建一次所有四面体的加速结构即可。每帧处理动画几何体的成本仅取决于四面体笼的分辨率,与原始几何体的密度无关。该方法适用于保持三角形连通性的动画,通过四面体笼引导的分段线性变形来模拟顶点运动。实验表明,相较于其他动画方法,该方法在更新速度和内存占用方面更具优势,能够在当前一代GPU上实现大量复杂动画几何体的实时光线追踪。

AI总结(实验性)
该总结由自动化工具生成,未经文章作者撰写或审核。其目的是帮助读者发现相关内容、评估文章相关性,以及便于相关领域的读者理解研究工作。它是对作者提供的摘要的补充,而作者提供的摘要仍是论文的核心总结。完整文章才是最具权威性的版本。点击此处了解更多信息。点击此处对该总结的准确性、清晰度及实用性发表意见,您的反馈将有助于后续优化及新版本生成。要查看此AI生成的通俗版总结,需具备高级访问权限。

图1. 我们的基于四面体笼的方法可在AMD RX 9070 XT显卡上,以1080p分辨率、60帧/秒的速度,处理5.85亿个具有独特动画效果的三角形(均为独立动画对象,无实例化重复使用)。

1 引言
实时光线追踪动画几何体,尤其是三角形网格动画,不仅需要每帧为实际三角形应用动画效果,还需更新或重建这些三角形的加速结构。这一过程会带来较高的计算和内存开销,且开销与动画三角形的数量直接相关,因此为了控制在给定的帧时间和内存预算内,每帧可处理的三角形数量是有限的。在需保持60帧/秒或更高实时帧率的约束下,每帧用于处理动画及更新加速结构的时间仅有几毫秒。为降低每帧成本,常见的策略包括使用较低分辨率的细节层次结构、部分延迟更新加速结构,或选择性地重用动画几何体而非为每个对象应用独立动画。

我们提出了一种新方法,通过将动画处理成本与三角形密度解耦,来解决每帧可用动画几何体数量有限的问题。该方法聚焦于可变形动画,即保持三角形连通性不变,通过四面体笼引导的分段线性变形来模拟顶点运动。在预处理阶段,我们在原始静态几何体上构建低分辨率的四面体笼,将其分割成多个互不重叠的三角形集合。随后为每个四面体内的所有三角形构建加速结构,再为所有四面体构建顶层加速结构,从而形成两级加速结构体系。我们无需每帧为三角形应用动画变换,仅需为四面体笼应用变换,并每帧仅更新顶层加速结构。四面体内的三角形集合及其对应的加速结构永远不会被修改。光线首先通过顶层加速结构传播,每当遇到一个四面体时,会根据该四面体的变形情况生成一条经过独特变形的光线路径,再用这条路径去与底层静态加速结构进行交互。

四面体笼的分辨率与动画对象的三角形密度无关,且其三角形数量远少于对象中的总三角形数。这使得每帧的动画处理成本仅为传统方法的很小一部分,因为传统方法需要修改对象的所有三角形并更新相应的加速结构。同时,我们的方法所需内存也显著减少。当同一个三角形对象需要多次应用不同动画时,内存节省效果更为明显。得益于这些内存和时间上的优势,我们的方法能够实时处理大量具有独特动画效果的几何体,这是此前无法实现的。

我们的贡献包括:
• 通过应用四面体笼,将动画复杂性、BVH内存占用以及更新时间与三角形密度解耦,从而提升动画几何体的光线追踪效率。
• 提出了两种基于四面体笼的动画几何体光线追踪算法:第一种利用光线-实例变换提升效率,第二种通过相对4D几何结构和边界体积编码确保结果的精确性。
• 将这些算法与DXR管线相结合,便于在当前一代GPU上实现应用。

2 相关工作
光线追踪动画内容需要不断更新底层加速结构。近年来,边界体积层次结构已成为光线追踪领域最常用的加速结构,研究人员也提出了多种不同的BVH构建算法[Meister等人,2021]。对于运动范围较小的动画,由于更新成本较低,从叶子节点到根节点逐步重构BVH已成为首选方案。而对于需要处理物体碎裂等复杂几何变换的场景,则需要耗时更长的BVH重构操作来维持加速结构的质量。另有研究尝试通过采用懒惰构建策略[Hunt等人,2007;Lee和Liktore,2020],或逐步修改现有BVH的拓扑结构[Karras和Aila,2013;Kensler,2008],来降低BVH的更新/重构成本。

诸如DXR[Microsoft,2020]和Vulkan-RT[Khronos Group,2020]之类的实时光线追踪API采用了两级加速结构体系:每个对象拥有一个底层加速结构(BLAS),而所有对象实例则共享一个顶层加速结构(TLAS)。当对象内的三角形发生变化时,需要重构BLAS;而当对象实例本身或对象整体发生变化时,则需要重构TLAS。大多数DXR或Vulkan实现都采用BVH作为加速结构,根据API的配置选项,可以实现完整的BVH重构或较为简单的BVH更新。

位移微网格技术[DMMs][Maggiordomo等人,2023]通过为分层编码的微网格提供隐式定义的BVH,避免了为几何体直接构建BVH的繁琐过程。Gruen等人[2024]提出了一种在动画场景中提升DMMs质量的方法。不过,由于DMMs的表示方式依赖于分段流形对象,其在处理真实世界场景时的适用性较为有限,因此尚未得到广泛推广。

近年来,由于基于集群的细节层次渲染技术[Brian Karis,2022]的兴起,人们越来越倾向于用小型三角形簇而非单个三角形来构建三角形网格。已有研究证明了基于集群的细节层次结构的可行性[Benthin和Peters,2023],同时也有团队提出了相关的实时API支持方案[Microsoft,2026;NVIDIA Corporation,2024]。这类集群结构在现有的两级层次体系中增加了第三层,因此在只有部分对象受到影响时,能够实现更精细的控制。

对于包含大量实例/对象的场景,每帧都重新构建顶层BVH可能会成为性能瓶颈。顶部分区机制[Khronos Group,2024]通过将对象集合分为受场景变化影响和不受影响的类别,降低了BVH构建的复杂度。这样一来,即使只有部分实例/对象发生了变化,也不必重新构建或更新整个BVH。

四面体笼作为一种用于3D物体的空间加速结构,在动画、变形、仿真领域得到了广泛应用[Alliez等人,2005;Jacobson等人,2011;Joshi等人,2007;Mezger等人,2003;Morrical等人,2023;Müller等人,2005],同时在光线追踪和加速结构相关研究中也有应用,其中一些方法还采用了非正交的局部参数化方式来实现路径遍历[Aman等人,2022;Kácerik和Bittner,2025;Lagae和Dutré,2008]。四面体在几何简洁性与定向边界框的方向精度之间取得了良好平衡。最近,Luton等人[Luton和Tricard,2025]提出了一种利用四面体笼对无网格但具有动画效果的物体进行光栅化的方法。我们的方法沿用了他们将变形变换应用于几何体静态姿态的基本思路,但将其拓展到了实时光线追踪领域。

更新或重构BVH结构的成本与实际需要处理的动画几何体数量直接相关。当需要为大量具有复杂独特变形的物体添加动画效果时,这一成本很快就会成为制约实时性能的因素。更严重的是,每个具有独特动画效果的物体还需要一份原始几何体及其对应的加速结构副本,这会导致内存消耗过度。

图2. 我们四面体化算法的2D示意图(从左到右):处于静态姿态的物体,通过规则网格进行体素化,去除空体素后,将非空体素分割成四面体;随后去除那些不与任何几何体相交的四面体。(最右侧)每个体素被进一步分割成六个四面体。

3 构建四面体笼
我们的方法利用四面体笼将三角形物体分割成多个互不重叠的三角形集合。目前已有多种构建此类四面体笼的算法存在[Si,2006;Wang等人,2020;Wang和Yu,2012;Yu等人,2024]。我们采用了一种基于体素的简单方法,该过程分为多个步骤(见图2)。首先,以物体的静态姿态为起点,使用规则网格将其划分为体素。接着去除所有空体素,再将剩余体素分割成四面体。最后,去除那些不与任何物体几何体相交的四面体。在我们的实现中,每个体素会被分割成六个四面体[Domiter和?alik,2008;Freudenthal,1942]。

图3. 与两个四面体相交的三角形会被裁剪,裁剪后的多边形会再次被三角化。
在得到所有非空四面体之后,我们需要确定每个四面体所覆盖的三角形集合,并将这些三角形裁剪到该四面体的四个边界三角形范围内(见图3)。这一裁剪过程会在每个四面体上生成一个小的三角形网格,即μ网格。由于每个四面体会对与它相邻的三角形产生不同的变形,因此必须对与相邻四面体相交的三角形进行裁剪,以避免出现异常视觉效果。我们的实现会确保通过裁剪产生的顶点不会重复,并且在当前四面体及其所有相邻四面体之间共享。这一裁剪步骤对于保证以下边界条件至关重要:μ网格的所有顶点都必须位于对应四面体的体积范围内,而与相邻四面体共享的顶点则必须恰好位于该四面体的边界三角形上。需要注意的是,裁剪操作会增加新的三角形和顶点数量,从而导致它们的总数上升(详见第7节)。

图4. (左)基于传统BVH的加速结构,其中内部节点要么指向其他内部节点,要么指向包含三角形的叶子节点。(右)在tetLAS结构中,内部节点不仅可以指向三角形,还可以指向四面体,而那些指向四面体的节点则又可以指向μ BLAS结构。
一旦所有μ网格都被创建出来,就会为每个μ网格生成一个μ BLAS结构。μ BLAS是一种针对μ网格中所含三角形构建的底层加速结构。每个μ BLAS只会被创建一次,之后将始终保持不变(不会以任何方式被修改)。此时可以对静态μ BLAS进行进一步优化,例如压缩处理。同一个四面体笼以及与之关联的所有μ网格和μ BLAS对象,可以被同一物体的多个具有独特动画效果的实例重复使用(详见第7节)。最后,还会为所有四面体构建一个顶层加速结构,我们将其称为tetLAS,而由所有四面体的边界三角形构成的网格则称为tetMesh。需要注意的是,tetLAS的叶子节点为四面体,每个四面体都会指向一个μ BLAS对象(见图4)。

在当前的实现中,我们并未为每个四面体设定固定的三角形数量限制。每个μ BLAS中的三角形数量由四面体笼的分辨率以及几何体的分布情况决定。

4 对四面体笼进行动画处理及光线与它们的交互
由一组三角形构成的四面体笼(tetMesh)为模拟各种可变形动画提供了一种高效方式,这种动画仅作用于三角形顶点本身,且不会改变三角形的连通性。我们的方法并非修改三角形的顶点,而是仅调整tetMesh的顶点,从而实现分段线性空间变形。在测试场景中(见第7节),我们可以通过直接对每个顶点应用变换函数或采用基于骨骼的动画方案来驱动tetMesh顶点的变化。调整tetMesh顶点后,需同步更新tetLAS。由于四面体的数量远远少于三角形总数(见第7节),因此更新tetLAS的成本远低于对所有三角形进行常规BLAS更新。在渲染前,每帧都需要执行一次对tetMesh顶点的修改及tetLAS的更新操作。

在渲染过程中,首先会沿着世界空间中的光线遍历tetLAS。一旦击中某个四面体,该光线就会从世界空间转换为该四面体的局部空间(以及对应的μ BLAS结构)。之后,这条转换后的光线会继续在μ BLAS结构中传播。我们的方法通过将变换表示为三维基变换操作,来实现光线从世界空间到四面体局部空间的转换(见图5和第4.1节)。尽管这种操作效率很高,但并不能在所有情况下保证数值的封闭性。因此我们提出了另一种变体(见第5节),该方法让光线保持在世界空间中,而是在光线传播过程中将几何形状及加速结构数据从四维表示形式转换为世界空间坐标。

总体而言,与原始三角形对象相比,tetMesh和tetLAS的复杂度低几个数量级,这让我们能够显著降低内存消耗、动画处理难度以及加速结构的构建时间(见第7节)。尤其是μ BLAS对象可以重复用于同一对象的不同变形效果。每种独特的变形仅需一份tetMesh副本,我们将其称为tetAnimCopy。

图5:(a) 一个被世界空间中的光线击中的动画四面体。我们确定了被击中四面体的入口和出口三角形,以及对应入口点和出口点的两个重心坐标集。(b) 这些重心坐标用于计算非动画四面体上相同三角形上的入口点和出口点,这两个新点便构成了经过转换后的光线。(c) 一个(非退化)动画四面体的四个顶点构成一个非正交坐标系的基向量(见方程1和2)。我们可以将步骤(a)和(b)中光线从世界空间到局部空间的转换表示为基变换操作(d)。

4.1 利用射线-实例变换实现四面体相交
现代光线追踪API采用两级TLAS/BLAS层级结构,其中TLAS是基于实例化的BLAS对象构建的。这些实例可以通过一个3×4矩阵进行变换,该矩阵可将光线从世界空间转换到BLAS对象的局部空间。需要注意的是,实时光线追踪API[Khronos Group 2020; Microsoft 2020]要求指定逆矩阵。下文我们将介绍如何利用实例变换将光线从世界空间转换到四面体的局部空间(见图5)。

每个未变形四面体的四个顶点v0、v1、v2和v3(见图5右侧)可定义一个非正交坐标系的三个三维基向量。如果从μ Mesh的每个顶点中减去v0,那么所有得到的顶点都可以表示为v1?v0、v2?v0和v3?v0的线性组合。这些组合可用于构建一个3×3矩阵,如方程1所示。目前我们假设这些向量是线性独立的。M=(v1x?v0x, v2x?v0x, v3x?v0x, v1y?v0y, v2y?v0y, v3y?v0y, v1z?v0z, v2z?v0z, v3z?v0z) (1)

类似地,我们可以从同一四面体的动画版本的四个世界空间顶点(a0、a1、a2和a3)出发,定义一个3×4矩阵A,如方程2所示。A的前三列构成了变形后坐标系的基向量,第四列则将动画坐标系的原点移至a0位置。A=(a1x?a0x, a2x?a0x, a3x?a0x, a0x, a1y?a0y, a2y?a0y, a3y?a0y, a0y) (2)

将静态μ BLAS中的非动画顶点相对于动画四面体的四个顶点进行变换,实际上是一个简单的基变换操作。因此,我们选择A(M?1)3×4作为μ BLAS的实例变换矩阵。此处,(M?1)3×4是通过求取M的逆矩阵,再将M?1扩展为一个3×4矩阵(通过添加一列全零元素)来得到的。基于实例变换的方法有一个要求,即所有非动画四面体都必须是非退化的。由于四面体是在预处理阶段生成的,我们假设可以避免生成退化四面体。另一个限制是,所有的μ BLAS实例变换矩阵都必须是可逆的,即必须存在(A(M?1)3×4)?1或MA?1。

图6:对于基于实例变换的方法,通过在裁剪三角形之前沿四面体的单位法线略微扩展四面体,可以减少可能出现的封闭性问题。不过这种方法无法完全保证封闭性,因为动画对象由具有不同变换参数的实例组成,每个实例在与局部μ BLAS相交时都会使用不同的光线路径。为解决这一问题,我们在裁剪原始三角形之前会略微扩大所有四面体。具体做法是让构成四面体的四个平面分别沿其向外指向的单位法线方向移动一个较小的epsilon值,如图6所示。这样就能形成重叠的表面几何结构,使得被裁剪的三角形之间存在共享边。epsilon值由用户根据场景需求设定,它必须足够大,以避免重叠几何结构产生可见的渲染瑕疵或过多的四面体相交点(见第8节),同时又能有效解决大部分封闭性问题。在我们的测试场景中(见第7节),我们使用的epsilon值为2.5×10??。第5节将介绍一种能够确保封闭性的解决方案。我们还单独针对球形模型测试了这种优化方法(半径为100,原始三角形数量约100万,裁剪后的三角形数量约120万,采用9×12×9的体素网格),光线从球心向外发射。在没有采用优化措施的情况下,约有0.01%的光线会穿过闭合的球体;而采用优化措施后,则不会出现任何封闭性泄漏问题。

5 保证封闭性的另一种方法
在我们基于四面体网格的遍历方式中,比如当光线穿过相邻三角形之间的共享边时,会出现封闭性问题,其原因在于不同的四面体会对世界空间中的光线应用不同的世界到局部空间的变换,从而在局部空间产生不同的光线路径,这些光线再依次在局部μ BLAS中被处理。这些不同的局部光线会导致不同四面体共用的顶点、边和三角形之间的光线-三角形相交结果出现不一致。虽然裁剪过程(见第3节)能确保没有单个三角形与多个四面体重叠,且不一致性仅可能出现在两个相邻四面体的共享边界三角形上,例如在某个四面体边界三角形内的共享三角形边上,但裁剪过程本身也可能引入数值误差,进而成为封闭性问题的另一诱因。当原始网格中穿过两个相邻四面体共享边界三角形的三角形被裁剪后,就可能会产生一条恰好位于该共享边界三角形上的三角形边。由于浮点数表示的精度有限,我们往往无法精确表示恰好位于两个相邻四面体共享边界三角形上的顶点位置(见图7)。在裁剪过程中生成的新顶点可能会略低于或略高于该共享边界三角形,这就破坏了四面体的边界特性,因为被裁剪的三角形部分会位于四面体外部。

图7:二维示意图:(左) 蓝色三角形相对于两个相邻四面体的共享边界三角形被裁剪,形成了两个新的顶点。这两个新顶点并不一定恰好位于共享边界三角形上,可能会有轻微偏差。(右) 放大视图:上方被裁剪的顶点位于左侧四面体内部,仅存在微小的浮点数级误差;而下方被裁剪的顶点则位于右侧四面体内部。这同样破坏了四面体的边界特性,因为被裁剪的三角形部分处于四面体外部。一条仅与左侧四面体在靠近共享边界三角形处相交的光线,可能会错过右侧被裁剪的三角形。

为保证封闭性,我们需要执行多项操作:(a) 恢复四面体相对于其所包含三角形的边界特性;(b) 确保位于相邻四面体共享边界三角形上的被裁剪顶点、边和三角形具有一致的表示方式;(c) 使用世界空间中的光线和三角形顶点,进行一致的光线-三角形相交检测。接下来我们将介绍一种能够满足这三项要求的方法。

5.1 四维重心坐标
三角形内的三维重心坐标可扩展为四面体的四维重心坐标。四面体内部的任意一点p都可以表示为构成该四面体的四个顶点(v0、v1、v2和v3)的重心线性组合,如方程3所示。p=b0?v0+b1?v1+b2?v2+b3?v3 (3) 这种表示方式使我们能够用四个重心坐标b0、b1、b2和b3来描述四面体内部(以及边界平面上)的所有点。实现封闭性的关键在于,要将所有三角形顶点都表示为相对于四个四面体顶点的四维重心坐标。

我们必须确保,无论使用哪个四面体,两个相邻四面体共用的所有点——也就是位于共享边界三角形内的所有点——都能被精确重构,其数值完全一致。这就需要为四面体顶点建立唯一的全局排序机制。在将原始网格三角形分配到各个四面体之后,我们需要从所有生成的μ Mesh中去除重复顶点,并为每个顶点分配唯一的标识符。对于每个四面体,我们会根据这些唯一标识符将四个顶点按升序排列,每次计算方程3时都使用这个排序后的顺序。

在为经过裁剪的μ Mesh中的每个顶点计算四维重心坐标时,需要考虑以下几种情况:
(1) 该μ Mesh顶点与某个四面体的顶点重合:只有与该顶点对应的重心坐标设为1,其余三个坐标则设为0。
(2) 该μ Mesh顶点恰好位于某个四面体的某条边上:只有与该边顶点对应的重心坐标设为非零值,另外两个坐标设为0。这两个非零坐标之和必须为1。
(3) 该μ Mesh顶点恰好位于某个四面体的某个边界三角形内部:与该边界三角形顶点对应的三个重心坐标设为非零值,剩下的一个坐标设为0。注意,这三个非零重心坐标之和必须为1。
(4) 该μ Mesh顶点完全位于笼状结构中的一个四面体内部:四个重心坐标均不为零,且它们的和必须为1。

我们使用一个由用户设定的较小距离阈值,来判断一个顶点是否与tetMesh的顶点、边或三角形非常接近。如果距离足够近,我们就将该顶点“对齐”到最近的顶点、边或三角形上,然后使用对齐后的位置来计算重心坐标。

有了重心坐标以及按固定顺序计算的方程3,我们就可以精确重建共享边界三角形内任意点的世界空间坐标,而无需考虑在计算时使用的是哪个相邻四面体。我们对非动画μ Mesh及其对应的μ BLAS中的所有位置数据——即三角形顶点和边界体积——都采用相对四维重心坐标编码。由于三角形顶点是以相对四维重心坐标的形式存在的,因此加速结构也需要对相对四维坐标进行约束。为此,我们采用了基于4D轴对齐边界体积的二进制边界体积层次结构,我们将其称为4D BVH。

当光线与一个动画四面体相交时(见第6节),我们会遍历与之关联的4D BVH。在每次遍历过程中,都会根据该四面体经过调整后的顶点信息,从相对四维表示形式中动态重建出三维世界空间的AABB包围盒(此时会应用min-sum启发式算法[Nie?ner 2013],以获得更紧凑的三维边界)。在4D BVH的叶节点层,也会对三角形顶点执行类似的处理。这种相对四维BVH的表示方式能够确保四面体变换的独立性。附录A提供了相关证明:无论四面体顶点如何变化,从相对四维BVH转换为世界空间三维BVH的过程都能保持边界约束的特性。要将相对4D空间转换为3D世界空间,是为了确保光线与几何体相交检测的准确性,因为这类检测需要在与世界空间中的光线相同的坐标系中进行。6 DXR实现方式对于唯一地实现三角形物体的动画效果,标准做法是先变换其三角形顶点,然后再更新对应的BLAS结构。当场景中所有需要动画处理的物体及其对应的BLAS结构都处理完毕后,还需要更新所有物体/BLAS实例的TLAS结构。采用这种标准动画方法的层次结构中,每个需要动画的物体都有一个单独的实例,如图8所示。图8。(左)标准动画方法的TLAS/BLAS层次结构,每个需要动画的物体都有独立的实例。TLAS是基于所有BLAS实例构建的。首先对所有物体的顶点应用动画变换,然后更新BLAS结构;所有BLAS结构更新完成后,再更新TLAS结构。(右)同一物体的不同动画效果会拥有各自的tetAnimCopy(四面体笼结构的副本),但共享同一个μ BLAS对象。每个tetAnimCopy对应一个单独的实例。首先对tetMesh应用动画变换,然后再更新对应实例的TLAS结构(即tetLAS)。目前的实时光线追踪API,如DXR [Microsoft 2020],并不支持四面体几何体。接下来我们将介绍如何将我们的两种方法(见第4.1节和第5.1节)与现有的DXR API功能相结合。通常,我们会先在每个场景物体原本的形态(未经过动画处理)周围构建一个四面体笼结构。在裁剪预处理阶段,会为每个四面体创建一个μ Mesh结构。这两种方法的这些步骤是相同的。同样,与四面体相关的μ BLAS结构也是静态的,不会因变换而改变。根据不同的实现方式,动画变换要么集成到实例变换中,要么直接应用于四面体笼结构。如果同一个物体应用了不同的变换效果进行动画处理,我们只需复制四面体笼结构即可,这样可以降低内存消耗(见第7节)。图8展示了这种重新利用μ BLAS结构的新层次结构示例。基于实例变换的实现方式对于基于实例的实现方式,每个μ BLAS可以直接映射到基于三角形构建的DXR BLAS结构。光线与三角形的相交检测可以由DXR的相交处理管线自动完成。此时,所有需要动画处理的物体的四面体结构——每个物体都有自己独立的四面体笼结构——会被整合成一个统一的列表。列表中的每个四面体都会对应一个DXR实例,其变换矩阵则按照第4.1节所述设置为该四面体的变换参数。具体来说,我们首先为所有四面体预先计算出变换矩阵(Mi?1)3x4(见公式1),这些矩阵在渲染过程中是固定的。接着会调用计算着色器来为所有四面体笼结构的顶点应用动画变换,另一个计算着色器则会读取这些顶点数据以计算矩阵Ai(见公式2),这些矩阵会被组合成每个四面体对应的单个矩阵Oi。最终的3 × 4 DXR实例变换矩阵则为OiAi(Mi?1)3x4。需要注意的是,着色法线需要通过实例变换矩阵的逆转置来进行变换,该矩阵会为每个需要动画处理的四面体每帧计算一次。封闭型实现方式对于封闭型实现方式,由于三角形顶点及边界体积都是以相对于特定四面体的4D重心坐标形式存储的(见第5.1节),而DXR并不提供直接处理这类坐标的方式,因此我们无法使用基于μ Mesh中三角形构建的DXR BLAS结构。此时就需要通过软件手动从相对的4D重心坐标中重建3D世界空间的顶点位置及边界体积。为此,我们利用了DXR的程序化几何功能。每当有光线进入一个四面体时,就会执行一个程序化着色器,该着色器会遍历预先计算好的二进制4D BVH结构。在光线传播过程中,可以利用这些4D位置数据来重建两个节点的AABB边界框在3D世界空间中的位置,以及用于光线与三角形相交检测的三个三角形顶点坐标(见第5.1节)。我们会为所有需要动画处理的四面体的AABB边界框构建TLAS结构,使得实例与四面体之间保持一一对应的关系。图9.测试场景:(左)青蛙:由骨骼驱动的动画角色集合,共包含2610万个三角形,每个青蛙对象有249千个顶点及408千个三角形;(右)树木:一组动画化的树木模型,包含3950万个三角形,每个树木对象有138万个顶点及158万个三角形;(下)草地区域,包含4790万个三角形,每个草地对象有60千个顶点及120千个三角形。7实验结果在评估过程中,我们开发了一个基于四面体的光线追踪框架,该框架使用DirectX 12和HLSL语言编写。所有实验都在配备16GB内存的AMD Radeon RX 9070 XT显卡上开展,操作系统为Windows 11。渲染时间包括每像素两条光线的追踪处理(一条主光线和一条次级阴影光线),以及着色和采样过程。BLAS对象的更新是通过ACCELERATION_STRUCTURE_BUILD_FLAG_ALLOW_UPDATE和PREFER_FAST_BUILD这两个标志来实现的,而TLAS结构的重建则通过PREFER_FAST_TRACE标志来完成。我们选择了三种不同的场景来测试我们的方法:树木、草地区域以及青蛙模型(见图9),这些场景在复杂程度以及需要动画处理的物体数量上各有不同。对于每种场景,我们都会复制多个基础物体,并为每个复制的物体分配一个独立的四面体动画笼结构。每个基础物体都会在中等和较高的四面体笼结构分辨率下进行测试。这两种分辨率都能保证足够的精度,因此与沿选定摄像机路径对所有三角形进行动画处理相比,没有观察到明显的差异。骨骼动画的适配青蛙模型是唯一支持骨骼动画的测试场景,而这种动画效果需要适配到四面体笼结构中。对于四面体笼结构中的每个顶点,我们会找到原始三角形模型中距离它最近的顶点,并使用该顶点的骨骼ID和权重值。需要注意的是,通过更精确地选择骨骼ID和权重值,或者根据底层骨骼结构进行相应调整,可以进一步提升这种简单方法的性能。考虑到骨骼动画的影响,我们对原有的三角形裁剪算法进行了扩展,以便处理每个顶点对应的骨骼数据。我们会为每个三角形收集最多12个独特的骨骼ID,同时让每个顶点携带对应的骨骼ID和权重值。如果某个顶点原本没有特定的骨骼ID,那么该骨骼的权重值就会被设为零。我们可以像处理其他顶点属性一样,对三角形中所有骨骼的权重值进行裁剪处理。在完成三角形裁剪之后,我们会根据骨骼权重对所得三角形各顶点的骨骼ID进行排序,保留权重最大的四个骨骼及其对应的ID,然后对这些剩余四个骨骼的权重值进行归一化处理。需要说明的是,将骨骼动画效果应用到四面体笼结构中,只是对原始三角形模型的骨骼动画效果的一种近似实现。动画的质量取决于四面体笼结构的分辨率。在着色处理阶段,我们会获取被光线击中的三角形三个未发生变形的顶点法线,然后对这些法线进行拟合处理,以此模拟原始带骨骼模型的表现效果。表1.体素分辨率#四面体数量#顶点数#三角形数量#顶点数#三角形数量#顶点数/每个四面体原始值裁剪后平均值最小值最大值树木5×8×50.64千0.204千158万138万215万(1.36倍)196万(1.42倍)3.3千113千9×12×92.32千0.639千158万138万255万(1.61倍)235万(1.70倍)1.1千14.3千草地6×5×60.66千0.659千120万60.14万207万(1.73倍)149万(2.48倍)0.3千12千10×9×102.42千0.722千120万60.14万277万(2.31倍)223万(3.70倍)0.1千10.9千青蛙15×15×151.91千0.711千408万249万618万(1.51倍)418万(1.68倍)0.3千11.7千25×25×255.55千19.24千408万249万761万(1.87倍)569万(2.29倍)0.1千10.8千上述数据为单个需要动画处理的物体的相关统计信息。经过裁剪处理后,三角形的数量会增加1.3到2.3倍。每个四面体所含的平均三角形数量从几百到几千不等,这一数值取决于场景的具体情况以及初始的体素分辨率。每个物体所包含的四面体数量比三角形数量少两到三个数量级,这大大降低了动画处理的成本。三角形裁剪方面,我们的方法要求将物体原有的三角形结构与tetMesh结构进行裁剪对比,这一过程会引入额外的顶点和三角形(见表1)。新增的顶点和三角形数量取决于四面体笼结构的分辨率,对于我们测试的物体而言,三角形数量会增加1.3到2.3倍,而顶点数量则会增加1.4到3.7倍。更多的三角形和顶点同样会影响μ BLAS结构的规模。不过,由于同一个物体的不同动画效果会重复使用相同的μ BLAS结构,因此最初较高的内存消耗会随着重复使用次数的增加而逐渐得到弥补。图10.比较了标准方法(基于BLAS结构)与我们所采用的非封闭型四面体基方法在内存消耗、动画处理效率、加速结构构建时间以及渲染时间方面的差异,测试场景为数量逐渐增加的草地区域物体(见图9)。测试中采用了两种不同的四面体笼结构分辨率:中等分辨率(6×5×6)和高级分辨率(10×9×10)。标准方法会逐个处理每个三角形,然后再更新基于三角形的BLAS结构。随着草地区域物体数量的增加,内存消耗、动画处理时间以及加速结构构建时间都会呈线性上升趋势(分别为(a)和(b)、(c)以及(d))。相比之下,我们的非封闭型四面体基方法仅出现较为轻微的增长趋势。我们的方法与标准方法的渲染时间(e)非常接近。当草地区域物体数量达到500个时,包括动画处理、加速结构构建以及渲染在内的总耗时(f),我们的非封闭型方法在四面体笼结构分辨率不同的情况下,其性能可提升多达9倍,优于标准方法。内存与性能对比首先,我们对比了封闭型与非封闭型四面体基方法在内存消耗和渲染时间方面的表现(见表2)。尽管封闭型方法的内存消耗仅为非封闭型方法的2.3到3.2倍,但由于需要依赖软件层面的替代方案,会导致19到80倍的额外运行时开销,因此这种方案并不适合实时渲染场景,更多只能作为参考用途。这意味着只有非封闭型方法才适用于当前世代GPU硬件上的实时渲染工作,而封闭型方法则可作为验证用的参考方案。表2.25棵树500块草地区域9×9群的青蛙内存消耗渲染时间内存消耗渲染时间内存消耗渲染时间非封闭型209.7 MB2.96毫秒145.6 MB1.35毫秒190 MB1毫秒封闭型540.5 MB203毫秒459.4 MB108毫秒442 MB19毫秒额外开销2.5倍68.6倍3.2倍80倍2.3倍19倍上述表格展示了25棵树、500块草地区域以及81群青蛙在两种不同方法下的内存消耗与渲染时间表现。我们的封闭型方法所需内存是非封闭型方法的2.3到3.2倍,而无需硬件加速的软件替代方案则会带来19到80倍的额外渲染时间开销。接下来,我们将非封闭型四面体基方法与标准方法进行对比,标准方法是逐个处理每个三角形,然后再更新基于三角形的BLAS结构。图10详细展示了随着草地区域物体数量增加,两种方法在内存消耗、动画处理效率、加速结构构建时间以及渲染时间方面的变化情况。随着需要动画处理的三角形数量不断增加,标准方法的各项指标呈现更为明显的线性增长趋势,而我们的方法则几乎保持稳定,因为其对应的四面体数量要少两到三个数量级,这使得我们的方法内存消耗仅为主方法的1/16.1倍。动画处理效率与加速结构构建时间也呈现出类似的差异。我们的非封闭型方法的渲染时间略高于标准方法。对于基于光线追踪的应用而言,包括动画处理、加速结构更新以及渲染在内的总耗时至关重要。在这方面,我们的非封闭型方法在保持相近视觉动画质量的同时,其性能可提升多达9倍。图11.随着树木和青蛙物体数量增加,两种方法在内存消耗(包括顶点和BLAS结构相关数据)、顶点动画及加速结构更新时间,以及渲染时间和总耗时方面的表现。与草地区域场景类似(见图10),标准方法的内存消耗、各种更新时间以及总耗时都会出现显著上升,而我们的方法则几乎保持稳定。图11还展示了树木和青蛙场景的类似测试结果。随着物体数量的增加,标准方法的内存消耗、加速结构更新时间以及渲染时间都会大幅上升,而我们的方法在这几方面的增幅则十分有限,因此其总耗时也更低。最终,我们将这三个示例场景合并为一个场景(见图1)。由于GPU内存限制为16GB,使用标准方法无法对该场景进行光线追踪。而我们的方法能够以约60帧/秒的速度渲染这个复杂的动画场景(每像素两条光线)。表3展示了详细的计时数据。该场景包含约250万个四面体,每帧中耗时最多的部分是处理tetMesh顶点的动画以及重新构建所有四面体的TLAS结构。表3. 动画三角形、四面体、动画时间、更新时间、渲染时间、总时间:584百万、2.8百万、0.35毫秒(3%)、9.66毫秒(78%)、2.42毫秒(19%)、12.43毫秒。这是合并后场景的计时分解情况(见图1)。只有基于四面体的方法能够在仅消耗770.10MB GPU内存的情况下,以约60帧/秒的速度(每帧12.43毫秒)渲染该场景。其中更新时间包括处理tetMesh顶点的动画以及重新构建四面体的TLAS结构,这是每帧中最耗时的步骤,占用了总时间的78%。8 局限性我们的方法通过四面体笼结构引发的分段线性变形来近似实现保持连通性的三角形网格动画。由于每个四面体都会引发仿射变形,因此该四面体内的几何形状只能进行局部线性运动。这种近似方法非常适合以下场景:•具有固定三角形连通性的密集且需单独动画处理的几何结构;•诸如树叶、草地或树木的弯曲,以及人群运动等平滑变形;•只要四面体笼的分辨率足够高以模拟蒙皮效果,就适用于骨骼/骨头动画。不过该方法不太适合以下情况:•网格拓扑结构的重大变化(如爆炸、破坏、切割等);•低于四面体笼分辨率的逐三角形或高频运动(如布料或面部动画中小于笼分辨率的褶皱);•在关节附近存在剧烈权重变化的复杂角色蒙皮;•刚性物体,对于这类物体,传统的实例化方法通常更为简单且更佳;•基于关键帧的动画,这类动画是通过在关键帧之间插值顶点位置来实现的。由于四面体笼分辨率不足而产生的异常现象,往往可以通过局部细化四面体笼来减轻(见图12)。要支持基于关键帧的动画,就需要重新计算连续关键帧中对应三角形顶点之间的变换关系,并将其应用到四面体笼上。对于那些需要逐三角形控制或会改变三角形连通性的动画,则需重新构建受影响的μBLAS结构。带有骨骼动画的物体还需要为四面体笼分配骨骼和权重。最后,该方法通过增加光线追踪过程中的光线遍历和相交成本,来大幅降低动画处理及加速结构更新的成本,从而影响光线追踪性能。基于实例化的版本需要在共享四面体边界处有适当的几何重叠,以避免出现不透水效应的异常现象,而不透水版本则依赖于成本较高的软件替代方案。由于每个原始三角形都会与tetMesh进行裁剪,因此生成的子三角形可能会分布在多个四面体中。这样一来,当光线与相邻四面体相交时,共享边可能会被多次检测,从而导致同一个原始图形元素被重复相交。为共享边指定所属的四面体,有助于解决这一问题。图12.(左)原始的带蒙皮三角形模型。(中)由于四面体笼分辨率不足,在关节附近出现的动画异常现象。(右)在目标区域提高四面体笼的分辨率可以减少这些异常现象。9 结论与未来工作在本文中,我们提出了一种高效处理大量需单独动画处理的几何结构的光线追踪方法。该方法将三角形几何结构的动画复杂性与其三角形密度分离。我们的方法只需为每个需单独动画处理的对象创建一个tetAnimCopy,从而大大降低了内存消耗、加速结构更新时间以及对象动画本身的成本。那些因加速结构构建时间、动画时间或处理大量几何结构时的内存占用问题而受限的应用程序,都可以从我们的方法中受益。我们的方法通过使用不同分辨率的四面体笼,支持不同的细节级别(LOD)。更高分辨率的四面体笼虽然会增加内存消耗和加速结构更新时间,但可以提高动画质量。总体而言,我们的方法可以直接与现有的针对单个对象的LOD处理、分阶段加速结构更新,以及基于集群的几何结构表示或TLAS分区技术[Microsoft 2026]相结合。此外,还可以将基于四面体笼的动画与传统的基于网格的动画或刚体动画相结合。如果硬件和API能直接支持四面体结构,将有助于提高剔除效率;同样,如果支持多级实例化,就能在光线追踪时间与加速结构构建时间之间实现更好的平衡。未来的工作将致力于改进从体素到四面体的转换算法,以及提升基于骨骼的物体动画质量,例如通过对所有关键帧进行优化处理,找出能够最小化高分辨率物体带蒙皮顶点与由动画四面体笼生成的顶点位置之间差异的骨骼及其权重组合。还可以通过对每个关键帧下每个顶点周围物体表面的曲率进行进一步分析,来提升动画质量。如果某个四面体中存在曲率高于特定阈值的顶点,那么在预处理阶段就可以将该四面体分割成多个子四面体,然后继续递归处理。致谢模型来源:Frog(Sketchfab.com)、Tree(cgtrader.com)、Grass Patch(cgtrader.com)。作者们感谢Jakub Bok?ansky、Joshua Barczak、Andrew Kensler、Nathan Morrical、Dave Oldcorn以及匿名审稿人提供的反馈。版权声明与商标?2026 Advanced Micro Devices, Inc. 保留所有权利。AMD、Ryzen、Radeon及其组合均为Advanced Micro Devices, Inc.的商标。本文中提到的其他产品名称仅用于标识目的,可能为其各自公司的商标。
相关新闻
生物通微信公众号
微信
新浪微博
  • 搜索
  • 国际
  • 国内
  • 人物
  • 产业
  • 热点
  • 科普

热点排行

    今日动态 | 人才市场 | 新技术专栏 | 中国科学人 | 云展台 | BioHot | 云讲堂直播 | 会展中心 | 特价专栏 | 技术快讯 | 免费试用

    版权所有 生物通

    Copyright© eBiotrade.com, All Rights Reserved

    联系信箱:

    粤ICP备09063491号