82 lines
7.4 KiB
Markdown
82 lines
7.4 KiB
Markdown
---
|
||
title: Nanite学习笔记
|
||
date: 2022-09-20 17:07:44
|
||
excerpt:
|
||
tags: Nanite
|
||
rating: ⭐
|
||
---
|
||
# 前言
|
||
- UE5.4 Nanite源码阅读(一):NaniteStreaming:https://zhuanlan.zhihu.com/p/29306422635
|
||
- UE5.4 Nanite源码阅读(二):NaniteCulling:https://zhuanlan.zhihu.com/p/30057230872
|
||
- UE5.4 Nanite源码阅读(三):NaniteRasterize:https://zhuanlan.zhihu.com/p/30655592664
|
||
- UE5.4 Nanite源码阅读(四):NaniteShading:https://zhuanlan.zhihu.com/p/30662515655
|
||
|
||
# Nanite使用笔记(浓缩自官方文档)
|
||
## StaticMesh转换成Nanite的方法
|
||
1. NaniteSettings-EnableNaiteSupport=>true
|
||
2. Apply Changes
|
||
3. ImportSettings-Mesh-BuildNanite=>true
|
||
|
||
## 功能支持
|
||
Nanite支持混合模式(Blend Mode)是 **不透明(Opaque)** 类型的材质。其他材质类型则不被允许。
|
||
|
||
- 使用遮罩和半透明的混合模式
|
||
- 延迟贴花
|
||
- 将Nanite网格体用于网格体贴花。
|
||
- Nanite支持将贴花投射到其表面。
|
||
- 线框
|
||
- 双面材质
|
||
- 像素深度偏移
|
||
- 世界位置偏移
|
||
- 自定义逐实例数据
|
||
|
||
如果在材质中使用以下内容并指定给启用了Nanite的网格体,则会导致网格体显示异常:
|
||
- 顶点插值器节点
|
||
- 自定义UV
|
||
|
||
## 设置属性
|
||
- **位置精度(Position Precision)**:模型精度,精度越高,占用硬盘空间越多。
|
||
- **最低驻留(Minimum Residency)**:内存缓存大小,通过将模型缓存在内存中来减少固态硬盘的IO压力。
|
||
- **保持三角形百分比(Keep Triangle Percent)**:保留的三角形的百分比。减少此百分比可优化磁盘大小。
|
||
- **优化相对误差(Trim Relative Error)**:优化选项,该选项会移除小于该值的模型细节。默认为全部保留。
|
||
- **回退三角形百分比(Fallback Triangle Percent)**:设置减少Nanite源网格体时保留的三角形百分比。当无法使用细节丰富的Nanite数据时(例如平台不支持Nanite渲染),或者使用Nanite数据不现实(例如在复杂碰撞中)时。**最低模型的面数比例**,设成100%即为原始模型。
|
||
- **回退相对误差(Fallback Relative Error)**:设置允许为回退网格体移除的最大相对误差量。所生成回退网格体中视觉影响小于此相对误差量的所有细节将一律移除。
|
||
|
||
## 检查Nanite内容工具
|
||
选择 **工具(Tools)>Nanite工具(Nanite Tools)** ,即可从主菜单打开Nanite工具(Nanite Tools)窗口。
|
||

