2018 年, NVIDIA RTX 引入了对光线追踪三角形网格的硬件支持。但是,头发和毛皮的光线追踪仍然是一个计算密集型问题,一直难以进一步加速。那就是,直到现在。
NVIDIA GeForce 50 系列 GPUs 在加速毛发和毛皮光线追踪方面取得了重大进步:硬件光线追踪支持线性扫描球体 (LSS) 基元。这种新基元是向实时渲染高质量数字人迈出的一大步。逼真的人类渲染的应用领域与日俱增,包括 AI 虚拟形象、电影和游戏角色、图形研究、高性能科学计算应用、合成数据生成等。
LSS 现已在 NVIDIA OptiX 和 NVAPI SDK 中提供。 RTX Character Rendering SDK 是 NVIDIA RTX Kit 的一部分,其中包含使用基于物理性质的着色模型的 LSS 的高级实时毛发示例。RTX Kit 是一套神经渲染技术,可利用 AI 对游戏进行光线追踪、渲染具有宏大几何图形的场景,以及使用逼真视觉效果创建游戏角色。RTX Kit 在 GeForce RTX 50 Series 发布时推出。
什么是 LSS 基元?
LSS 基元是一条具有不同半径的粗而圆的 3D 线。可以将多个线性扫描球体链接在一起以构建 3D 曲线,在它们重叠的位置共享顶点,这与使用三角形构建 3D 表面的方式类似。LSS 的形状类似圆柱形或锥形管,球体的两端均可选择覆盖。

如果两个端点重叠,因此直线没有长度,则直线扫描球体仅会成为常规球体。这可用于硬件加速粒子渲染。为了方便球体和提高内存效率,我们将球体 LSS 的这种特殊情况作为单独的一级球体基元公开。
通常情况下,线性扫描球体并不像图 1 那样以放大镜头显示。相反,它们的屏幕尺寸较小,可能有 1 像素宽,可以取或取。当多个线性扫描球体被链式连接成多条链路,并将摄像头稍微往后拉时,清晰的角度会消失,这些粗壮的线条会变成纤细的平滑曲线。

LSS 索引
LSS 提供两种索引模式:显式列表模式和称为连续隐式的半隐式模式。在列表模式下,系统会在顶点缓冲区中使用一对索引显式指定每个片段。在连续隐式模式下,使用一个显式索引和一个隐式索引指定线段,其中第二个点假定为顶点缓冲区中的下一个顶点。
由于内存中的连续顶点十分常见且方便,因此可以通过连续隐式模式在索引缓冲区中轻松节省 50% 的内存。图 3 显示了显式索引缓冲区包含 [0,1,1,2,2,3,4,5,5,6] 的示例。通过连续的隐式索引,索引缓冲区将为 [0,1,2,4,5]。

使用传统硬件渲染基于链的曲线
对于已经使用基于 CUDA 的光线追踪 API 框架 NVIDIA OptiX 的用户,LSS 已作为默认线性曲线类型提供,并且适用于 OptiX 支持的所有 GPU。OptiX 版本的 LSS 自动使用 NVIDIA Blackwell GPU 之前的 GPU 上的软件回退,以及 GeForce RTX 50 Series GPU 上的新硬件加速基元,而无需更改任何代码。如果您未使用 OptiX,则可能需要使用替代基元。
说到高性能,细分曲线是 LSS 的下一个最佳选择。其中一个选项是摄像头对焦或光线对焦四边形。尽管在动画的每一帧(毛发运动或相机运动)中,面向光线的四边形的显存占用相对较小,但其显存占用相对较小。
不交正交三角形条 (DOTS) 提供了一个巧妙的曲线细分解决方案,支持从任何角度进行查看,而无需重新调整每帧三角形的方向以面向摄像头。这样,如果渲染静态曲线,则无需在相机或头发移动时重建包围盒层次结构 (BVH)。三角形拥有广泛支持,因此 DOTS 可以利用现有的 RTX 硬件。
如果您想在 GeForce RTX 50 系列 GPUs 上使用 LSS,仍然可以使用 DOTS 在较旧的 GPU 上支持光线追踪链。一些同时使用 DOTS 和 LSS 的毛发示例将作为 RTX Character Rendering SDK 的一部分提供,该 SDK 可实现逼真的人类头发和皮肤的路径追踪。
LSS 的一个优点是几何体自然呈圆形,因此在投射阴影和反射光线时,很容易着色,并且很容易避免自交。像 DOTS 这样的细分曲线通常需要使用自定义着色法线覆盖几何法线,如图 4 所示。当使用圆周着色法线时,DOTS 的外观可能与由线性扫描球体构成的曲线相似,甚至无法区分。

