简短回答:您可以为 UV 坐标分配任何值,即使它们重叠(尽管这通常是不可取的)。只要您为每个顶点坐标创建一个 UV 坐标。如果您对重叠没问题,您可以将 8 个 Vector2(s) 声明为您的 UV 坐标,并为它们分配介于 -1 和 1 之间的任何值。
长答案:
这一切都取决于您索引坐标的方式。
UV 坐标告诉您如何将 2D 纹理的 2D 多边形区域映射到 3D 模型几何体。如果您的 UV(s) 和顶点使用相同的索引(这对于您的顶点坐标来说似乎不是最佳的),则每个顶点坐标都应该有一个 UV 坐标。
索引指定您的哪些坐标(三角形的 3 个索引,正方形的 4 个索引)与 2D(纹理)或 3D(模型)多边形相关。定义顶点坐标的方式,除非您以每 3 个顶点定义一个三角形的方式复制每个顶点,否则您必须使用索引来指示 8 个顶点中的哪一个是多边形。例如,索引 { 0, 1, 和 3 } 表示立方体顶部的右上后部(此处为后部,意思是在正 Z 轴上更远)三角形。
为顶点和 UV 使用相同的索引数组时会出现问题。如果您按原样索引您的模型,您的模型面不会有任何问题,但您的一些 UV 面会与其他先前定义的 UV 面重叠。这是因为某些面的顶点将与纹理空间另一侧的其他顶点共享。把你的立方体想象成一个十字架,把它放在一起,你会把底座绕回顶部。如果您的立方体的几何图形仅存在于二维中(就像在您的 UV 坐标中一样),您就不能这样做。
在这种情况下,看似最好的解决方案是使用立方体投影,我还不知道该怎么做。所以,我会推荐我理解的下一个最佳解决方案:
复制任何会导致 UV 面相互缠绕的顶点(十字的底部),以及可能会导致纹理应用于顶点坐标的方式过度扭曲的顶点;头部的 2 个外部顶点“臀部”(?)和十字架的手臂将进一步间隔开,需要纹理变形才能产生所需的输出。
这样做应该会导致您拥有 10 个顶点坐标、10 个 UV 坐标和 36 个索引,其中每 3 个索引定义一个三角形(12 个三角形)。
请记住,有多种方法可以实现您的要求,因此建议进行更深入的研究。
先前描述的坐标和索引对齐的视觉表示。
(固定Z轴)
这表示索引 0 和 1 处的顶点和 UV 坐标与索引 8 和 9 的重复。顶点坐标 8 和 9 与顶点 0 和 1 保持相同的 3D 位置值,而 UV 坐标 8 和 9 位于 Y 轴的下方轴比坐标 6 和 7。
我忘了把它放在示例图像中,但示例中的索引是:
int indices[] = {
0, 1, 2,
1, 2, 3,
2, 3, 4,
3, 4, 5,
0, 2, 4,
0, 4, 6,
1, 3, 5,
1, 5, 7,
4, 5, 6,
5, 6, 7,
6, 7, 8,
7, 8, 9
}
这将为您提供 12 个模型空间三角形和 12 个 UV 三角形,其中每 3 个索引是一个三角形。
编辑:根据@Rabbid76 提供的链接,14 个顶点和 UV 坐标会更好,因为你不会得到失真。我提到的方式只是另一种方式,它有起有落(更多的失真,更少的内存使用)。