Nanite
自动关联目录:Nanite
官方依据:Nanite Virtualized Geometry Overview(UE 5.8 Documentation)。本页覆盖该官方页的全部条目,并补上官方手册不写的代价、限制成因、CVar 与排查。
1. 定位
Nanite 是 UE 的虚拟化几何系统:用一套自有的网格格式与渲染技术,做到"像素级细节 + 极高物体数量",并且只对屏幕上真正可见的细节做工作。
一句话定位:Nanite 把"三角形数量"从帧预算里拿掉了——代价是它自己独占一条渲染路径,因此有一长串"不支持"清单。
是否启用 Nanite 不是美术决定,是平台与特性决定:先看目标平台是否在支持列表里,再看你的材质/形变需求是否落在支持范围内。
2. 结构
数据是怎么组织的
导入时:
源网格 → 分析并拆成"层级的三角形簇(hierarchical clusters)"
→ 高度压缩存储
运行时:
按摄像机视图,在多个 LOD 层级间实时切换簇
同一物体内相邻簇完美拼接(无缝)
按需流式加载:只有可见细节驻留内存
在自己的渲染 Pass 里跑,完全绕开传统 draw call**因为它依赖从磁盘快速流式读取,官方明确建议使用 SSD 作为运行时存储。**这是很多"PC 上流畅、机械硬盘上卡"的直接原因。
与静态网格的关系
Nanite 网格本质仍是一个三角形网格,只是:
| 维度 | 说明 |
|---|---|
| 核心 | 还是三角形网格,只是数据带了大量 LOD 与压缩 |
| 启用方式 | 在网格本身上打一个标记(flag) |
| UV 与顶点色 | 支持多套 UV 与顶点色 |
| 材质 | 按 mesh section 指派,可用不同着色模型与动态效果,可运行时替换,不需要烘焙合并 |
| 虚拟纹理 | 不是必需,但强烈推荐(目标相似:一个管几何,一个管纹理) |
| LOD | 自动处理,不需要手工为单个网格设置 LOD |
3. 收益(官方列出,附我的判断)
| 官方收益 | 实际含义 |
|---|---|
| 几何复杂度提升数个数量级 | 主要解放的是资产制作流程,不是无限免费的性能 |
| 帧预算不再受面数、draw call、网格内存约束 | 约束转移到簇的剔除与光栅化成本 |
| 可直接导入影视级源资产(ZBrush、摄影测量) | 省掉高模→低模+法线烘焙这一步 |
| 用高模细节而非把细节烘进法线贴图 | 包体结构变化:几何变大、贴图变小 |
| LOD 全自动 | 少一大堆手工 LOD 工作量 |
| 质量损失极少或没有 | 主要来自 LOD 过渡,实测仍需看 |
官方自己也提醒:实际限制仍然存在——实例数、单网格三角形数、材质复杂度、输出分辨率、性能,都要针对你的内容与硬件实测。
4. 该用在哪些网格上
通用原则:支持的平台上尽量都开,开了通常更快、更省内存与磁盘。
特别适合:
| 特征 | 原因 |
|---|---|
| 三角形很多,或屏幕上三角形很小 | Nanite 的 LOD 选择正是为此设计 |
| 场景中有大量实例 | 绕开传统 draw call |
| 是其他 Nanite 几何的主要遮挡体 | 剔除收益大 |
| 用虚拟阴影贴图投影 | 与 VSM 配合好 |
不适合(官方点名的例外):天空球——三角形在屏幕上很大、不遮挡任何东西、场景里只有一个。官方也说这类例外很少,且性能损失很小,不必过度纠结"哪里不该开"。
5. 关键 API 与配置
启用方式(三种)
1. 导入时勾选 Build Nanite
2. 单个网格编辑器:Details → Nanite Settings → Enable Nanite Support
3. Content Browser 批量:选中多个 → 右键 → Nanite > Enable可启用 Nanite 的组件类型:
| 组件 |
|---|
| Static Mesh |
| Skeletal Mesh |
| Instanced Static Mesh |
| Spline Mesh |
| Hierarchical Instanced Static Mesh |
| Geometry Collection |
| Foliage Painter |
| Landscape Grass |
转换每个网格都要处理时间,大项目里共享 DDC 非常重要(见 Cook 与打包流程)。
导入时的一个实际建议
不用 Lightmass 烘焙 GI 时,官方建议关闭 Generate Lightmap UVs:高细节几何会显著增加导入与构建时间,而且这会多出一套 UV 通道,对高密度网格是很大的数据量。
项目设置
Project Settings → Engine > Rendering → Nanite;各网格编辑器(静态/骨骼)的 Details 面板也有各自的 Nanite 设置。
6. 特性矩阵
| 特性 | 要点 |
|---|---|
| Nanite 静态网格 | 无 LOD,按屏幕分辨率动态缩放多边形数;完整支持 Lumen GI/反射与 VSM |
| Nanite 骨骼网格 | 一次 draw call 画整个网格;VSM 投影;无几何 LOD(用动画 LOD);支持动画库实例化 |
| Nanite 地形 | 可与地形配合提升性能,尤其配合虚拟阴影 |
| Nanite 植被 | 用实例化 + 蒙皮 + 体素化 + 动画 + 材质特性组合,实现大规模高密度植被 |
| Nanite 样条 | 默认支持,可用于 Landscape Spline 与 Blueprint Spline(道路、小径) |
| 静态置换贴图 | 静态网格编辑器里的离线自适应细分器,把置换烘进 Nanite 网格,非破坏性 |
| Nanite 细分(Tessellation) | 运行时可编程位移,可用置换贴图或程序化材质动态改网格 |
7. 支持范围(这份清单是判断是否可用的第一依据)
几何
| 项 | 限制 |
|---|---|
| 可启用类型 | Static Mesh、Geometry Collection |
| 场景实例数上限 | 硬上限 1600 万(含所有流式载入的实例,不只是 Nanite 的;只计入已流送进来的) |
| 逐顶点切线 | 不存储,切空间在像素着色器里隐式推导(为省数据)。可能在边缘产生不连续;官方称影响不显著,计划未来支持 |
| 形变 | 支持动态平移、旋转、非均匀缩放(即"能用一个 4x3 矩阵乘法统一表达"的变换) |
网格形变
| 项 | 支持情况 |
|---|---|
| WPO(世界位置偏移) | 支持但受限:用 WPO 的 Nanite 网格会被切成更小的簇,每个簇独立包围盒、独立 GPU 剔除,必须 clamp 位移量来控制被剔除的簇数量 |
| 植被用 WPO | 问题较小,因为植被本身有孔洞、不会自遮挡 |
| Morph Target | 不支持 |
材质
| 项 | 支持情况 |
|---|---|
| Blend Mode | 只支持 Opaque 和 Masked;检测到不支持的类型会换默认材质并在 Output Log 报警 |
| 贴花 | 能接收投影贴花;不支持 Mesh Decals(它需要 Translucent) |
| Wireframe 勾选 | 不支持 |
| Vertex Interpolator / Custom UV | 支持,但每像素求值三次;Custom UV0/1 在硬件光栅化下由硬件插值 |
| Custom expression 节点 | 可能产生瑕疵——因为 Nanite 还没有解析导数支持(如 ParallaxOcclusionMapping 这类用到的会有问题) |
渲染(不支持清单)
| 不支持 | 说明 |
|---|---|
| 按视图过滤物体 | Minimum Screen Radius、距离剔除都不支持 |
| 前向渲染 | 不支持 |
| VR 立体渲染 | 不支持 |
| MSAA | 不支持(只能走 TSR 等时域方案) |
| Lighting Channels | 不支持 |
| 对 Nanite 网格做光线追踪 | 默认用 Fallback Mesh;要更接近源网格就调低静态网格编辑器里的 Fallback Relative Error |
| —— | 实验性:r.RayTracing.Nanite.Mode 1 开启原生光追,保留全部细节且比零误差 Fallback Mesh 省很多显存 |
| 部分可视化视图模式 | 尚不支持显示 Nanite 网格 |
编辑器里看高细节几何的法线/UV 视图模式要小心——一次性把全部数据显示在屏幕上会拖垮编辑器性能。
平台
当前主机与桌面平台,显卡需最新驱动 + DirectX 12 + Shader Model 6(SM6)。
8. 参数与控制台变量
| CVar / 设置 | 作用 |
|---|---|
r.RayTracing.Nanite.Mode | 设为 1 启用实验性 Nanite 原生光追(省显存) |
Fallback Relative Error(网格编辑器) | 调低 → Fallback Mesh 用更多源三角形(更准、更贵) |
r.Nanite.* | 各类 Nanite 调试与开关(可视化模式、剔除开关等) |
| Project Settings → Rendering → Nanite | 项目级默认值 |
注意:Nanite 的可视化模式(Nanite Visualization)是排查"为什么这个网格看起来是糊的"的第一工具——能看到三角形/簇的实际分布。
9. 代价与权衡
| 权衡 | 说明 | 什么时候不该用 |
|---|---|---|
| 包体结构改变 | 几何数据增大、法线贴图减小 | 磁盘/下载预算极紧且本来就靠法线贴图的项目要实测 |
| 独占渲染路径 | 不支持 MSAA / 前向渲染 / VR | 做 VR 或必须用前向渲染时直接不能用 |
| 不支持形变与 Morph | 角色表情、软体形变做不了 | 需要 Morph Target 的角色换成传统骨骼网格 |
| 依赖 SSD 流式 | 机械硬盘上会明显劣化 | 目标平台存储慢时要评估 |
| 1600 万实例上限 | 超大开放世界可能撞顶 | 需要按流式区域控制实例总量 |
| Custom expression 有瑕疵 | 高级材质技法受限 | 依赖视差遮蔽等技法时要改材质 |
| 转换耗时 | 每个网格都要处理,大项目必须配共享 DDC | CI 上没配 DDC 会很痛 |
10. 踩坑与排查
| 坑 | 现象 | 怎么验证 |
|---|---|---|
| 材质被换成默认材质 | 网格变成灰色/棋盘格 | 看 Output Log 的警告,检查 Blend Mode 是不是 Opaque/Masked |
| WPO 网格被过度剔除 | 大位移时物体部分消失 | 检查是否 clamp 了位移量;用 Nanite Visualization 看簇 |
| 用了 Morph Target | 表情/形变无效 | Nanite 不支持,需关 Nanite |
| 光追下细节丢失 | 反射/光追里网格很粗糙 | 调低 Fallback Relative Error,或试 r.RayTracing.Nanite.Mode 1 |
| 机械硬盘上卡 | 流式跟不上 | 官方建议 SSD;监控流式加载 |
| 实例数撞上限 | 远处物体不显示 | 统计场景中已流式实例数是否接近 1600 万 |
| 材质出现奇怪瑕疵 | 用了 Custom expression 节点 | 换成官方支持节点,或关 Nanite 验证 |
| 编辑器看 UV/法线卡死 | 高模数据一次性渲染 | 别在高密度网格上用这些视图模式 |
| 导入特别慢 | 开了 Generate Lightmap UVs | 不用烘焙 GI 就关掉 |
| 打包后转换重来一遍 | DDC 没共享 | 配共享 DDC(见 Cook 与打包流程) |
11. 排查顺序
1. 平台是否支持?(DX12 + SM6)
2. 材质 Blend Mode 是否 Opaque/Masked?
3. 是否用了不支持的特性?(Morph、前向渲染、MSAA、VR、Lighting Channels)
4. 视觉异常 → Nanite Visualization 看簇与三角形
5. 性能问题 → profilegpu 看 Nanite Pass;确认存储在 SSD
6. 光追相关 → Fallback Mesh 精度与 r.RayTracing.Nanite.Mode