使用 LSS 的优势
一些现有的实时头发处理方法包括:
- 纹理卡
- 面向光线的四边形,镶嵌管,正交四边形 (DOTS)
- 软件高阶曲线基元 (例如 cubic Bezier)
纹理卡是在预算有限的情况下,在游戏中实现合理的头发质量的好方法。但是,这种设置非常有限,没有足够的空间用于模拟头发或制作头发动画。由于一张纹理卡的每张卡有多个链,因此根据设计,无法控制单个链。基于链的方法更具可控性和灵活性,这也是为什么链显然是实时头发渲染的未来,因为世界的硬件会随着时间的推移而改进。

由于硬件目前已大力支持三角形,因此可以非常快速地将曲线细分为三角形(管、四边形、DOTS)。缺点是细分需要时间,并且会占用大量内存。一个四边形需要四个顶点,不过两个顶点可以与链中的下一个相邻四边形共享。因此,面向四边形的摄像头平均每个链段至少会耗费两个顶点。如果使用管或 DOTS,则链的每个部分最终平均将包含两个以上的顶点。
LSS 的每个链段平均只需要一个顶点,因此与细分曲线相比,它使用的内存更少,同时实现了更高的渲染速度。当然,LSS 比软件高阶曲线基元 (如 cubic B-spline) 的速度要快得多。根据对质量的需求和容差,与 cubic curves 相比,这种额外的性能可能会带有内存权衡,例如,如果需要更多的顶点来实现平滑度。
LSS 还有哪些其他用途?
RTX 版本的线性扫描球体在设计时主要考虑了毛发和毛皮,但它可以用于其他应用,包括粒子、分子模型、线框渲染、字体和路径渲染以及您可以想象的其他任何应用。

开始使用 LSS
NVIDIA GeForce RTX 50 系列 GPU 中的 RT Cores 为一种称为线性扫描球体 (LSS) 的新基元引入了硬件支持。LSS 是一种厚度不同的 3D 圆线基元,支持灵活逼近各种链类型。作为 LSS 的一种特殊情况,GeForce RTX 50 系列 GPU 硬件基元还直接支持球体 (不包含扫描线性分割),这对于像粒子系统这样的应用非常有用。
与 DOTS 相比,使用 LSS 在人类身上渲染动画毛发的速度大约快 2 倍,同时存储几何图形所需的 VRAM 也减少了大约 5 倍。这与其他常见用例类似。借助 GeForce RTX 50 系列 GPUs 上的 LSS 和早期 GPUs 上的 DOTS,现在可以在所有 RTX GPUs 上获得尽可能高的毛发光线追踪性能。
在 CUDA 中进行光线追踪时,LSS 目前可在 OptiX 中使用。对于 DirectX,可以从 R570 版本的 NVAPI SDK 开始找到适用于 LSS 的 API。Vulkan 开发者可能会对 Vulkan LSS 扩展 感兴趣。
有关基于物理效果的头发渲染示例,请查看 RTX Character Rendering SDK 。如需详细了解最新的 AI 和渲染技术,请查看 NVIDIA RTX Kit 。在 OptiX NVIDIA 开发者论坛 上加入有关 LSS 的对话。