UGUI源码(五)VertexHelper
VertexHelper.cs
UGUI提供了我们自己构建顶点、三角形的类,那就是VertexHelper类。通过这个类,我们可以创建顶点,构成三角形,填充到一张mesh上,然后用MeshRenderer渲染到屏幕上,实际上我们可以直接操作Mesh类添加顶点、三角形等操作,这里的vertexHelper只是UGUI与Mesh之间的一座桥梁。
之前的文章中UGUI源码(二)Graphic,在OnPopulateMesh()函数中使用,保存了生成Mesh的基本信息,并非Mesh对象,最后通过这些基本信息就可以生成Mesh网格了。Graphic中有个静态对象s_VertexHelper保存每次生成的网格信息,使用完后会立即清理掉等待下个Graphic对象使用。
//部分源码
public class VertexHelper : IDisposable
{
private List<Vector3> m_Positions = ListPool<Vector3>.Get();//顶点位置
private List<Color32> m_Colors = ListPool<Color32>.Get();//颜色
private List<Vector2> m_Uv0S = ListPool<Vector2>.Get();//UV
private List<Vector2> m_Uv1S = ListPool<Vector2>.Get();
private List<Vector2> m_Uv2S = ListPool<Vector2>.Get();
private List<Vector2> m_Uv3S = ListPool<Vector2>.Get();
private List<Vector3> m_Normals = ListPool<Vector3>.Get();//法线
private List<Vector4> m_Tangents = ListPool<Vector4>.Get();//切线
private List<int> m_Indices = ListPool<int>.Get();//三角面的索引
//添加一组顶点数据(位置、颜色、UV、法切线)
public void AddVert(Vector3 position, Color32 color, Vector2 uv0, Vector2 uv1, Vector3 normal, Vector4 tangent)
{
m_Positions.Add(position);
m_Colors.Add(color);
m_Uv0S.Add(uv0);
m_Uv1S.Add(uv1);
m_Uv2S.Add(Vector2.zero);
m_Uv3S.Add(Vector2.zero);
m_Normals.Add(normal);
m_Tangents.Add(tangent);
}
//添加三角面的索引,参数为绘制一个三角面的三个顶点
public void AddTriangle(int idx0, int idx1, int idx2)
{
m_Indices.Add(idx0);
m_Indices.Add(idx1);
m_Indices.Add(idx2);
}
}