我试图了解如何为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)。 但如上所述,我认为这是纹理的右下角!
然而纹理显示未旋转,所以情况并非如此!?
答案 0 :(得分:2)
就像顶点一样,纹理坐标也是根据glDrawElements()
使用的索引选择的。所以第一个纹理坐标不是(1,0),而是(1,1),因为第一个索引是2.顶点和坐标将根据下表,其中i = index,v = vertex和t = texture coordinate 。 (我只考虑顶点的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 specification,图2.5(a),看看为什么选择顶点索引。当投影在屏幕上时,它将创建一个四边形,顶点以逆时针方向指定。这很好,因为glFrontFace()的初始值为GL_CCW
,这意味着我们会在渲染图像中看到多边形的正面,而多边形不会被剔除已启用剔除(请参阅glCullFace())。 (默认情况下不会启用剔除,因此在您的情况下可能会或可能不会重要。)
我希望这有帮助。如果有什么不清楚的话,请做评论!