我正在使用/定位 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 的目的。
没有帮助的资源:
这些是我发现的相关的东西,但似乎(对我来说)要么被弃用/没有回答/不完全符合我的要求。如果它确实回答了我的问题,请随时将我指向这些帖子之一。
这似乎是说 glDrawElements 对立方体毫无用处,并且您必须有单独的顶点构成面。这也适用于二维网格吗?
这个问题的答案是(除其他外)“两个顶点位置相同的正方形,但不同的纹理坐标必须用不同的四边形表示。” 但我不明白他在说什么。
我认为这很接近。答案是:第一个链接已损坏/访问被拒绝。第二个链接有一个答案,基本上说顶点必须是不同的。这是必需的吗?在第三个链接(第二个代码片段)中,它们似乎只生成了所有 36 个顶点。对于一个立方体,这可能没问题,但是对于 n 个立方体..?我是否错过了他的例子的重点,也许?
我所要求的甚至可能吗?我是否使用完全不正确的功能来实现我想要实现的目标?“你做到了”?
我想过重新安排坐标,所以它看起来像:
0 2 4 6 8 10
+--+--+--+--+--+
| | | | | |
+--+--+--+--+--+
1 3 5 7 9 11
但我没有看到这将如何解决问题,因为顶点仍然是共享的。
谢谢,请随时纠正我/我的问题。第一个,所以我希望它需要修改。