【GDC 2023】BroadLeaf Real-Time Cinematic Rendering of Large-Scale Forests
来源:PDF: D:\迅雷下载\GDC2023 BroadLeaf Real-Time Cinematic Rendering of Large-Scale Forests - 腾讯游戏知识库 - KM平台.m3u8\GDC2023 BroadLeaf Real-Time Cinematic Rendering of Large-Scale Forests.pdf Video: D:\迅雷下载\GDC2023 BroadLeaf Real-Time Cinematic Rendering of Large-Scale Forests - 腾讯游戏知识库 - KM平台.m3u8\GDC2023 BroadLeaf Real-Time Cinematic Rendering of Large-Scale Forests.mp4
提取时间:2026-04-24 15:08:47
从你提供的信息来看,你的方法主要集中在通过构建一个高效的参考结构和层次化的LOD(Level of Detail)系统来优化大规模场景中的树叶渲染性能。这种方法不仅在计算上实现了快速的LOD过渡,还在视觉效果上提供了平滑且逼真的转换。
关键技术点总结
- 参考结构与压缩:
- 构建一个基于树模型的参考结构,用于高效地存储和访问输入树叶数据。
- 通过该参考结构对原始树叶进行压缩,减少内存占用并加快渲染速度。
- LOD层次化组织:
- 根据树叶在场景中的距离与视角动态生成不同级别的细节(LOD)。
- 利用四叉树或类似的分层数据结构来表示和管理这些不同的LOD级别,确保每个节点的子节点能够根据需要进行细化。
- GPU加速:
- 使用网格着色器在GPU上执行LOD过渡计算,减少CPU到GPU的数据传输延迟。
- 通过直接从GPU内存访问所需数据并实时调整渲染细节来提高性能。
- 剔除优化:
- 实现了基于视锥体和遮挡的高效剔除算法,进一步减少了需要处理的图元数量。
- 这种方法特别适合于树叶等细小且分散的对象,可以显著减少不必要的计算量。
- 视觉效果与性能平衡:
- 通过精细控制每个LOD级别的细节水平,在保持高性能的同时提供高质量的渲染结果。
- 在近距离观察时确保树叶具有足够的分辨率以避免锯齿化现象,并在远距离观察时适当降低细节级别以提高整体帧率。
结论
你的方法展示了如何结合高效的参考结构、层次化的LOD系统以及GPU加速技术来优化大规模场景中的树叶渲染。通过这些措施,不仅实现了显著的性能提升,还保持了高质量的视觉效果,这对于实时渲染应用(如游戏和虚拟现实)尤为重要。这种方法为处理复杂且庞大的自然景观提供了有效的解决方案。
未来工作方向
- 进一步优化剔除算法:探索更高效的遮挡检测方法或利用机器学习技术来自动识别可剔除的对象。
- 自适应LOD生成:开发更加智能的机制,根据实时场景变化动态调整每个对象的细节级别,以达到最佳性能与视觉效果之间的平衡。
- 跨平台兼容性:确保所提出的方法能够在不同硬件平台上高效运行,包括移动设备和游戏机等。
通过持续研究和完善这些技术,可以进一步提升大规模自然景观渲染的质量和效率。
Slide 1 — 00:01:09

📌 要点汇总
- 讨论背景信息和关键挑战
- 当前树木实时渲染技术限制了质量和数量,导致低分辨率或少量树木
- 目标是开发高质量大规模树木的实时渲染解决方案,提升沉浸式体验
今天我们讨论这个问题的一些背景信息,并确定需要解决的关键挑战和问题。此外,我还将探讨现有方法的弱点。
实时树木渲染对于3D视频游戏、虚拟现实以及地理环境可视化等许多应用至关重要。然而,在这些应用中,当前的渲染场景要么是低分辨率的树木,要么树木数量很少,因为缺乏能够实时渲染高质量且大规模树木的解决方案。
我们希望找到一种解决方案,让艺术家可以自由地设计大型森林场景,并让用户在数字环境中体验到身临其境的效果,从而缩小虚拟世界与现实之间的差距。
Slide 2 — 00:02:14

📌 要点汇总
- 实时渲染大规模树木面临高视觉质量和交互性的挑战
- 树木模型具有复杂的几何形状和纹理,导致难以高效渲染
- 高质量树模型需要大量GPU内存,对硬件要求极高
- 复杂的数据流增加实时处理难度
- 现有方法虽可缓解问题但仍存在诸多挑战
在现实生活中,我们面临的一个重要挑战是实时渲染大规模树木的问题。我们需要确保这些树木不仅具有高视觉质量,还能够实现交互性。然而,这是一个既重要又困难的任务。
为什么这个任务如此艰难呢?主要有三个原因:
首先,树木模型通常拥有复杂的几何形状和纹理,这使得它们难以高效地进行渲染。
其次,高质量的树模型需要大量的 GPU 内存来存储其几何结构和纹理数据,这对硬件提出了很高的要求。
第三,树模型的数据流也可能非常复杂,进一步增加了实时处理的难度。
现有的方法虽然可以解决这些问题,但仍然存在许多挑战。
Slide 3 — 00:03:19

📌 要点汇总
- 基于细节级别 (LOD) 的树木可视化方法存在局限性
- LOD 生成非自动化、转换效率低、过渡不平滑及难以大规模实时渲染导致问题
大多数能够保持树木较高视觉质量的方法都是基于细节级别 (LOD) 的。在今天的演讲中,我们将重点讨论基于 LOD 的方法。
现有方法存在一些局限性。首先,LOD 生成不是完全自动化的,可能需要手动修改,这会增加额外的人工工作量。其次,高复杂度树模型上的 LOD 转换对于实时应用来说不够高效。即使转换速度足够快,过渡也可能不平滑或不无缝,因为简化的 LOD 网格无法忠实于原始模型。最后,该方法可能无法实时渲染数百万棵具有高视觉质量的树木。
Slide 4 — 00:04:24

