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.SetTriangles
、Mesh.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);