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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM