什么是Mesh?
在图形学渲染中,CPU会先把要渲染对象的几何数据经过一系列计算之后传给GPU,Mesh网格就是模型几何数据中重要的数据结构,包含顶点和多个三角形数组,UnityMesh组件是便于我们便捷地创建和修改3D物体的工具。
# 使用Mesh组件生成地形
UnityMesh组件由MeshRenderer和MeshFilter两个部分构成,MeshFilter实际上应该叫做MeshRefference,是用于记载物体对应的所有Mesh的引用,当渲染GameObject时,通过MeshFilter获取其对应的Mesh。所以如果我们要随机生成地形的话,就要自己定义一个Mesh赋值给MeshFilter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42public class MapGenerator:MonoBehaviour
{
public MeshRenderer meshRenderer;
public MeshFilter meshFilter;
public int mapHeight;
public int mapWidth;
public float cellSize;
[]//奥丁插件的工具
public void GenerateMap()
{
//生成地形Mesh
meshFilter.mesh = GenerateMapMeh(mapHeight,mapWidth,cellSize);
}
private Mesh GenerateMapMesh(int height,int width,float cellSize)
{
Mesh mesh = new Mesh();
mesh.vertices = new Vector3[]
{
new Vector3(0, 0, 0),//左下
new Vector3(0,0,height*cellSize),//左上
new Vector3(width*cellSize,0,height*cellSize),//右上
new Vector3(width * cellSize,0,0),//右下
};//设置网格顶点数据
mesh triangles = new int[]//设置顶点绘制成的三角形,片元着色器中是以三角形式
{
0,1,2,//左下,左上,右上三个点绘制成的三角形
2,1,0,
0,2,3,
3,2,0,
};//倒着来一遍是因为要两面渲染,不然只能绘制出单面可见的矩形
mesh.uv = new Vector2[]
{
new Vector2(0,0),
new Vector2(0,1),
new Vector2(1,1),
new Vector2(1,0),
};//uv就是对应的纹理贴图的xy坐标系,这里是给每个顶点映射到2D纹理的坐标系上
//即对应顶点对应纹理贴图哪个位置
mesh.RecalculateNormals();//计算法线
return mesh;
}
}