📌 要点汇总
- 现有方法在缩小时过度简化细节,导致小特征如叶子消失
- 渲染复杂场景时(如海洋)现有方法效率低下,处理六亿个三角形会导致巨大计算负担
具体例子说明现有方法的局限性。
这张幻灯片展示了小叶子树的过度简化问题的示例。正如我们在视频中看到的,当我们缩小时,树叶甚至细树枝都消失了。这是因为当从远处观察树时,该方法倾向于使用更简单的网格来表示形状,但更简单的网格生成可能会折叠叶子等小特征,从而使它们消失。
这是另一个展示渲染效率问题的例子。在我们的海洋这张屏幕截图中,渲染了大约六亿个三角形。对于如此复杂的场景,如果我们使用纳米树叶,将会面临巨大的计算负担。
Slide 5 — 00:05:29

📌 要点汇总
- 光栅化步骤占总渲染时间(27毫秒)约一半(14毫秒),成为瓶颈
- 薄表面如草、树叶导致大量透支,效率低下;Nanite优化难以减少此类表面的三角形数量,仍需渲染大量重叠三角形
加速树渲染过程的技术中,光栅化步骤对于实时渲染来说仍然不够快,正如我们在图中看到的那样。光栅化总共需要大约 14 毫秒,这是总渲染时间(大约 27 毫秒)的一半。
实际上,当遇到草、树叶等薄表面时,很容易造成大量透支,从而降低效率。Nanite 虽然一直在寻求优化或减少输入网格的三角形数量,但是对于像树叶这样又小又薄的表面,几乎没有需要删除的三角形。因此会渲染和重叠很多三角形。
Slide 6 — 00:06:34

📌 要点汇总
- 激发改进需求:现有解决方案限制推动创新
- 实时渲染大型森林:使用单叶交互式树模型,满足现代游戏开发需求
- 自动LOD策略:优化树叶细节级别,确保过渡平滑且高效
- 提高渲染效率:通过LOD技术减少复杂性,保持树木形状
这些限制激发了对改进解决方案的需求。在了解问题和现有解决方案后,我们希望转变范式。
我们的目标是实时渲染由单叶、交互式树模型组成的真实大型森林,这非常有用,也是当今游戏开发中的需求。此外,我们还希望为树叶开发一种自动细节级别(LOD)策略,使其能够平稳有效地过渡,同时保留树的形状。 LOD有助于提高树叶的渲染效率。
通常,叶子是植物模型中最复杂的部分。在大多数情况下,我们的方法可以有效应对这些挑战。
Slide 7 — 00:07:38

📌 要点汇总
- 面向GPU优化的应用程序设计,适用于云游戏等大规模图形处理场景
- BraLeaf 方法自动高效地简化大型森林场景中的植物叶子,减少几何和纹理复杂度以加速实时渲染
它主要设计用于在强大的 GPU 上运行的应用程序,例如云游戏。这个场景包含数百万棵树和数万亿个三角形面。我们的目标是处理如此大量的数据并实时渲染此类场景。
现在,我来介绍一下我们提出的方法——BraLeaf。在这一部分中,我将讨论该方法的算法和技术细节。BraLeaf 可以自动高效地渲染逼真的大型森林场景。这是通过减少植物叶子的几何形状、几何复杂性和纹理尺寸来实现的。为了实现快速渲染,我们的方法的管道可以被划分。
Slide 8 — 00:08:43

📌 要点汇总
- 设计新的叶子参考结构以压缩几何和纹理输入模型
- 应用自动 LOD、LOD 生成及快速过渡减少渲染负载,保持视觉效果自然平滑
- 烘焙纹理信息到不同级别的 LOD 网格中保留细节
- 利用 GPU 加速层次化 LOD 结构提高渲染效率
分为四个阶段:
我们首先设计一个新的叶子参考结构来压缩几何和纹理的输入模型。
然后,我们应用自动细节级别、细节级别生成和快速 LOD 过渡来减少渲染负载,同时保持平滑和自然的外观。
为了视觉效果,输入的纹理信息将被烘焙到不同级别的 LOD 网格并保留。
最后,我们通过将细节层次组织在层次结构中并依靠 GPU 进行加速,进一步提高了渲染效率。基于我们的层次结构的 GPU 驱动的渲染管线。
Slide 9 — 00:09:48

📌 要点汇总
- LOD数据结构支持轻松添加加速技术如遮挡剔除以提高渲染效率
- 输入为带有纹理信息的三角形网格,代表植物模型的叶子;树模型由三角形网格表示,便于使用SpeedTree等工具生成和处理
LOD数据的结构使我们可以轻松地添加更多加速技术,例如遮挡剔除,以提高渲染效率。此外,我们还可以增加树木和其他角色之间的互动。
我们的输入是一个带有纹理信息的三角形网格,代表植物模型的叶子。我们关注的是具有显式几何形状的树,这意味着这些模型由三角形网格表示。这是最通用的树模型表示方式。
关于像 SpeedTree 这样的工具生成基于三角形网格的树模型以及易于接受的公共树网格数据集的事实,现在已经被广泛认可和使用。请注意,我们通常将植物叶子与植物的其他部分分开处理。
Slide 10 — 00:10:53

📌 要点汇总
- 叶子和树枝是断开组件,通过纹理或颜色信息区分
- 高质量树模型包含约200万个面,存储需求约为500MB
- 方法不支持树叶生长或枯萎动画
- 每个叶子是一个连通分量,整棵树的叶子可进行变形处理
叶子和树的其他部分(例如树枝)是断开的组件。但如果它们相连,通过分析纹理或颜色信息也可以轻松区分它们。
另外,我们只考虑具有静态生长状态的树木,这意味着我们的方法不支持树叶生长或枯萎的动画。下面是我们场景中的高质量树模型示例,该模型包含大约200万个面,需要大约500MB的存储空间。对于大多数树模型来说,每个叶子都是一个连通分量。
此外,整棵树的叶子都可以进行变形处理。
Slide 11 — 00:11:58

📌 要点汇总
- 通过3D仿射变换和卷曲效果生成基叶
- 设计了新的数据格式以高度压缩存储大量树叶,减少内存使用量,特别是对于超精细细节的输入
- 文件格式包含三角形表面网格文件表示Geometry,包括顶点、面及其UV坐标
几种叶子通过3D仿射变换,并添加了一些卷曲效果。我们将这种叶子称为基叶。
我们为树叶设计了一种高度压缩的新数据格式。构建了一个叶子参考结构,使大量的叶子能够被索引。对于一些基本叶子,这避免了存储重复的叶子几何和纹理,从而显著降低了内存使用量,特别是对于具有超精细细节的输入。
存储压缩叶子的文件格式如下:对于每个基础叶子,我们首先有一个三角形表面网格文件来表示其Geometry,包括顶点、面及其UV坐标。
Slide 12 — 00:13:03

📌 要点汇总
- 每个索引叶子的变换信息由12个浮点数组成:3个平移值、1个均匀缩放值、1个旋转角度值和3个旋转轴值
- 在缺少参考信息的情况下,需要根据输入网格构造或检索叶子纹理贴图
然后我们有一个转换文件来存储索引到基本叶子的变换信息。每个索引叶子的变换信息由十二个浮点数组成:平移有3个数值,均匀缩放有1个数值,旋转角度有1个数值,旋转轴有3个数值。
此外,我们还需要叶子的纹理贴图。在某些情况下,可以从像SpeedTree这样的树木建模软件中提取叶子参考信息。然而,这些叶子参考信息通常是无法访问或丢失的。因此,我们需要根据输入网格来构造或检索它。
Slide 13 — 00:14:08

📌 要点汇总
- 根据材质和UV坐标对叶子进行预分类以提高纹理分析效率
- 使用面向对象边界框计算叶子变换,并通过简化流程确保清洁效果
- 分类过程中偶尔会出现不同类型的叶子被错误归类的情况,但发生率极低
通过纹理分析,我们设计了一个简单而有效的策略。首先,根据叶子材质对叶子进行预先分类。
接着,我们将具有相同排序 UV 坐标的叶子归类到同一组中,依据它们在坐标系中的位置和值来划分。由于每个叶子都是独立的网格组件,这种分类方法偶尔会将两种不同类型的叶子错误地分在一起,但这种情况非常罕见。
然后,我们使用叶子的面向对象边界框来计算基础叶子的变换。最后,为了实现树叶的清洁效果,我们将整个过程简化为上述步骤。
Slide 14 — 00:15:12

📌 要点汇总
- 基叶通过有限的卷曲效果实现不同形态,可通过网格变形模拟自然卷曲
- 数据无需预先缓存,支持在线生成和计算,使叶子动画更生动逼真
- 上一幻灯片展示了一个典型模型实例
每个基叶只有几种卷曲效果,这意味着同一基叶的叶子可以以有限的方式卷曲。可选地,还可以通过使扁平的基叶的网格变形来产生叶子的卷曲效果。对于像这样平坦且笔直的基础叶子,我们可以为每个顶点指定任意角度,以沿 y 轴折叠网格的两侧,或沿 x 轴卷曲网格,或沿 y 轴扭曲叶子。
数据不需要预先缓存,而是可以在线生成和计算。这样,我们就可以得到更加生动的树叶。
上一张幻灯片中显示的模型是一个非常典型的模型。
Slide 15 — 00:16:17

📌 要点汇总
- 叶子结构分为三十二种类型
- 几何数据大小通过新数据结构压缩至原来的百分之一,存储需求从500MB降至6.4MB
- 纹理压缩比取决于基叶数与总叶数的比例,显著减轻了GPU内存负担
对于构建树,我们首先参考其叶子结构进行建模,然后发现这些树上的叶子看起来彼此非常相似。根据我们的分类结果,这些叶子可以分为三十二种类型。使用我们的新数据结构,该模型的几何数据大小可以压缩到原来的百分之一。我们只需要大约6.4兆字节来存储叶子的几何形状,而原始数据需要大约500兆字节。
至于纹理的压缩比,则完全取决于基叶数与所有叶数的比例。根据我们的测试结果,这大大减轻了GPU内存使用的负担。
Slide 16 — 00:17:22

📌 要点汇总
- 压缩比通常达到两个数量级,某些情况下更高
- 引入自动高效处理细节级别(LOD)策略,将基础叶子简化为近似四边形,保留形状和细节
压缩比通常约为两个数量级,在某些情况下甚至可以更高。准备好数据后,我们可以生成不同复杂程度的网格。
我们引入了一种自动高效处理细节级别(LOD)的策略。由于每个叶子都是一个独立的组件,因此我们首先展示如何将基础叶子简化为近似四边形,并在输入纹理烘焙时很好地保留其形状和细节。这些四边形由两个三角形组成。我们将使用这种四边形来表示近似的叶子形状。
由于我们将使用英语语言中的“四边形”来表示近似叶子,因此我们称其为四边形。
Slide 17 — 00:18:27

