目录
1.创建平面
Unity有Mesh Filter和Mesh Renderer组件,通过编辑Mesh Filter的Mesh属性进行绘制,并使用Mesh Renderer将图形渲染到屏幕上。
//在C#脚本顶部使用这段语句检测绑定该脚本的对象是否存在Mesh Filter和Mesh Renderer组件,如果没有则创建
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
使用以下代码编辑网格
private Mesh mesh;
private void Start()
{
mesh = new Mesh();
MeshFilter filter = this.GetComponent<MeshFilter>();
filter.mesh = mesh;
mesh.vertices = GetVertexs();
mesh.triangles = GetTriangles();
}
获取Mesh filter组件并绑定mesh后,需要对mesh的顶点和绘制方式进行编辑
使用以下方法获取顶点和绘制信息
private Vector3[] GetVertexs()
{
return new Vector3[]
{
new Vector3(0, 0, 0),
new Vector3(0, 1, 0),
new Vector3(1, 1, 0)
};
}
private int[] GetTriangles()
{
return new int[]{
0, 1, 2
};
}
即可得到绘制的三角形
在GetVertexs方法中定义了三个顶点(0, 0, 0),(0, 1, 0),(1, 1, 0),如图所示
同时在GetTriangle方法中定义的数组0,1,2代表从第一个顶点->第二个顶点->第三个顶点进行绘制,如图所示
当数组中的值改为0,2,1时,会发现无法看到任何图案,移动摄像机,可以在反面发现以下的图案
这是因为在绘制平面时,顺时针方向绘制的平面方向可以被绘制出来,当绘制顺序变成0,2,1时,在正面以逆时针的方向进行绘制,所以平面将会在反面以上图的方式进行绘制
接下来通过对GetVertexs和GetTriangle方法中添加更多数据进行正方形的绘制
private Vector3[] GetVertexs()
{
return new Vector3[]{
new Vector3(0, 0, 0),
new Vector3(0, 1, 0),
new Vector3(1, 1, 0),
new Vector3(1, 0, 0)
};
}
private int[] GetTriangles()
{
return new int[]{
0, 1, 2,
0, 2, 3
};
}
加入新的顶点(1, 0, 0)
加入新的绘制顺序0,2,3
即可得到新的平面图案,使用Shaded Wireframe模式可以更加清晰的看到路线
2.使用UV贴图
为对象的材质添加贴图,会发现在绘制的平面上并不能正确地显示贴图
这是因为我们需要对mesh的uv进行设置,指定贴图的位置
输入mesh的uv
mesh.uv = GetUVs();
定义GetUVs方法
private Vector2[] GetUVs()
{
return new Vector2[]{
new Vector2(0, 0),
new Vector2(0, 1),
new Vector2(1, 1),
new Vector2(1, 0)
};
}
即可得到如下所示的图案
这段数据将UV图的四个顶点与mesh的四个顶点进行对应,即可在平面上绘制贴图,当UV的顶点数据改为(1,1),(1,0),(0,0),(0,1)时,将会得到如下所示的图案
这是因为开始时UV贴图上的(0,0)与mesh的(0,0,0)对应,(0,1)与(0,1,0)对应...
修改UV顶点的数据后,UV贴图的(1,1)顶点与mesh的(0,0,0)对应,(1,0)与(0,1,0)对应... 所以平面上的图案翻转了过来
3.使用法线贴图
输入mesh的法线数据
mesh.normals = GetNormals();
定义GetNormals方法
private Vector3[] GetNormals()
{
return new Vector3[]
{
Vector3.right,
Vector3.right,
Vector3.right,
Vector3.right
};
}
可以发现当输入的数据为Vector3.right(1,0,0)时,绘制的图案收到的光照与立方体右侧的光照情况一致
在材质球上直接添加法线贴图时,会产生如下效果
通过输入切线数据来使法线贴图产生效果
private Vector4 tagent = new Vector4(0, 1, 0, -1);
mesh.tangents = GetTangents();
private Vector4[] GetTangents()
{
return new Vector4[]
{
tagent,
tagent,
tagent,
tagent
};
}
当修改tangent数据为(1, 0, 0, -1)时将会产生如下效果
这是因为光照情况由垂直于切线与法线组成平面的向量来计算,当切线方向变为(1,0,0)与法线一致时,无法进行有效的计算,所以平面会变光滑。tangent变量(0, 1, 0, -1),前三个数据代表了切线的方向,第四个值用于表示不同的坐标系空间