Ответ 1
Используемая сетка имеет три отдельных вершины для каждого треугольника (6 вершин на квадрат). В единичном кубе каждая грань представляет собой квадрант с четырьмя вершинами, а два треугольника на каждой грани имеют 2 вершины.
Слева квадрат, который имеет 4 вершины, а массив mesh.triangles
будет 0 1 2 1 0 3
, а справа - квадрат с 6 вершинами с mesh.triangles
= 0 1 2 3 4 5
(порядок вершин имеет значение для back- в моем шейдере у меня есть Cull set off off).
Итак, как вы можете видеть на изображении для этого шейдера, вы можете использовать сетки из четырех вершинных квадратов, пока вы будете осторожны, и убедитесь, что каждый треугольник имеет один из каждого цвета в каждой вершине.
Как я уже сказал в комментариях, вы можете разделить свою сетку так, чтобы у вас было 3 уникальных вершины для каждого треугольника.
void Start () {
Mesh mesh = GetComponent<MeshFilter>().mesh;
SplitMesh(mesh);
SetColors(mesh);
}
void SplitMesh(Mesh mesh)
{
int[] triangles = mesh.triangles;
Vector3[] verts = mesh.vertices;
Vector3[] normals = mesh.normals;
Vector2[] uvs = mesh.uv;
Vector3[] newVerts;
Vector3[] newNormals;
Vector2[] newUvs;
int n = triangles.Length;
newVerts = new Vector3[n];
newNormals = new Vector3[n];
newUvs = new Vector2[n];
for(int i = 0; i < n; i++)
{
newVerts[i] = verts[triangles[i]];
newNormals[i] = normals[triangles[i]];
if (uvs.Length > 0)
{
newUvs[i] = uvs[triangles[i]];
}
triangles[i] = i;
}
mesh.vertices = newVerts;
mesh.normals = newNormals;
mesh.uv = newUvs;
mesh.triangles = triangles;
}
void SetColors(Mesh mesh)
{
Color[] colors = new Color[mesh.vertexCount];
for (int i = 0; i < colors.Length; i+=3)
{
colors[i] = Color.red;
colors[i + 1] = Color.green;
colors[i + 2] = Color.blue;
}
mesh.colors = colors;
}