将顶点索引和纹理坐标包装在一起

时间:2012-01-03 01:19:47

标签: opengl

我正在尝试渲染一个纹理映射的立方体,作为我自学(或更确切地说是SO)学习的一部分。

我发现在线this example将顶点坐标和纹理坐标包装成一个数组,如下所示:

Vertex Vertices[4] = { Vertex(Vector3f(-1.0f, -1.0f, 0.5773f), Vector2f(0.0f, 0.0f)),
                       Vertex(Vector3f(0.0f, -1.0f, -1.15475), Vector2f(0.5f, 0.0f)),
                       Vertex(Vector3f(1.0f, -1.0f, 0.5773f),  Vector2f(1.0f, 0.0f)),
                       Vertex(Vector3f(0.0f, 1.0f, 0.0f),      Vector2f(0.5f, 1.0f)) };

我猜它适用于金字塔形状的物体,但它对我的立方体效果不佳。问题是我需要为同一个顶点使用不同的纹理坐标,这个顶点与另一个面共享。

所以我想,“哦,我知道!我只是用指数打包纹理坐标!”我愉快地创建了将索引映射到纹理坐标的数据结构,但现在我遇到了障碍:指数需要进入GL_ELEMENT_ARRAY_BUFFER,纹理坐标需要进入GL_ARRAY_BUFFER。< / p>

这是否意味着我无法将此数据打包到一个缓冲区中?我必须将索引数组和纹理坐标数组拆分成两个独立的结构?

此外,我刚刚意识到顶点位置和纹理坐标之间不再存在1:1的映射......我不知道如何重写我的顶点着色器。

或者我应该按照教程的方式(将顶点位置和纹理坐标包装在一起)进行操作,并在必要时重复顶点?

我认为首先分离索引和顶点位置背后的整个想法是减少数据冗余,但是现在我必须在我想使用纹理时立即添加冗余?

1 个答案:

答案 0 :(得分:1)

你陷入了一种常见的误解,只用他们的位置来识别顶点。但这不是顶点。

实际上,顶点是其所有属性的完整组合,即位置,法线,纹理坐标。因此,如果纹理坐标不同,您将拥有一个非常不同的顶点,它具有自己的索引。所以你必须复制位置,法线等数据,除了不同的纹理坐标。