OpenGL 4 - 三角带立方体的 UV 坐标

Posted

技术标签:

【中文标题】OpenGL 4 - 三角带立方体的 UV 坐标【英文标题】:OpenGL 4 - UV Coordinates for Triangle Strip Cube 【发布时间】:2020-12-18 06:45:41 【问题描述】:

我有一个用三角条制成的立方体,我正在尝试找到它的 UV 坐标。

vert = new VBO<Vector3>(new Vector3[] 
            new Vector3(1, 1, 1), 
            new Vector3(0, 1, 1), 
            new Vector3(1, 1, 0),
            new Vector3(0, 1, 0),
            new Vector3(1, 0, 1),
            new Vector3(0, 0, 1),
            new Vector3(0, 0, 0),
            new Vector3(1, 0, 0)
       );
ind = new VBO<uint>(new uint[]  3, 2, 6, 7, 4, 2, 0, 3, 1, 6, 5, 4, 1, 0 , BufferTarget.ElementArrayBuffer);

有人知道他们会是什么吗?

【问题讨论】:

UV 坐标取决于顶点坐标和立方体的边。见How do I wrap a sprite around a cube without GL_REPEAT? 【参考方案1】:

简短回答:您可以为 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 个三角形)。

请记住,有多种方法可以实现您的要求,因此建议进行更深入的研究。

A visual representation of the previously described coordinate and indexing alignment. (固定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 坐标会更好,因为您不会得到失真。我提到的方式只是另一种方式,它有起有落(更多的失真,更少的内存使用)。

【讨论】:

以上是关于OpenGL 4 - 三角带立方体的 UV 坐标的主要内容,如果未能解决你的问题,请参考以下文章

关于 OpenGL 纹理、帧缓冲区和 UV 坐标的问题 [关闭]

OpenGL |在 UV 坐标处渲染顶点

纹理在openGL中使用2D纹理映射3D对象

OpenGL ES有不同的UV坐标?

ShaderJoy —— 纯 shader 实现立方体的渲染(含线框效果,虚线线框效果),带你了解渲染管线内部细节和原理GLSL

OpenGL 将三角形网格缩放为单位立方体