本页面旨在帮助你深入了解Nanite的几何体系统和相应的使用示例。
Nanite回退网格体和精度设置
静态网格体和骨骼网格体包含一些附加属性,可以控制Nanite表示的精度,也可以控制从原始导入源网格体生成的回退网格体的精度。
这些设置位于网格体资产编辑器细节(Details)面板的Nanite设置(Nanite Settings)中。
| 属性 | 说明 |
|---|---|
启用Nanite支持(Enable Nanite Support) | 启用此项能够让该网格体支持Nanite,并在无法使用Nanite的情况下生成回退网格体。 |
保留区域(Preserve Area) | 若Nanite网格体会因简化而失去表面区域,则能够外扩开放边界边缘,将失去的区域重新分配给其余三角形。 这对植被最有用,因为树叶子往往会因简化的影响而变成不连贯的三角形和四边形。 此设置的效果是放大每一片树叶。 对于草叶之类的几何体条带,效果是将叶子加厚。 应在所有植被网格体上启用此设置,在其他网格体上均不应启用。 |
显式切线(Explicit Tangents) | 为True时,原始模型切线将被储存并逐资产使用。 该设置意味着切线是被显式存储在磁盘上的,而不是在运行时隐式派生的。 切线精度(Tangent Precision)设置可对顶点切线提供额外的控制选项。 启用该设置将使存储文件大小增大约10%,但在隐式切线不够精确时比较好用。 |
插值UV(Lerp UVs) | 是否要在简化时内插UV。 在可能的情况下,应始终启用此项。 对于真实的UV坐标,如果UV被用作法线纹理坐标并在三角形面上插值,将在简化时为新顶点计算最低误差的最优UV。 如果存储在UV中的数据不能被用于插值,则应禁用此项。 例如,当索引存储在UV中时,对索引进行插值毫无意义,还会导致使用该数据的着色器出错。 如果禁用,当Nanite选择LOD进行渲染时,UV的错误将不再被考虑,因为由于任意顶点属性不可插值而造成的错误通常无法被推理。 |
位置精度(Position Precision) | 选择生成Nanite网格体的顶点位置时此网格体应使用的精度。 根据网格体大小自动确定适当的精度。 此精度可以被重载,以便提高精度或优化磁盘占用空间。 |
法线精度(Normal Precision) | 选择生成Nanite网格体的顶点法线时此网格体应使用的精度。 根据网格体大小自动确定适当的精度。 此精度可以被重载,以便提高精度或优化磁盘占用空间。 |
最小驻留(根几何体)(Minimum Residency (Root Geometry)) | 设置此网格体应始终保留在内存中的内存字节大小,并将其余部分流送进来。 值越高,需要的内存越多,但对于某些网格体,这可以减轻流送弹出问题的发生。 |
保持三角形百分比(Keep Triangle Percent) | 从源网格体中保留的三角形的百分比。 减少此百分比可优化磁盘大小。 |
修剪相对误差(Trim Relative Error) | 设置可为Nanite网格体移除的最大相对误差量。 源网格体中视觉影响小于此相对误差量的所有细节都将被移除。 相对误差没有单位大小,与网格体大小有关。 默认情况下,Nanite将存储所有原始源网格体的三角形。 |
回退目标(Fallback Target) | 决定在生成回退网格体时该使用哪个目标系统。
|
源导入文件名(Source Import Filename) | 文件路径,用于导入高分辨率网格体供Nanite使用。 对于能够从更精细的几何体中获益的系统,比如Nanite和虚幻引擎中的几何体建模,可以用网格体的高分辨率版本替代LOD0。 |
置换UV通道(Displacement UV Channel) | 在对位移贴图进行采样时要使用的UV通道。 |
置换贴图(Displacement Maps) | 添加并编辑位移贴图。 |
最大边长系数(Max Edge Length Factor) | 控制屏幕上的网格体每个顶点间允许的最大距离。 这可以防止过度简化要变形的网格体,比如使用世界位置偏移的动画,以及样条线网格体。 在默认情况下,此值应保持为0,除非确实需要解决因过度简化而导致的问题。 |
顶点精度
Nanite会对网格体顶点位置进行量化,以便最大化内存密度并最小化磁盘占用空间。 量化步长为2的幂,步长大小可以通过位置精度属性来选择,以匹配各个网格体的要求。 默认情况下,“自动”选项会根据网格体大小及其三角形密度来选取合适的精度。 你也可以通过选择精度大小手动重载,以便提升精度效果或优化磁盘占用空间。
量化是一种有损压缩形式。 在处理模块化网格体或其他具有共享边界的网格体时,使用有损压缩面临很大的挑战,尤其是在这些边界必须完全对齐以防止几何体出现孔洞或裂缝时。
为了确保一致性,量化发生在以网格体原点为中心的非标准化对象坐标上。 这能确保当网格体使用相同的精度设置,而网格体中心之间的平移是该精度的倍数时,量化不会导致裂缝的出现。
修剪网格体数据
有时,你需要减少Nanite存储的数据量,优化磁盘大小。 Nanite包含相关设置,允许你在制作过程中的任何时候,为已存储的Nanite网格体修剪细节数据。 这意味着你可以在前期放心地使用较高的质量设置,后续根据项目的大小预算和目标平台灵活调整。
修剪Nanite的细节数据就像在存储为Nanite网格体前,提供一个预简化选项。 对Nanite而言,细节无需在整个网格体中均匀分布,因为它会首先删除最不重要的数据,更类似于有损压缩。
要修剪细节数据,可以调整以下设置:
保持三角形百分比:用于设置要从源网格体(完整细节)中保留的三角形百分比。
修剪相对误差:用于设置从源网格体中修剪数据时允许的最大相对误差量。 任何移除后导致相对误差小于此值的三角形,都将被移除。
相对误差没有单位大小,其数值相对于网格体大小而定。
这两个属性的默认设置是不修剪任何数据,Nanite将存储所有原始源网格体的三角形。 修剪数据的主要目的是减小磁盘空间(也就是下载大小),而不是专门为了提升性能。
欲了解更多相关详情,请参见下文的数据大小部分。
回退网格体
虚幻引擎的很多子系统都需要访问以传统方式渲染的网格体提供的顶点缓冲。 为静态网格体启用Nanite,会为高细节网格体生成一个相对粗糙的版本(即回退网格体)。 回退网格体在不支持Nanite渲染的情况下使用。 此外,在不适合使用完整细节网格体时,也会采用回退网格体,比如需要复杂碰撞、需要使用光照贴图烘焙光照、需要使用Lumen进行硬件光线追踪反射时。
回退三角形百分比属性表示原始源网格体中用于生成回退网格体的三角形百分比。 你可以指定0%到100%之间的三角形百分比,百分比越大,保留的原始网格体细节越多。
回退相对误差属性用于设置从源网格体中删除细节数据时允许的最大相对误差量。 任何移除后导致相对误差小于此值的三角形都将被移除,首先去除视觉影响较小的细节。 相对误差没有单位大小,与网格体大小有关。
举例来说,如果你不希望网格体做任何精简处理(删除三角形),应将回退三角形百分比设为100,将回退相对误差设为0。
下面的对比图展示了基于原始源网格体的高细节Nanite网格体与使用默认设置生成的回退网格体之间的差异。
使用回退相对误差值指定从原始源网格体中保留多少原始细节,使用回退百分比值设置使用多少细节。
下面的对比图展示了通过调整回退三角形百分比和回退相对误差属性,以保留更多原始源网格体三角形的回退网格体。 在调整这些数值时,可借助视口中Nanite详情中的Nanite三角形数量,了解回退网格体的三角形数量。
回退网格体可视化
在静态网格体编辑器中,可以通过视口显示(Show)下拉菜单中的Nanite回退(Nanite Fallback)选项,在细节完整的Nanite网格体和Nanite回退网格体之间切换。 或者,使用快捷键Ctrl+N在两种可视化模式之间快速切换。
对启用了Nanite的网格体使用自定义回退网格体LOD
引擎的许多功能都会用到回退网格体,比如复杂的逐多边形碰撞、光线追踪、光源烘焙等等。 它也可用于不支持Nanite的平台。 在生成回退网格体时,启用Nanite的网格体始终使用源网格体的LOD0槽位自动生成回退网格体。 但是,有时需要使用手动指定的回退网格体或一系列传统LOD,而不是自动生成的网格体。
这种控制级别允许你在项目中使用Nanite,同时也可以直接控制你在光线追踪反射中看到的几何体或不支持Nanite的平台中的几何体。
按照以下步骤指定你自己的自定义回退网格体,或使用一系列LOD:
将回退三角形百分比设为0,以使回退网格体尽可能最小化,因为使用此方法时将忽略回退网格体。
按照传统的LOD设置流程,为网格添加一个或多个LOD。
在LOD设置(LOD Settings)中,通过LOD导入(LOD Import)下拉菜单,选择导入LOD层级1(Import LOD Level 1)。
在LOD设置中,将最小LOD(Minimum LOD)设为1。 这将导致忽略Nanite生成的回退网格体。
复杂碰撞是一种特殊情况。 使用一般设置(General Settings) > 碰撞的LOD(LOD for Collision)属性,指定用于碰撞的LOD。 所有LOD都可用于碰撞,包括LOD0。
这种做法可能无法使Nanite项目自动兼容不支持Nanite的平台,应该专门针对你的项目进行测试和评估。
Nanite可以高效处理大量实例,但如果Nanite被禁用,那么可能会出现大量绘制调用,以至于传统渲染管线可能无法应对。 你可以使用r.Nanite 0启用或禁用Nanite,在自己的项目中测试Nanite的可行性。
欲了解更多信息,请参阅本页面的控制台变量和命令小节。
数据大小
有人可能会想当然地认为,既然Nanite能够实现微观细节,那么几何体数据一定会大幅增加,最终导致游戏包和玩家的下载大小增大。 事实上,得益于专门设计的编码方式,Nanite的网格体格式要比标准静态网格体格式小得多。
例如,对虚幻引擎5示例《古代山谷》来说,平均而言,Nanite网格体的每个输入三角形会消耗14.4字节。 这意味着平均一个拥有100万三角形的Nanite网格体,在磁盘上需要约13.8兆字节(MB)。
比较传统低模网格体(带法线贴图)和高模Nanite网格体,你将看到以下效果:
| 低模网格体 | 高模网格体 |
|---|---|
静态网格体压缩包大小:1.34MB |
静态网格体压缩包大小:19.64MB |
但是,压缩包的大小并不代表资产的完整大小。 项目中还有一些只有这个网格体会用到的特有纹理,也必须计算在内。 许多网格体使用的材质都有自己独特的纹理,包括各种法线、基础颜色、金属感、高光度、粗糙度和遮罩纹理。
这个资产只使用了两种纹理(基础颜色和法线),因此不像其他一些采用了各种独特纹理的资产那样耗费磁盘空间。 例如,注意Nanite网格体的大小(约150万个三角形)要小于4k法线贴图纹理的大小(19.64MB)。
| 纹理类型 | 纹理大小 | 磁盘上的大小 |
|---|---|---|
基础颜色(BaseColor) | 4K x 4K | 8.2MB |
| 法线(Normal) | 4K x 4K | 21.85MB |
这个网格体和它的纹理在压缩后的总包大小是:
低模网格体:31.04MB
高模网格体:49.69MB
由于Nanite网格体的细节非常丰富,将独特的法线贴图替换为与其他资产共享的可平铺细节贴图,能够有效地降低纹理大小。 这可能会损失一定的视觉质量,但这种损失小于低模网格体和高模网格体之间的质量差异。 考虑到这一点,相比于带4K法线贴图的低模网格体,一个拥有150万个三角形的Nanite网格体不仅更好看,而且还更小。
启用Nanite的网格体和纹理的总压缩包大小:27.83MB
你可以在纹理分辨率和"细节"法线贴图方面做很多试验。这组对比说明Nanite网格体的数据大小与美术师熟悉的数据大小没有太大区别。
最后,我们可以比较Nanite压缩和使用高模的标准静态网格体格式,两者在LOD0时相同。
| 高模静态网格体 | Nanite静态网格体 |
|---|---|
静态网格体压缩包大小:148.95MB |
静态网格体压缩包大小:19.64MB |
与此前的Nanite压缩(19.64MB)相比,其大小比拥有4级LOD的标准静态网格体压缩小7.6倍。
关于数据大小的通用建议
使用Nanite和虚拟纹理系统,再配合高速固态硬盘,可以减少几何体和纹理的运行时预算问题。 目前最大的瓶颈是如何将此数据交付给用户。
在考虑内容交付方式时,即考虑是使用物理介质还是通过互联网下载时,磁盘上的数据大小是重要的因素,而且压缩技术能做的有限。 终端用户的平均互联网带宽、光介质容量、硬盘容量等,往往落后于硬盘带宽、访问延迟、GPU算力和软件技术(例如Nanite)的发展。 因此,将数据提供给客户面临挑战。
高效渲染高细节网格体对于Nanite来说不再是难题。但是如何将其数据保存在磁盘中,必须加以控制。
可视化模式
Nanite包含多种可视化模式来检查其在当前场景中的数据。
在关卡视口的视图模式(View Modes)下拉菜单中,将鼠标悬停在Nanite可视化(Nanite Visualization)上,然后从中选择你要的可视化模式。
例如,概览(Overview)可视化选项可在图像中心显示渲染后的场景,并在屏幕四周显示选择的Nanite可视化,以供参考。
以下Nanite可视化模式可供选择:
| Nanite可视化 | |
|---|---|
遮罩(Mask) | 将Nanite几何体体标记为绿色,非Nanite几何体标记为红色。 |
三角形 | 显示当前场景中的Nanite网格体的所有三角形。 |
补丁(Patches) | 显示当前场景中Nanite网格体的所有斑块。 |
簇(Clusters) | 以彩色显示当前场景视图中已渲染的所有三角形分组。 |
图元 | 以相同颜色显示实例化静态网格体(ISM)中所有实例的组件。 |
实例 | 将场景中的各个实例用不同颜色绘制。 |
过度绘制(Overdraw) | 显示场景几何体上的过度绘制情况。 所有预估的像素,包括遮罩的像素都会被加入过度绘制视图。 紧密堆叠在一起的较小对象会比较大的对象产生更多的过度绘制。 |
光照贴图UV(Lightmap UV) | 可视化显示Nanite网格体表面的UV坐标。 |
计算WPO(Evaluate WPO) | 启用了Nanite且使用世界位置偏移的几何体为绿色,反之则为红色。 |
像素可编程(Pixel Programmable) | |
曲面细分 | 使用曲面细分和仅发生在曲面细分网格体上的细分次数对Nanite网格体进行可视化。 |
光栅化分组(Raster Bins) | 显示代表几何体批次的分组。 |
着色块(Shading Bins) |
Nanite包含一种高级(Advanced)可视化模式,可在Nanite可视化(Nanite Visualization)菜单中启用额外的可视化选项。 这些额外的可视化功能对程序员调试或分析Nanite的各种底层内容非常有用。
该高级可视化模式可以通过控制台变量r.Nanite.Visualize.Advanced 1启用。
控制台变量和命令
你可以使用以下统计数据和控制台变量对Nanite进行调试和配置。
运行时可使用控制台变量r.Nanite 0全局启用或禁用Nanite渲染。 禁用Nanite能让你模拟那些不支持Nanite的平台。
Nanite回退渲染模式
当Nanite遭到禁用或平台不支持时,Nanite还提供了回退网格体渲染模式。 你可以通过控制台变量r.Nanite.ProxyRenderMode控制使用哪种模式。
默认模式为0,将回退为渲染回退网格体,或采用屏幕空间驱动的LOD(如设置)。 这包括识别静态网格体编辑器属性中的最小LOD(详见上文回退网格体小节)。
1:禁止渲染所有启用Nanite的网格体。
2:与模式1类似,但允许在静态网格体编辑器中通过显示 > Nanite回退可视化选项渲染Nanite回退。
在不使用Nanite的情况下,如果场景中的实例数量远超承载极限,回退渲染模式1和2非常实用。 这些模式可以在不支持Nanite的平台上,在编辑器中打开场景。
例如,在虚幻引擎5的示例项目《古代山谷》中,禁用Nanite会导致产生数以万计的常规绘制调用,导致在那些不支持Nanite的平台上甚至难以打开该贴图。
Nanite统计数据命令
在控制台输入NaniteStats命令后,视口右上方会添加Nanite剔除统计数据的覆层。
命令参数可用于指定Nanite在屏幕上显示哪些统计信息。 当没有提供参数时,将使用主视图。
使用NaniteStats List在调试输出中显示所有可用视图:
Primary
VirtualShadowMaps
阴影图集(仅在可用时)
立方体贴图阴影(仅在可用时)
输入命令,后跟你要查看的统计信息列表名称,即可选择视图。 例如,你可以输入NaniteStats VirtualShadowMaps。
对于使用双通道遮挡剔除的视图,统计数据会为主通道(Main)和后通道(Post)划分单独的块。
调整Nanite流送池的大小
控制台变量r.Nanite.Streaming.StreamingPoolSize可用于指定使用多少内存来保存Nanite的流送数据。 使用较大的内存池可以减少在场景中移动时产生的IO和解压缩工作量,但代价是内存占用较大。
如果内存池不够大,无法容纳一个视图所需的所有数据,就会发生"缓存抖动(Cache thrash)",导致即便是静态视图,流送也无法解决。
要可视化Nanite的流送数据,可以使用流送几何体(Streaming Geometry)显示标记:点击显示 > Nanite > 流送几何体(Streaming Geometry)。 一旦禁用该选项,Nanite网格体将只会在始终驻留在内存中的质量级别中被渲染。
设置单个通道的最大簇数
控制台变量r.Nanite.MaxCandidateClusters和r.Nanite.MaxVisibleClusters可以指定单个通道中的最大候选簇数量和可见簇数量。 它们的值可用于确定中间缓冲区的大小,它们的默认值已经用于常见的游戏渲染场景中。
目前没有动态调整这些缓冲区大小的机制,也无法在溢出时自动降低品质。如果这些数值过小,无法满足场景复杂度,就可能会导致渲染瑕疵,通常表现为几何体丢失或闪烁。 出现此类瑕疵时,请使用NaniteStats确定候选簇和可见簇的保守边界。 具体而言,请查看ClustersSW和ClustersHW的统计信息。 目前一个候选簇的内存开销是12字节,一个可见簇的内存开销是16字节。
这个控制台变量无法在运行时改变,必须在配置(.ini)文件中指定。