|
||
|
||
# 对启用了Nanite的网格体使用自定义回退网格体LOD
|
||
回退网格体在引擎的许多功能中都会用到,例如复杂的逐多边形碰撞、光线追踪、光源烘培等等。它也可用于不支持Nanite的平台。生成回退网格体时,启用了Nanite的网格体始终使用源网格体的 **LOD0** 槽来自动生成回退网格体。但是,有时需要使用手动指定的回退网格体或一系列传统LOD,而不是自动生成的网格体。
|
||
|
||
这种控制级别允许你在项目中使用Nanite,同时也可以直接控制你在光线追踪反射中看到的几何体或不支持Nanite的平台中的几何体。按照以下步骤指定你自己的自定义回退网格体,或使用一系列LOD:
|
||
1. 将 **回退三角形百分比(Fallback Triangle Percent)** 设置为 **0** ,以便回退网格体尽可能小,因为在使用此方法时它将被忽略。
|
||
2. 使用此[传统LOD设置](https://docs.unrealengine.com/5.1/zh-CN/creating-levels-of-detail-in-blueprints-and-python-in-unreal-engine)程序将一个或多个LOD添加到网格体。
|
||
3. 使用 **LOD导入(LOD Import)** 下拉菜单,从 **LOD设置(LOD Settings)** 分段 **导入LOD关卡1(Import LOD Level 1)** 。
|
||
4. 在 **LOD设置(LOD Settings)** 分段下,将 **最低LOD(Minimum LOD)** 设置为 **1** 。这会使得Nanite生成的回退网格体被忽略。
|
||
|
||
复杂碰撞是一种特殊情况。使用 **通用设置(General Settings)** 下 **用于碰撞的LOD(LOD for Collision)** 属性,指定用于碰撞的LOD。所有LOD都可用于碰撞,包括LOD 0。
|
||
|
||
# 性能优化
|
||
尽可能避免以下情况:
|
||
|
||
### 聚合几何体(毛发、树叶、草之类堆叠的模型)
|
||
聚合几何体(Aggregate geometry )是指许多不连贯的对象在远处合并成单个体积,例如毛发、树叶和草。这种类型的几何体打破了Nanite的细节级别和遮挡剔除方式。
|
||
|
||
Nanite本身是一种分层细节级别结构,它依赖的方法是将小三角形精简为大三角形,在差异小到无法感知时,Nanite会选择较粗糙的三角形。这在连续的表面上效果很好,但在聚合体几何体上效果不佳,从远处看时它们更像是部分不透明的云,而不是固体表面。
|
||
|
||
因此,Nanite可能认为它无法像处理常见的固体表面那样大幅度减少聚合几何体,因此,在覆盖相同数量的像素时,会绘制出更多的三角形。
|
||
|
||
### 紧密堆叠的表面(地面大量穿插的细节模型)
|
||
由于各种实际存在的限制,传统网格体的遮挡剔除使得大规模的模型搭建(kitbashing)流程几乎不可能实现。Nanite的高精细遮挡剔除可以实现使用这些类型的工作流,有助于减少开发流程中的麻烦。
|
||
|
||
正如上述"聚合几何体"小节中介绍的,导致过度绘制的一种情况是,可见表面与底部隐藏表面的距离过于接近。如果某个几何体妥当地隐藏在可见表面之下,Nanite检测并剔除它的成本是相当低的,甚至可以认为没有开销。然而,如果有一些相互堆叠的几何体,并且都位于最顶部的表面上,Nanite可能无法确定哪个位于上面或下面,导致两个几何体同时被绘制出来。
|
||
|
||
这种特殊剔除情况通常最糟糕,因为Nanite不知道哪个表面在最上层,导致绘制出所有内容。像这样的精度误差会随着屏幕尺寸和距离的变化而变化,所以,尽管10厘米的距离足够分开各个层,并且在近处看起来很好,但在更远的位置,距离差可能会小于一个像素,从而导致过度绘制。
|
||
|
||
### 面片法线和硬边法线
|
||
有个值得注意的问题是,在导入细节丰富的网格体时,因为网格体有面片法线,两个不同多边形之间的法线不平滑。此问题很常见,并且容易忽视,应该加以避免,因为网格体中顶点共享不足会导致渲染性能和数据大小的开销变得非常大。
|
||
|
||
理想情况下,一个网格体的顶点数量要少于三角形数量。如果这个比例是2:1或更高,那就可能出现问题,尤其是当三角形数量较多时。如果比例为3:1,意味着网格体完全是面状的,每个三角形都有单独的三个顶点,没有一个顶点是和其他三角形共享的。大多数情况下,这是法线不一样导致的,因为法线不平滑。
|
||
|
||
考虑到这一点,顶点越多,意味着数据越多。这也意味着顶点变换工作更多,而比率高于2:1时会陷入一些缓慢的渲染路径。在硬表面建模中专门使用不会引起任何问题,没有不用的理由。然而,若意外遇到100%面片极密集的网格体,开销要比预期的高得多。另外,要注意在其他DCC软件包中生成的密集有机型表面的导入法线,其硬法线阈值在低模网格体上可能是合理的,但在Nanite中会增加不必要的开销。 |