【问题标题】:How to use glDrawElements while keeping Texture Coordinates correct?如何在保持纹理坐标正确的同时使用 glDrawElements?
【发布时间】:2012-10-21 14:59:57
【问题描述】:

我正在使用/定位 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”是反向/反射。

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

没有帮助的资源:

这些是我发现的相关内容,但(对我而言)似乎已被弃用/未回答/不完全符合我的要求。如果确实确实回答了我的问题,请随时将我指向其中一篇文章。

This 似乎在说 glDrawElements 对立方体没用,并且您必须有单独的顶点构成面。这也适用于二维网格吗?

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

This one 我以为很接近。答案是:第一个链接已损坏/访问被拒绝。 second link 有一个答案,基本上说顶点必须是不同的。这是必需的吗?在第三个链接(第二个代码 sn-p)中,它们似乎只生成了所有 36 个顶点。对于一个立方体,这可能没问题,但是对于 n 个立方体..?也许我错过了他的例子的重点?

我的要求甚至可能吗?我是否使用完全不正确的功能来实现我想要实现的目标? “你做到了”?

我考虑过重新排列坐标,使其看起来像:

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

但我不知道这将如何解决问题,因为顶点仍然是共享的。

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

【问题讨论】:

  • +1 用于扎实的研究工作。我希望更多的第一张海报像你一样。诚然,您确实找到了您的确切答案(尽管您不喜欢它),但 A 表示努力。
  • 提示:顶点 2 不能同时具有 uv (1,1)(0, 1)。因为它只有一个实例。如果您将纹理映射到整个几何体上,这应该可以完美地工作,因为对于顶点的两个实例(纹理的延续),UV 将是相同的。如果您像[pos][uv],[pos][uv],[pos][uv],... 这样交错数据,这可能会更明显。您总是需要评估您的 UV,并且可以共享法线。否则你需要拆分它们。

标签: c opengl textures


【解决方案1】:

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

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

还有since you cannot have the same position with two different texture coordinates,你必须重复你的职位。

【讨论】:

  • 谢谢。但是,如果是这种情况,那么 glDrawElements 在哪里有用?显然不是在这种情况下,但现在我不确定它的目的。
  • @Alex:这对于纹理坐标、法线等没有锐利边缘的光滑表面很有用。大多数角色模型大多是平滑的;每个三角形不会在纹理的各个部分之间跳跃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 2012-07-29
  • 2012-11-28
相关资源
最近更新 更多