📌 要点汇总
- 使用PCA方法计算基本叶子顶点的三个主轴
- 将叶子网格顶点投影至主轴上,得到分布长度并形成面向对象边界框
简称四边形四叶。为了得到如图所示的四叶,我们首先计算基本叶的面向对象的边界框。
我们利用主成分分析(PCA)方法得到基础叶子顶点的三个主轴,然后将叶子网格的顶点投影到这三个轴上,得到顶点在这三个轴上的分布长度。这样,我们就可以得到三个黄色标记的线段,形成基叶的面向对象边界框。
然后我们将基础叶子的三角形投影到边界框的横截面四边形。
Slide 18 — 00:19:32

📌 要点汇总
- 使用投影三角形总面积最大的边界框中心来表示基础叶子
- 四叶方向使其法线与基本叶的平均法线同侧,简化过程可并行化加速
- 基础叶子简化后应用变换,并将转换存储在基础叶子数据中以获得最终结果
并使用通过边界框中心且投影三角形总面积最大的叶子来表示基础叶子。这里我们用浅蓝色标记这个四边形。
四叶的方向是使其法线点与基本叶的三角形的平均法线位于同一侧。请注意,基础叶的简化可以轻松并行化并加速,因为它们是独立的。
因此,给定树叶的输入网格,我们将基叶简化为角叶,然后应用变换。转换存储在基础叶子数据中。我们可以将转换应用于这些鹌鹑叶子以获得最终结果。
Slide 19 — 00:20:37

📌 要点汇总
- 输出 LOD 的零级网格,包含约六百万个三角形面
- 通过合并四边形叶子生成更粗糙级别的网格,计算合并后的边界框而不是单个叶子的边界框
对于所有输入叶,此过程输出 LOD 的零级网格。为了生成下一级更粗糙的网格,我们使用相同的方式合并四边形叶子,以生成一个新的四边形来近似合并叶子的三角形。
更具体地说,在这一步中,我们不是计算基础叶子的网格的面向对象的边界框,而是计算正在合并的四边形叶子的网格的边界框。四叶根据其位置和方向进行合并。
此处的图显示了树叶输入网格的示例,其中大约六百万个三角形面被简化为零级。
Slide 20 — 00:21:42

📌 要点汇总
- 不同LOD级别包含的面数分别为300,000、15,000和几百个
- 设计了L-forest层次结构来存储不同简化级别的四叶树,通过索引组织LOD树
- 玉米叶子根据相机视图即时交换细节等级
为了简化,从零级到二级 LOD 网格分别包含大约 300,000 个、15,000 个和几百个面。
请注意,在渲染阶段,树木上可能有不同级别的叶子。玉米叶子会根据相机视图以不同级别的细节即时交换。合并步骤使我们能够将不同简化级别的四叶关联起来。
因此,我们设计了一个层次结构,通过索引来存储和组织所有级别的四叶树,我们将其命名为 L-forest。L-forest 由 LOD 树组成。
Slide 21 — 00:22:46

📌 要点汇总
- LOD森林允许在树的不同级别间高效切换
- 对于包含n个角叶的网格,通过将其2n个三角形的UV域划分为M个等级来生成新的LOD UV贴图
如图所示,同深度的LOD森林的根节点指向最简化的LOD层的四元叶子。LOD森林的每个节点都指向其子节点所指向的四元叶的合并四元叶。
LOD森林使我们能够有效地在树上的不同级别的叶子之间切换。下一步,我们将为角叶的LOD网格生成新的UV贴图。对于具有n个角叶的网格,即2n个三角形(如左图所示),我们可以将UV域均匀划分为M个等级。
Slide 22 — 00:23:51

📌 要点汇总
- 使用公式轻松获得等级数,前 n 个 UV 等级分配给 n 个四边形
- 每个 UV 等级分为两个 UV 三角形,简化 UV 贴图生成过程
- 输入纹理包括轨道图、法线图、次表面散射图和位置图
- 在叶子上烘焙输入纹理并进行投影处理
使用此公式可以轻松获得等级数。然后,我们将前 n 个 UV 等级(此处标记为绿色)分配给 n 个四边形。每个 UV 等级将被细分为两个 UV 三角形。
这里我们知道这是生成 UV 贴图最简单的方法。我们还可以生成更复杂的 UV 贴图,使得 2D 和 3D 三角形的 2D 变换更加保形。
输入中叶子的纹理图包括轨道图、法线图、次表面散射图和位置图。为四片叶子生成纹理贴图,并在其上烘焙输入纹理。我们进行投影。
Slide 23 — 00:24:56

📌 要点汇总
- 将3D空间中的四边形分辨率叶子投影至2D UV域,确保投影三角形位于角叶区域内
- 通过重心坐标计算UV值,并复制输入三角形的纹理到角叶中,调整像素深度以匹配位置图
在 3D 中,将投影映射到 2D UV 域。
对于一组输入四边形分辨率叶子所指的角叶子,我们将这些叶子的三角形投影到角叶上。注意,投影三角形必须位于角叶区域内,这样我们才能获得投影顶点与角叶的重心坐标。然后通过重心坐标获取投影顶点的 UV 坐标。
输入三角形的纹理被复制到角叶的纹理贴图中。像素的深度根据位置图进行调整。
这是我们生成的反照率纹理示例。
Slide 24 — 00:26:01

