细分曲面和置换
虚幻引擎 5 中移除的硬件细分曲面(带有真实世界置换)功能在 Vite 中已完全实现。设置材质的细分曲面模式(Tessellation Mode),并调整 世界置换(World Displacement) 和 细分曲面乘数(Tessellation Multiplier) 引脚。
细分曲面在 GPU 上细分几何体,并将生成的顶点沿置换贴图进行置换,从而产生真实的几何细节:轮廓会发生变化,表面会正确地自遮挡和自阴影,光线追踪效果会与置换后的表面相交,而不是与平面相交。
本页面存在的意义
虚幻引擎 5 移除了硬件曲面细分。Nanite 作为替代方案被提出,但 Nanite 解决的是另一个问题:它能够高效地渲染极其密集的自定义网格。它不允许您在运行时为中等密度的网格添加程序化或纹理驱动的细节。
以下工作流程在缺少曲面细分的情况下会失效:
- 由高度图驱动的地形和地貌位移,其中细节是程序化的,并且与视角相关,而不是烘焙到网格中。
- 运行时位移 ——积雪、脚印、变形、水面——位移在游戏过程中会发生变化。
- 在平铺表面上添加纹理驱动的细节,其中单个材质可以为多个网格上的砖块、鹅卵石或树皮添加真实的深度,而无需为每个网格创建独特的高多边形几何体。
- 内存受限的细节,其中高度图比等效的密集网格的开销要小得多。
Vite 保留了整个 4.27 曲面细分管线,这意味着这些工作流程仍然有效。
启用材质细分
设置置换材质
-
打开材质并在详细信息面板中设置细分模式(Tessellation Mode):平面细分(Flat Tessellation)会在不平滑基础表面的情况下进行细分;PN 三角形细分(PN Triangles) 会在细分的同时平滑基础表面。PN 三角形细分通常适用于有机形状;平面细分适用于需要精确保留基础轮廓的情况。
-
将标量连接到细分乘数(Tessellation Multiplier)。这控制表面接受的细分程度。根据距离驱动它,这样远处的几何体就不会被细分。
-
将向量连接到世界置换(World Displacement)。通常的格式是表面法线乘以高度图采样值再乘以置换比例。
-
如果您希望引擎根据屏幕空间三角形大小缩放细分,请在材质上启用自适应细分(Adaptive Tessellation)。
全局控制
| CVar | 默认值 | 效果 |
|---|---|---|
r.TessellationAdaptivePixelsPerTriangle |
48.0 |
全局细分因子乘数。启用自适应细分时,目标屏幕空间三角形大小(以像素为单位)。 |
降低此值会生成更小的三角形和更高的细分级别;提高此值会生成更少的三角形和更低的细分级别。这是一个有用的全局缩放控制:通过缩放组启用此控制,以便低质量预设可以降低整个项目的细分级别,而不会影响单个材质。
成本与控制
细分并非免费,而且一旦失败后果严重:在大面积表面上使用无限制的细分倍率会生成数百万个三角形,导致帧率骤降。
务必将倍率限制在距离范围内。 标准模式是将细分因子乘以距离衰减系数,从而仅细分相邻的表面:
- 采样相机位置(Camera Position) 和物体或像素的世界位置。
- 计算距离,并通过
Divide和Saturate操作将其重新映射到 0-1 的衰减值。 - 将该衰减值乘以细分倍率。
直接观察三角形密度。 线框视图模式和着色器复杂度(Shader Complexity) 视图模式都能立即显示过度细分的情况。添加 stat rhi 以检查三角形数量。
位移裂纹(Displacement cracks) 出现在 UV 接缝和网格边界处,相邻顶点的位移量不同。可以通过使高度图在接缝处连续,或者将边界处的位移遮罩为零来修复它们。
与光线追踪的交互
位移几何体能够正确地参与光线追踪,这比视差贴图方案具有显著优势。视差遮蔽贴图的砖墙从主视图来看是位移的,但对于所有光线追踪的反射、阴影和 DDGI 探测光线而言,它都是平坦的。而经过细分和位移处理的砖墙,对于所有这些情况来说,都是真正位移的。
代价是必须为位移几何体构建光线追踪加速结构,这会增加动态细分曲面的 BLAS 构建成本。对于大型静态位移曲面,这只需支付一次;对于位移每帧都会变化的曲面,则需要持续支付。请据此进行预算。
替代方案
当您需要真实的几何体时,细分是合适的工具。当不需要时:
| 技术 | 何时足够 |
|---|---|
| 法线贴图 | 仅用于光照细节;轮廓和自遮挡无关紧要 |
| 视差遮挡贴图 | 从主视图即可获得逼真的深度,光线追踪时为平面,无需增加几何体 |
| 精心制作的高多边形网格 | 静态细节,预先已知,内存预算允许 |
| 细分曲面 | 轮廓至关重要,置换贴图是动态的,或者光线追踪效果必须能够捕捉到细节 |