【Unity】网格笔记
【Unity】网格笔记
https://docs.unity.cn/cn/2022.3/Manual/mesh.html
网格的作用
网格用于描述物体的形状结构。
- 在图形上:配合材质球进行渲染。网格负责描述形状,材质球负责描述外观。
- 在物理上:用于确定碰撞体的形状范围。
获取网格
可以通过以下方式将网格添加到 Unity 中。
- 在 3D 建模软件中建模,网格将作为模型的一部分导入。
- 通过 Unity 内置的原始形状或建模插件(如 ProBuilder)创建网格。
- 使用 Unity 提供的 API,在代码中创建网格。
访问网格
网格资源对应于Mesh
类,具体结构参考另外的网格数据结构笔记。
每种数据都有函数和属性两种方式访问:
- 属性访问:旧方法,每次使用都会创建新数组,性能极低。如
Mesh.vertices
。 - 函数访问:不会每次访问时都分配新数组,建议使用。如
Mesh.GetVertices
。
此外 Unity 还提供一些更低级的函数可以直接操控原始网格数据缓冲区,用于满足高性能需求:
- 底层访问:如
Mesh.SetIndexBufferData
、Mesh.SetVertexBufferData
等。
特别网格功能
可变形网格
网格的形状可以实时发生改变,从而实现动态性的渲染效果,具体而言有以下几种类型:
- 蒙皮网格:网格中额外带有骨骼骨架信息,可在骨骼移动时逼真的控制网格形状,通常用于实现角色动作动画或物理上的布娃娃效果。
- 具有混合形状的网格:网格中额外带有混合形状数据,使网格可以在多个形状之间的插值,通常用于实现角色的面部动画。
- 配合 Cloth 组件的网格:用于实现逼真的布料模拟。
上述的可变性网格都必须借助SkinnedMeshRenderer
组件实现。
网格 LOD
网格的面越多渲染开销就越大,特别是随着网格与相机的距离增加,此时高精度的模型在渲染效果上已失去优势,反而会造成 GPU 运算资源的浪费。
借助 LODGroup
组件,Unity 支持在不同的距离下使用不同的渲染器进行渲染。所以要按照从近到远,准备多个不同精度的模型按需渲染(对于末尾的 LOD,通常会改用广告牌渲染器),从而优化渲染性能。
配置 LOD 网格
Unity 支持两种方式配置 LOD 网格:
- 手动创建带有
LODGroup
组件的游戏对象,并手动配置 LOD 级别。 - 在外部建模软件中创建符合 LOD 规范的模型:文件内存在多个同名模型,且都有自己 LOD 后缀。如“Cube_LOD0”、“Cube_LOD1”。
项目中的 LOD 设置
在 Quality settings 窗口中有一些关于 LOD 的选项。
- Maximum LOD Level:从构建中排除高于指定 LOD 级别的网格。
- LOD Bias:决定了处于阈值距离时选用更高还是更低的 LOD 级别。
压缩网格
Unity 支持两种方法压缩网格来减少大小或提高性能。
顶点压缩
- 设置方式:在 Player 面板设置,默认启用部分。将影响项目中的所有网格。
- 实现方式:将选择的网格数据从默认的 32 位浮点数改为较低精度的 16 位来存储。
- 优点:可减少网格的文件、内存大小,并可能略微提高 GPU 性能。
- 缺点:会造成精度损失,如果压缩 Position 和 Tex Coord 1 通道还可能造成伪影。
- 限制条件:
- 网格必须禁用“Read/Write Enabled”功能。
- 网格必须禁用“网格压缩”功能。
- 网格不能是蒙皮网格。
- 网格不能符合动态批处理条件,或设置中有关闭动态批处理。
- 目标平台必须支持 16 位浮点数。
网格压缩
- 设置方式:在每个模型导入面板设置,默认关闭。仅影响被设置的单个网格。
- 实现方式:将网格数据换成用最大值最小值间的位置信息存储,运行时再解压回原始数据。
- 优点:大幅减少文件大小。
- 缺点:造成精度损失,增加加载时间和临时内存使用,并可能造成网格显示伪影。
【Unity】网格笔记
https://bdffzi-blog.pages.dev/posts/810271066.html