📌 要点汇总
- LOD 一级网格上的玉米叶子纹理支持多输入纹理投影
- 在不同LOD级别间转换时需保持过渡平滑以避免形状突变
LOD 一级网格上的玉米叶子纹理贴图显示了每个叶子上可以投影多个输入叶子纹理。在获得叶子的 LOD 后,我们需要在各个级别之间进行转换,因为叶子与相机的相对位置会发生变化。
LOD 级别之间的过渡需要平滑且快速,尤其是在实时场景中和交互式游戏中。然而,现有的方法要么无法在过渡过程中保留树模型的形状,从而导致突然的变化。
Slide 25 — 00:27:06

📌 要点汇总
- 视觉无缝过渡与快速LOD切换结合实现
- 每个角叶由3D中心、切向量、副法线向量及UV坐标表示,降低带宽需求
视觉缺陷或非常慢的问题通常是因为为了平滑过渡而存储和处理更多级别导致的。不同的是,我们的方法能够获得视觉上的无缝过渡,并且计算上也实现了快速 LOD 过渡。
对于每个角叶,我们将其表示如下:它是3D中心、3D切向量、3D副法线向量、中心的2D UV坐标以及UV切线透镜和UV副法线透镜。然后我们可以在线获取四边形的几何形状,这大大减少了几何数据的带宽需求。
在渲染期间,我们知道一些关键属性。
Slide 26 — 00:28:11

📌 要点汇总
- 使用半精度类型表示数值范围较小的数据,确保精确度的同时减少存储需求
- 在 LOD 过渡时,通过计算屏幕四叶大小来决定是否遍历子节点,从而确定模型细节的可见性
均为半精度类型。这是因为已知它们值的范围很小,因此使用半精度就足够精确表示了。
为了表示 LOD 过渡时树模型的形状,我们独立选择四叶的 LOD 级别。从最高的 LOD 级别(最简化的模型)开始,基于我们构建的 LOD 森林,首先计算屏幕四叶大小,即屏幕上根节点四叶的副法向量和切线向量长度之和,以决定是否遍历子节点。也就是说,我们要决定是否使用这些细节信息。
Slide 27 — 00:29:16

📌 要点汇总
- 当玉米叶子屏幕尺寸小于阈值时停止遍历到较低的LOD级别
- 使用全分辨率输入表示大尺寸叶子节点,并采用网格着色器优化计算性能以应对大型场景中的高工作量问题
更精细的三角形元素。如果玉米叶子的屏幕尺寸小于预设阈值,我们将停止遍历到较低的 LOD 级别。如果叶子节点的屏幕尺寸大于阈值,我们使用全分辨率的输入来表示它的叶子,这是一个变形的基础单元。
此外,由于每个四边形仅由两个三角形组成,计算量似乎很轻,并且修剪 LOD 树减少了计算量。然而,在大型场景中工作量可能仍然很大。因此,我们使用网格着色器来加速处理。
Slide 28 — 00:30:20

📌 要点汇总
- 逐级计算四叶屏幕尺寸从LOD森林根节点开始,在网格着色器中执行
- 屏幕尺寸小于阈值的四叶直接传递到光栅器渲染,并停止子节点遍历
计算时,我们首先逐级计算四叶的屏幕尺寸。从LOD森林的根节点开始,每一层的计算都是在网格着色器中完成的,这意味着执行一次网格着色器,其中一个线程被分配到屏幕尺寸计算。
对于一个四叶,如图所示,在森林的屋顶级别执行网格着色器后,如果屏幕尺寸小于阈值(标记为绿色的节点),这些四叶将直接传递到光栅器进行渲染,并且我们停止遍历其子节点。对于其他节点,则继续处理。
对于其他节点,它们将继续被遍历和计算。
Slide 29 — 00:31:25

📌 要点汇总
- 黄色标记部分的子节点索引存储在 GPU 缓冲区中以优化后续处理
- 叶索引按 LOD 林排序,确保内存访问连续性,加速信息检索
- 存储边界球作为每个 LOD 树在 GPU 场景中的根节点数据结构
标记为黄色的部分需要检查它们的子节点。我们将这些子节点的索引存储在 GPU 缓冲区中,以便在下一次网格着色器执行时检查它们的屏幕尺寸。
请注意,叶索引在 LOD 林中进行排序,以保持内存访问连续性,从而加快信息检索速度。我们的渲染管道是 GPU 驱动的,将用于计算的数据存储在 GPU 内存中。这里,我们存储 GPU 驱动的运行时数据结构。对于每个 LOD 树,我们将其边界球存储为 GPU 场景中的根节点。
根节点数据结构如左侧所示。
Slide 30 — 00:32:30

📌 要点汇总
- 四叉树节点包含权限数据和指向子节点的指针
- 网格着色器执行包括填充着色器缓冲区和计算屏幕尺寸
它包括树的类型、中心和边界球体的半径。
对于每个四叉树节点,其名为四叉树节点的数据结构包含定义四叉树的权限数据以及指向其在 LOD 树上的子节点的指针。
下面是一个示例,用于展示我们如何执行一次网格着色器执行。我们首先使用来自 GPU 场景的数据填充着色器缓冲区,以便网格着色器可以访问这些数据。在这里,我们还应用了剔除,我们将很快讨论。
然后我们调度网格着色器并使用它来计算屏幕尺寸。
Slide 31 — 00:33:35

📌 要点汇总
- 线程数等于四叶节点缓冲区的数量
- 使用网格着色器计算四叶屏幕尺寸,并根据阈值决定是否绘制或输出角子项
- 选择网格着色器而非计算机着色器的原因是能够遍历树细节并直接渲染适当大小的叶子
请注意,我们使用的线程数等于四叶节点缓冲区的数量。在网格着色器中,我们计算四叶的屏幕尺寸。当尺寸大于预设阈值时,四边形将在网格着色器中绘制;当大小小于预设阈值时,我们在下一个网格着色器通道的输出角缓冲区中输出角子项。
请注意,我们不使用计算机着色器而是使用网格着色器的原因是:第一,使用网格着色器,我们可以遍历树的细节并绘制适当大小的四分之一叶子;第二,计算机着色器无法直接渲染。
Slide 32 — 00:34:40

