如何在保持纹理坐标正确的同时使用glDrawElements?

我正在使用/目标OpenGL 4.20,GSLSL 4.20,核心。 使用C.

我正在使用OpenGL探索图形,并决定制作基于图块的游戏。 我正在想要实际绘制一堆瓷砖,我正在尝试使用glDrawElements绘制单个三角形。

相关代码:

const float vertexPositions[] = { -1.0f, -0.8f, //0 -0.8f, -0.8f, //1 -0.6f, -0.8f, //2 -0.4f, -0.8f, //3 -0.2f, -0.8f, //4 0.0f, -0.8f, //5 -1.0f, -1.0f, //6 -0.8f, -1.0f, //7 -0.6f, -1.0f, //8 -0.4f, -1.0f, //9 -0.2f, -1.0f, //10 0.0f, -1.0f, //11 //The following are the texture coordinates. 0.00f, 1.00f, 1.00f, 1.00f, 0.00f, 1.00f, 1.00f, 1.00f, 0.00f, 1.00f, 1.00f, 1.00f, 0.00f, 0.00f, 1.00f, 0.00f, 0.00f, 0.00f, 1.00f, 0.00f, 0.00f, 0.00f, 1.00f, 0.00f, }; const GLubyte indices[] = { 0, 1, 6, 1, 7, 6, 1, 2, 7, 2, 8, 7, 2, 3, 8, 3, 9, 8, 3, 4, 9, 4, 10, 9, 4, 5, 10, 5, 11, 10, }; 

 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void *)96); glDrawElements(GL_TRIANGLES, 30, GL_UNSIGNED_BYTE, indices); 

(还有其他部分,但它主要是格式化/属性启用等。如果需要,我会提供更多)。

基本上我得到的是:

 0 1 2 3 4 5 +--+--+--+--+--+ |b | d|b |d |b | +--+--+--+--+--+ 6 7 8 9 10 11 

而我想要的是:

 0 1 2 3 4 5 +--+--+--+--+--+ |b |b |b |b |b | +--+--+--+--+--+ 6 7 8 9 10 11 

其中“b”是纹理/正方形的正确方向,“d”是反向/reflection。

我意识到,由于顶点坐标是共享的,这将会发生,但从我自己的想法/下面的一些post看来它似乎是不可避免的。 我保留顶点并reflection纹理,或者我最终发送3 * 2 * number_of_tiles顶点,我觉得这会破坏glDrawElements的目的。

没有帮助的资源:

这些是我发现的相关的东西,但似乎(对我来说)要么被弃用/没有回答/不是我要求的。 如果事实上确实回答了我的问题,请随时回复其中一篇post。

这似乎说glDrawElements对于一个立方体是无用的,并且你必须有单独的顶点组成面。 这也适用于2D网格吗?

这个问题的答案是(除其他外)“具有相同顶点位置的两个正方形,但不同的纹理坐标必须用不同的四边形表示。” 但我不明白他在做什么。

我觉得这个很接近。 在答案中:第一个链接被破坏/访问被拒绝。 第二个链接有一个答案,基本上说顶点必须是不同的。 这需要吗? 在第三个链接(第二个代码片段)中,它们似乎只生成了所有36个顶点。 对于一个立方体,这可能没问题,但对于n个立方体..? 我可能错过了他的榜样吗?

我要求甚至可能吗? 我是否正在使用完全不正确的function来实现我的目标? “UR DOIN IT RONG”?

我想过重新安排坐标,看起来像:

 0 2 4 6 8 10 +--+--+--+--+--+ | | | | | | +--+--+--+--+--+ 1 3 5 7 9 11 

但我没有看到这将如何解决这个问题,因为顶点仍然是共享的。

谢谢,随时纠正我/我的问题。 第一个,所以我希望它需要修改。

第二个链接有一个答案,基本上说顶点必须是不同的。 这需要吗?

是。 您希望每个单独的四边形具有从0到1的纹理坐标。这意味着构成第一个四边形右侧的位置不能使用与构成左侧的位置相同的纹理坐标。第二个四边形

由于您不能使用两个不同的纹理坐标来获得相同的位置 ,因此您必须复制您的位置。