Mesh是计算机图形学中一个很重要的概念,也是Unity中用于渲染的数据模型。
Unity中Mesh继承自Object而非Component,因为它只是一个为MeshFilter、MeshRenderer渲染提供数据的模型。它的主要数据成员如下:
Vector3[] vertices:Mesh的顶点数组。如果resize该数组时其它的顶点属性数组(normals, colors, tangents, UVs)都会自动resize以保持一致。
int[] triangles:Mesh的三角形数组(包括Mesh的sub meshes的三角形)。其中的三角形使用vertices中的索引来表示,数组大小必须是3的倍数(3个顶点索引组成一个三角形)。
Vector2[] uv:顶点贴图的UV数组,大小保持和顶点数组一致。
Color[] colors:顶点的颜色数组,大小保持和顶点数组一致。
Vector3[] normals:顶点的法线数组,大小保持和顶点数组一致。
Vector4[] tangents:顶点的切线数组,大小保持和顶点数组一致。
Unity中渲染Mesh除了需要Mesh本身的数据模型外,还需要MeshFilter和MeshRenderer配合才能完成。
MeshFilter会引用一个Mesh,并将它传递给MeshRenderer完成渲染。它的主要数据成员:
sharedMesh:GameObject关联的Mesh对象。Unity建议通过它只能读取Mesh的数据而不要进行改写,因为改写会同时影响其它使用了该Mesh的GameObject,改写单个GameObject的Mesh可以使用mesh。
mesh:如果MeshFilter没有设置Mesh的话它会生成一个新的Mesh对象;有设置、如果是第一次访问mesh属性的话它会复制生成一个新的Mesh对象,这之后再访问mesh属性都将返回复制出来的Mesh对象。如果访问了mesh属性后原始的sharedMesh丢失了,那么shareMesh返回的将也是mesh。使用mesh属性可以改变单个GameObject的Mesh,但当GameObject被销毁的时候我们需要负责销毁复制生成的mesh。
MeshRenderer继承自Renderer,它从MeshFilter中获取几何信息并在GameObject Transform指定的位置进行渲染。渲染涉及多个方面,这里简要介绍MeshRenderer与材质有关的成员变量:
sharedMaterial:和sharedMesh类似,GameObject关联的Material对象,改写的话会影响到所有使用了该Material的GameObject。当GameObject拥有多个Material时它返回的是sharedMaterials数组里的第一个元素。
sharedMaterials:Unity支持一个GameObject使用多个Material,这种情况下sharedMaterials数组包含了这些Material。
material:和mesh类似,自动生成,GameObject被销毁的时候需要我们负责销毁它。
materials:同material,用于支持多Material。