📌 要点汇总
- 计算完成后需渲染缓冲区以供后续使用,增加GPU访问带宽需求
- 使用单棵树示例展示LOD转换结果:过渡平滑,视点移动时树叶形状保留良好
- 图像显示视点变化过程中树叶的LOD级别调整,同一树上不同叶子可具有不同LOD级别
计算完成后,我们需要渲染一个缓冲区供后续使用,并读取该缓冲区进行渲染。这需要更多的GPU访问带宽。
在这里,我们使用单个树的示例来展示 LOD 转换的结果。从视频中可以看到,过渡非常平滑。在相机移动过程中,即使视点远离树,树叶的形状也得到了很好的保留。
右边的图像(从图一到图四)显示了当视点从近到远移动时,树叶的LOD级别的变化。我们知道,在某一时刻一棵树上的叶子可能具有不同的 LOD 级别。
Slide 33 — 00:35:45

📌 要点汇总
- 不同距离的树叶使用不同级别的LD表示:近处为原始分辨率,远处用零级和一级玉米叶表示
- 视点变化时,树叶级别从零级到一级再到二级逐步增加,反映更精细的细节层次
例如,在图像一中,树上有原始分辨率的叶子,它们是绿色的。
对于距离相机较远位置的叶子,它们由 LD 零级和一级玉米叶子表示,分别为蓝色和红色。
随着视点向前移动,在图二中,叶子从零级到一级都是玉米叶子。逐渐地,在图三中,大部分叶子变成一级,小部分叶子变成二级。
在图四中,所有叶子都是第一层和第二层的玉米叶子,其中大部分位于第二层。
Slide 34 — 00:36:50

📌 要点汇总
- 总结pipeline设计思路:构建参考结构、生成LDS层次结构、组织LOD数据、应用GPU驱动架构进行计算和渲染
- 使用网格着色器加速GPU中LOD过渡的计算,并直接渲染结果,无需额外缓冲区操作
到这里我们已经完成了我们方法的主要流程。
接下来我总结一下整个pipeline的设计思路。首先,我们构建一个参考结构,根据树的建模方式来压缩输入树叶。然后为这棵树生成LDS(Level of Detail Structure)并构建层次结构。通过组织LOD数据,我们可以访问和控制叶级别组件。最后,应用GPU驱动的渲染架构进行计算和渲染。
我们使用网格着色器来加速GPU中LOD过渡的计算,并且计算结果可以直接渲染,而无需使用此管道编写缓冲区。
Slide 35 — 00:37:54

📌 要点汇总
- 实时处理大规模数据并实现流畅逼真的视觉效果
- 使用LD森林和GPU上的视锥体及遮挡剔除优化渲染性能,先应用视锥体剔除再进行遮挡剔除,调用基于LOD树级别完成
通过我们设计的管道,我们能够实时处理大规模数据,同时还获得流畅逼真的视觉效果。
接下来,我将讨论我们方法的一些技术细节。第一个是关于色彩。正如我之前提到的,通过构建的 LD 森林,我们能够对可见性和遮挡进行有效的剔除,从而优化渲染性能。剔除是在 GPU 上完成的。我们首先应用视锥体剔除,排除边界框完全在视锥体之外的叶子。实际上,我们正在使用边界球。然后我们进行遮挡剔除。调用是基于我们的架构 LOD 树级别完成的。
Slide 36 — 00:38:59

📌 要点汇总
- 从 LOD 树根节点开始检查可见性,外部不可见节点的子节点无需进一步检查
- 在树叶渲染中,包含调用表现不佳:深度预通过时间加倍且难以有效遮挡叶片间的间隙
级别从 LOD 树的根节点开始。如果某个节点完全在外部且看不见,则其子节点肯定也在外部,无需进一步检查。否则,继续检查其子节点。
请注意,在树叶渲染中,包含调用通常很难在以前的树叶数据结构上表现良好。主要原因有两个:首先,带有 alpha 测试的深度预通过使时间加倍;其次,像叶子这样的结构难以被很好地遮挡,因为叶子之间或类似结构之间的间隙通常是存在的。
Slide 37 — 00:40:04

📌 要点汇总
- 通过精细的数据结构访问坐标级别,实现高效调用
- 单帧包含170万图元和1.94亿像素,切割程序减少至约40万个图元和5200万个像素,数据压缩至原始大小的25%
细小、分散、不规则。通过我们的数据结构,我们可以在调用时访问数据的坐标级别,这使得调用能够以更细的粒度进行,从而更加高效。
对于此处显示的这一帧,它包含大约170万个图元和大约1.94亿个像素。我们的切割程序可以将渲染面和像素分别减少到约40万个和约5200万个。数据大小被压缩到原始数据的25%左右,这很大程度上缓解了经常发生的透支问题。
Slide 38 — 00:41:09

📌 要点汇总
- 雕刻策略可将树叶和草等小组件的渲染像素减少至原始大小的50%
- 处理低分辨率树模型以改善近距离观察时锯齿状的叶子效果
对于像树叶和草这样的小组件,我们的雕刻策略可以将渲染像素减少到原始数据大小的大约50%左右。有时,输入的树模型可能具有低分辨率和粗糙的叶子网格,这使得叶子在非常近的距离观察时呈锯齿状。
我们的目标不仅是渲染逼真的森林视图(全景森林),而且还要在特写视图中显示生动的树叶。因此,在遍历LD树到叶子节点的时候,我们进行了相应的处理。
Slide 39 — 00:42:14

📌 要点汇总
- 以全分辨率渲染叶子,而非基于输入网格绘制
- 细分与叶子节点对应的四边形,深度依据屏幕上叶子面积决定
- 扁平基叶由黑色和灰色四边形表示角叶,像素越多细分越深
- 叶子的卷曲效果在细分完成后添加
并且需要以原始的全分辨率渲染叶子。我们不是根据输入网格绘制叶子,而是细分与叶子节点对应的四边形叶子。细分的深度取决于屏幕上叶子的面积。
这里我们举个例子:绿色的叶子是一个扁平的基叶,黑色和灰色的四边形是指这个基叶的角叶。叶子占据的像素越多,角叶子的细分应该越深。叶子的卷曲效果将在细分完成后添加。
Slide 40 — 00:43:19

📌 要点汇总
- 支持树叶与其他对象交互:自动蒙皮程序为树叶和树枝生成装备
- 使用硬件光线追踪计算树和角色碰撞:不断更新BVH结构,从角色模型顶点发射射线检测碰撞
方法还支持叶与其他对象的交互。在这里,我们简要介绍一下在树上应用交互的过程。
首先,我们应用自动蒙皮程序分别为树叶和树枝生成装备。然后,我们使用硬件光线追踪来计算树和角色之间的碰撞。为此,我们在模拟过程中不断更新一个BVH(Bounding Volume Hierarchy)结构。用于碰撞检测的射线来自角色模型的每个顶点,并且我们使用顶点法线作为射线方向。
请注意,我们的方法在实现这些步骤时考虑了效率与准确性。
Slide 41 — 00:44:24

📌 要点汇总
- 树模型具有约22,000个绑定点和50万个面,恐龙模型有100,000个面
- 动画以每秒35帧的速度渲染,实现实时大规模森林的交互式体验
我们的树模型是单叶交互式的。视频展示了树角色的交互结果:树有大约22,000个绑定点和约50万个面,而与之互动的恐龙模型则拥有大约100,000个面。动画可以以每秒35帧的速度进行渲染。
现在我们了解了该方法的整体算法,并且知道为什么它能够实时渲染由单叶、交互式树模型组成的真实大规模森林。这在当今的游戏开发中非常有用和需求。
Slide 42 — 00:45:28

📌 要点汇总
- 方法自动化,无需复杂参数调整
- 在LOD生成步骤中,与虚幻引擎5 Nanite相比,渲染时间减少:Nanite需44毫秒,本方法更快
而且,我们的方法是自动化的,与现有方法相比不需要复杂的参数调整。
特别是在LOD生成步骤中,我们将展示我们方法的渲染效率以及视觉结果,并将其与现有技术进行比较。虚幻引擎5中的高多边形场景渲染技术Nanite在这里将作为对比对象。我们使用虚幻引擎 5 来渲染 Nanite 和我们的方法的场景。对于这一帧场景,Nanite 大约需要 44 毫秒来渲染树叶,而我们的方法只需要更少的时间。
Slide 43 — 00:46:33

📌 要点汇总
- 方法处理时间恒定为3到4毫秒
- Nanite 处理时间在15至37毫秒之间变化
- 测试场景包含2000棵树,由500份四种模型组成
- 渲染仅展示树的叶子部分,未显示树枝
方法仅需三到四毫秒。与此帧类似,Nanite 大约需要三十七毫秒。同样,对于具有较近视点的帧,Nanite 大约需要 15 毫秒,而我们的方法始终需要 3 到 4 毫秒。
该图显示了我们的方法与 Nanite 渲染由 500 份四种树模型组成的测试场景的渲染结果比较。总共有 2,000 棵树。我们垂直放置这四块树,如图所示。请注意,这里我们没有显示树枝,而只渲染树的叶子,如左侧所示。
Slide 44 — 00:47:38

📌 要点汇总
- Nanite 在远处观看场景时无法正确渲染树叶,导致叶子消失
- Nanite 渲染包含复杂表面(如梅叶)的场景时性能受限,每秒仅76帧,并消耗超过1GB内存及5.7毫秒处理时间
- 新方法能高效完整地保留树木的所有细节,优化场景渲染性能
从远处观看场景时,Nanite 无法正确渲染树叶,后面的树所有的叶子都不见了。相反,我们的方法可以完整地保留树木的所有叶子,如右图所示。
Nanite 的缺叶问题是由于其处理场景的限制。例如,在前面提到的梅叶这样的表面,Nanite 表现不佳。对于这个场景,Nanite 以每秒七十六帧的速度渲染场景。当仅考虑树叶时,Nanite 使用超过一千兆字节的内存和 GPU 内存,并且需要五点七毫秒的时间来处理每一帧。
相比之下,我们的方法可以高效地渲染整个场景。
Slide 45 — 00:48:43

📌 要点汇总
- 每秒处理102帧,使用630MB GPU内存,每帧树叶渲染时间为2.5毫秒
- Nanite技术保留叶子面积选项在缩小时放大每个叶子,但效果有限
每秒102帧,使用630MB GPU内存,每帧树叶的时间为2.5毫秒。这表明我们的方法具有更高的效率,并且使用更少的计算资源。
我们注意到Nanite中有一个选项可以保留叶子的面积,在缩小时将每个叶子放大,这些可以在一定程度上保留小叶子,但不能很好地保留它们。
这是一个比较场景:包含九种不同种类的树并排放置。我们在场景中放置了五排树,并将相机从近到远移动。这两个视频将进行展示。\n\n
Slide 46 — 00:49:48

