1

我试图了解如何为 GL_QUAD_STRIP 指定纹理坐标。

我已经设法让事情为一个四边形工作:

float vertices[] = { 0.0f, 0.0f, 1.0f,   +1.0f, 0.0f, 0.0f,  // bottom line
                     0.0f, 1.0f, 1.0f,   +1.0f, 1.0f, 0.0f}; // top line

unsigned int indices[] = {2, 0,  // x =  0
                          3, 1}; // x = +1

float textureCoordinates[] = { 1.0f, 0.0f, 
                               0.0f, 0.0f,
                               1.0f, 1.0f,
                               0.0f, 1.0f};
...

glBindBuffer(GL_ARRAY_BUFFER, 0); // unbinds any buffer object previously bound
glTexCoordPointer(2, GL_FLOAT, 0, textureCoordinates);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibufferid);
glDrawElements(GL_QUAD_STRIP, 4, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

这是结果的外观(带有图像的白色矩形,其余部分用于帮助解释): 在此处输入图像描述

但是我不明白选择 textureCoordinates[] 背后的逻辑:-(。

第一个纹理坐标是(1,0);我会假设这对应于右下角?

另外我会假设当OpenGL读取第一个索引:2时,它使用它来查找顶点:(0,1,1):左上角。接下来它读取第一个纹理坐标:(1,0)。但如上所述,我认为这是纹理的右下角!?

然而,纹理显示为未旋转,所以这不可能!?

4

1 回答 1

2

就像顶点一样,纹理坐标也是根据使用的索引来选择的glDrawElements()。所以第一个纹理坐标不是(1,0),而是(1,1),因为第一个索引是2。顶点和坐标将根据下表,其中i =索引,v =顶点和t =纹理坐标. (我只考虑顶点的 x 和 y 坐标,因为在这种情况下 z 坐标并不重要。)

i   v     t
2 (0,1) (1,1)
0 (0,0) (1,0)
3 (1,1) (0,1)
1 (1,0) (0,0)

如果我们把它画在一张纸上,我们可以看到这意味着坐标更有意义,因为索引很重要。(我建议您这样做!我必须这样做才能了解发生了什么。)请注意表格中的 y 坐标如何在给定索引的顶点和纹理坐标之间完美匹配。但是 x 坐标不匹配:当顶点 x = 0 时,纹理坐标 x = 1,反之亦然。我认为这会使图像看起来围绕 y 轴镜像,而不是以任何方式旋转。原始图像是什么样的?与我们在您发布的图像中看到的相比,它是否镜像,因此建筑物位于左侧?如果是这样,纹理坐标就是解释。在这种情况下,纹理坐标 2 和 3 应该交换位置。

如果您好奇,可以查看第 18 页的OpenGL 2.1 规范,图 2.5(a),了解为什么选择顶点索引。当投影到屏幕上时,它将创建一个顶点以逆时针方向指定的四边形。这很好,因为glFrontFace()的初始值为GL_CCW,这意味着我们在渲染图像中看到了多边形的正面,如果启用了剔除,多边形将不会被剔除(参见glCullFace())。(但默认情况下不启用剔除,因此它可能对您的情况很重要,也可能无关紧要。)

我希望这会有所帮助。如果有不清楚的地方请发表评论!

于 2013-01-07T23:51:42.383 回答