【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.SetIndexBufferDataMesh.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
作者
BDFFZI
发布于
2024年5月15日
许可协议