接上回 Rounded Cube 2.本章主题如下:

  • Use sub-meshes. 使用子网格
  • Create a custom shader. 使用自定义shader
  • Combine primitive colliders. 合并原始网格

此为本人阅读笔记不作为转载处理,详细还请参看原文. 原文地址

现在我们已经有了一个没有重复顶点的圆滑立方体,现在需要使用多个材质。这时候就需用到子网格。我们把网格分成三对相对的面。 这意味着我们需要三个数组和三个三角形索引。

1
2
3
4
5
6
7
8
private void CreateTriangles () {
int[] trianglesZ = new int[(xSize * ySize) * 12];
int[] trianglesX = new int[(ySize * zSize) * 12];
int[] trianglesY = new int[(xSize * zSize) * 12];
int ring = (xSize + zSize) * 2;
int tZ = 0, tX = 0, tY = 0, v = 0;

}

现在我们要把环回路分为四段,在Z和X的数组之间交替。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (int y = 0; y < ySize; y++, v++) {
for (int q = 0; q < xSize; q++, v++) {
tZ = SetQuad(trianglesZ, tZ, v, v + 1, v + ring, v + ring + 1);
}
for (int q = 0; q < zSize; q++, v++) {
tX = SetQuad(trianglesX, tX, v, v + 1, v + ring, v + ring + 1);
}
for (int q = 0; q < xSize; q++, v++) {
tZ = SetQuad(trianglesZ, tZ, v, v + 1, v + ring, v + ring + 1);
}
for (int q = 0; q < zSize - 1; q++, v++) {
tX = SetQuad(trianglesX, tX, v, v + 1, v + ring, v + ring + 1);
}
tX = SetQuad(trianglesX, tX, v, v - ring + 1, v + ring, v + 1);
}

顶面和底面只用Y数组。

1
2
tY = CreateTopFace(trianglesY, tY, ring);
tY = CreateBottomFace(trianglesY, tY, ring);

我们创建三个子网格取代分配mesh.triangles。

1
2
3
4
mesh.subMeshCount = 3;
mesh.SetTriangles(trianglesZ, 0);
mesh.SetTriangles(trianglesX, 1);
mesh.SetTriangles(trianglesY, 2);

只展示了两个面

我们的网格现在被切成三块,只有第一块被实际渲染。 我们必须为网格渲染器分配额外的材质,即每个子网格一个。 这就是为什么有一个材质数组。

三块子网格
一组三材质