Unity中Mesh和subMesh的区别

Unity中的Mesh很好理解,就是一个网格的数据结构,里面记录了顶点、顶点索引等信息:

Mesh mesh = new Mesh();
mesh.vertices = ...
mesh.triangles = ...
mesh.uv = ...//都可以对其赋值

什么是subMesh
Mesh里面有这么一个参数mesh.subMeshCount,所以说明了subMesh是 属于 Mesh的,subMesh是mesh的子mesh,subMesh所有的顶点数据信息都来自于对应的Mesh,subMesh自身独有的内容,实际上是记录了一串索引的数组,从subMesh取得的索引信息,加上原Mesh具有的顶点信息,我们就可以绘制出原来整个Mesh的一部分,那么subMesh有什么用呢?举个例子,对于一个贴了多种材质(Material)的模型object,往往不同的材质会对应模型不同的部位,当我们将模型导出的时候,如果每一个材质,我们都导出一个完整的模型的mesh,这样无疑是很浪费内存的,所以说,为了进行区分,每一个材质对应的顶点部分对应的mesh,就组成了一个subMesh,即一种材质对应一个subMesh,如果一个模型只有一个材质,那么导出的subMesh自然就只有一个。

可以看看Unity Document的解释:

Each sub-mesh corresponds to a Material in a Renderer, such as MeshRenderer or SkinnedMeshRenderer. A sub-mesh consists of a list of triangles, which refer to a set of vertices. Vertices can be shared between multiple sub-meshes.

Each sub-mesh corresponds to a Material in a Renderer, such as MeshRenderer or SkinnedMeshRenderer. A sub-mesh consists of a list of triangles, which refer to a set of vertices. Vertices can be shared between multiple sub-meshes.

如何创建和读取subMesh
可以利用Mesh.SetTrianglesMesh.GetTriangles等函数来进行读取和存储subMesh的数据,如下图所示。
在这里插入图片描述
大致是这么个使用方法,需要设置mesh.subMeshCount:

lineMesh.subMeshCount = 2;
lineMesh.vertices = lineVertices.ToArray();
lineMesh.SetNormals(normals);

//绘制0号submesh
lineMesh.SetIndices(lineIndices[0].ToArray(), MeshTopology.Lines, 0);
Gizmos.DrawMesh(lineMesh, 0, gameObject.transform.position);

//绘制1号submesh
lineMesh.SetIndices(lineIndices[1].ToArray(), MeshTopology.Lines, 1);
Gizmos.DrawMesh(lineMesh, 1, gameObject.transform.position);
### 单个 Mesh 使用多材质的技术方案 在 Unity 中实现单个 `Mesh` 应用多个材质的效果主要通过设置 `Material[]` 数组来完成。对于拥有复杂表面或多种纹理需求的对象而言,这种方法非常有用。 #### 设置 Multi-Materials 的方法 当创建或修改游戏对象时,在其 `Renderer` 组件中可以指定一个材料数组而不是单一材料。这允许不同的子网格(Sub-meshes)或者同一网格的不同部分使用不同材质[^1]。 ```csharp // 获取 Renderer 组件并分配新的 Material 数组给它 renderer.materials = new Material[] { materialOne, // 第一种材质用于第一个 SubMesh 或者特定区域 materialTwo // 第二种材质用于第二个 SubMesh 或其他定义好的区域 }; ``` 为了使上述代码正常工作,还需要确保模型本身支持多重材质的应用。这意味着该模型应该被设计成具有多个子网格(Sub-mesh),每个子网格对应于想要应用独特外观的一个面片集合。如果是一个简单的平面或其他基础几何形状,则可能需要先将其转换为更复杂的结构以适应这种灵活性的需求[^2]。 另外值得注意的是,当处理大量带有独立材质的小型物体时,可能会遇到性能瓶颈。在这种情况下,考虑优化策略如批处理(batching)就变得很重要了。Unity 提供了一些机制来帮助减少绘制调用(draw calls),比如静态批处理(Static Batching) 动态批处理(Dynamic Batching)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值