82 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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窗口。
![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Images/20220920172530.png)
# 对启用了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关卡1Import LOD Level 1** 。
4. 在 **LOD设置LOD Settings** 分段下,将 **最低LODMinimum LOD** 设置为 **1** 。这会使得Nanite生成的回退网格体被忽略。
复杂碰撞是一种特殊情况。使用 **通用设置General Settings** 下 **用于碰撞的LODLOD 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中会增加不必要的开销。