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

Hyd*_*ium 14 c opengl textures

我正在使用/目标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,
};
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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

基本上我得到的是:

0  1  2  3  4  5
+--+--+--+--+--+
|b | d|b |d |b |
+--+--+--+--+--+
6  7  8  9 10 11
Run Code Online (Sandbox Code Playgroud)

我想要的是:

0  1  2  3  4  5
+--+--+--+--+--+
|b |b |b |b |b |
+--+--+--+--+--+
6  7  8  9 10 11
Run Code Online (Sandbox Code Playgroud)

其中"b"是纹理/正方形的正确方向,"d"是反向/反射.

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

资源没有帮助:

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

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

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

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

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

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

0  2  4  6  8 10
+--+--+--+--+--+
|  |  |  |  |  |
+--+--+--+--+--+
1  3  5  7  9 11
Run Code Online (Sandbox Code Playgroud)

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

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

Nic*_*las 5

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

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

由于两个不同的纹理坐标不能具有相同的位置,因此必须复制您的位置。