📌 要点汇总
- Nanite区域保护技术能更好地保留稀疏树木形状
- 提出新方法Brody以应对大规模森林中棕榈叶几何体数量庞大的挑战
Nanite 区域保护的结果。如上面的视频所示,这是我们场景的效果。正如我们在突出显示区域中看到的,我们的方法可以更好地保留树木的形状,特别是对于原本稀疏的树木。
接下来,我想展示我们演示场景的视频。
最后,我还要谈谈大规模森林和阔叶逼真树渲染的潜在应用、局限性和未来工作。由于棕榈叶几何体数量庞大,我们提出了一种名为Brody的新方法。
Slide 47 — 00:50:53

📌 要点汇总
- 实时渲染约12万棵树的大规模场景,每树包含约1860万个三角形面
- Broadleaf技术应用于AR和VR,创造互动且真实的森林环境体验
- (Transitional content, no key points)
为了实时渲染具有电影质量的大尺寸棕榈叶,我们渲染的棕榈叶具有富有表现力的几何形状,因此单叶可交互。正如视频所示,我们的叶子实时渲染了约12万棵树的约22.3万亿个三角形面的场景,这比现有的游戏引擎要快得多。
阔叶语言的应用不仅限于视频游戏。让我们探索它的潜在应用,以了解它可以提供的全部可能性和好处。Broadleaf可用于在增强现实和虚拟现实应用中创建交互式和逼真的森林场景,提供引人入胜的体验。
Slide 48 — 00:51:58

📌 要点汇总
- 参与者感觉完全投入其中,方法可帮助可视化真实景观
- 阔叶树技术用于虚拟制作,创造大型森林场景,支持实时互动和调整,节约成本和时间
参与者感觉完全投入其中。我们的方法还可以帮助可视化真实的景观。这些可用于城市规划以创建城市环境,或用于环境研究以可视化其随时间的变化,或帮助创建热门旅游目的地的虚拟旅游。
此外,阔叶树技术还可用于电影制作中的虚拟制作,创造一系列大型森林场景的视觉效果,并提供演员与数字元素之间的互动。它可以让电影制作者实时查看并调整最终结果,从而节省时间和降低成本。
Slide 49 — 00:53:02

📌 要点汇总
- 改进LOD网格生成,减少高LOD级别的多边形数量同时保持平滑过渡
- 阔叶植物处理采用光栅化方法效果良好,但非叶子参考结构如草地表示不够精确
在后期制作过程中,我们的方法还有一些地方可以改进或值得更深入地研究。
最直接的一个是 LOD 网格生成的改进,特别是对于更高 LOD 级别的低多边形网格。我们希望使用更少的元素同时保持平滑的 LOD 过渡,从而进一步提高效率。
目前,阔叶植物的处理基于光栅化方法,这种方法可以很好地处理具有叶子参考结构的植物,但在非叶子参考上可能无法有效工作。例如,像草这样的植物通常用不精确的方式表示。
Slide 50 — 00:54:07

📌 要点汇总
- 探讨使用光线追踪技术改善植物叶子渲染效果
- 腾讯正在进行基于光线追踪的Broadleaf系统后续工作
- 光线追踪方法在处理复杂场景时成本增加不显著
- 系统当前版本不适合处理薄叶如松树,但未来版本可能改进
- 当前系统与Nanite项目在阴影处理上有区别,未详细说明
- 产品尚未发布,具体发布时间未知
- 目前展示的交互性仅限于角色碰撞,无风或天气效果互动
或者冒名顶替者,或者叶子又大又皱的香蕉树。所以这里一个有趣的方向就是思考使用光线追踪来解决植物叶子渲染的问题。这可以在类似的效率下提供更好的视觉效果。
使用光线追踪来解决这个问题有几个优点:首先,基于光线追踪的方法不需要生成LOD(Level of Detail),而且我们不需要担心阴影贴图的分辨率或柔和度。其次,光线追踪的成本不会像基于光栅化的方法那样随着场景复杂度增加而显著上升。腾讯有一个基于光线追踪的Broadleaf后续工作正在进行中,我们希望在不久的将来能看到它的成果。
是的,我认为这就是动漫的谈话。感谢您参加,我想您会收到一封包含演讲评价的电子邮件。如果您有时间,请帮忙填写。我想我们有大约四分钟的时间进行问答。如果您有任何问题,您可以提问。我想我最多可以回答两个问题。
你好。讲得好。显然该系统被称为阔叶系统。但它处理薄叶(如松树)的能力如何?
哦,对于那种叶子,如果不是用网格来表示的话,像这样,我认为你提到的叶子类型真的很像草。正如我在实现中提到的,这些可能不太适合使用我们当前的版本来处理,而且我认为我们的方法可能无法很好地处理它。但我们有光线追踪版本,可能正在开发中。我认为这可能会更好。
好的,谢谢。谢谢。
最后,您提到将来您将更多地研究带有阴影和其他内容的光线追踪。目前情况如何?对不起。
当前系统如何处理阴影?因为我注意到 Nanite 和你的区别。
噢,所以,那个项目,我没有参与那个项目,所以我不知道。对不起。好吧,没关系。谢谢。谢谢。
你好,有什么地方可以让我接触到这个产品吗?
哦,其实这个产品还没有发布。我不确定,因为我不是做出决定的人,所以我不确定我们什么时候发布。嗯,希望。希望我们能尽快发布它,以便艺术家或设计师可以使用它。是的。好的。谢谢。谢谢。
最后一个问题。我只是想知道当你描述为交互式时,你展示了与角色的碰撞,它在风或天气效果方面是否具有交互性?
不不,我们还没有添加那种效果。是的。谢谢。是的。谢谢。
感谢您的出席。