【发布时间】:2014-03-05 14:23:43
【问题描述】:
在我的程序中,我基本上将所有对象放在一个缓冲区中,现在当我想绘制多个对象时遇到问题,如果我只绘制一个它仍然可以工作。
当我粗略地将所有 glDrawArrays 更改为 glDrawElements 调用时,问题开始出现,当然还有所有底层基础架构。
到目前为止,我只是做了一个从顶点到索引的一对一映射。
我正在使用 Java 8、LWJGL 和 OpenGL 3.3。
初始化:
//drawable vertex buffer
vertexBuffer = new StaticDrawArrayBuffer().create().bind().fillData(Drawable.putAllVertexData(drawables));
vertexArray = new VertexArrayObject().create().bind()
.setAttribute(vertexBuffer, VS_POSITION, 3, GL_FLOAT, false, 0, 0)
.enableAttributes(VS_POSITION);
//drawable elements buffer
elementBuffer = new StaticDrawElementArrayBuffer().create().bind().fillData(Drawable.putAllElementsData(drawables));
所以我做了以下事情:
- 创建一个
ARRAY_BUFFER并将所有顶点数据存储在其中。 - 创建一个顶点数组对象,并设置
position数据的位置。 - 创建一个
ELEMENT_ARRAY_BUFFER并将所有索引存储在其中。
内容如下;
顶点数据:
-400.0
0.0
-400.0
-400.0
0.0
400.0
400.0
0.0
-400.0
-400.0
0.0
400.0
400.0
0.0
-400.0
400.0
0.0
400.0
1.0
1.0
-1.0
-1.0
1.0
-1.0
-1.0
1.0
1.0
-1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
-1.0
1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
1.0
-1.0
-1.0
1.0
1.0
-1.0
1.0
1.0
-1.0
-1.0
-1.0
1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
1.0
-1.0
-1.0
1.0
-1.0
1.0
1.0
-1.0
1.0
-1.0
-1.0
1.0
1.0
-1.0
-1.0
1.0
1.0
-1.0
1.0
1.0
-1.0
1.0
1.0
1.0
1.0
-1.0
1.0
1.0
1.0
1.0
1.0
1.0
-1.0
1.0
1.0
-1.0
-1.0
1.0
-1.0
-1.0
1.0
1.0
-1.0
1.0
1.0
1.0
1.0
1.0
-1.0
1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
1.0
-1.0
1.0
1.0
-1.0
指数数据:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
所以这是 126 个浮点数,应该由 (x, y, z) 映射到 42 个索引。
但是,当我随后进行以下调用时:
gl.glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)
gl.glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 6)
对象被相互混合绘制,绝对不是它们应该看起来的样子,我认为代码会做的是;
- 取偏移量0后前6个索引对应的顶点数据并绘制。
- 取偏移量 6 后前 36 个索引对应的顶点数据并绘制。
这不起作用的可能原因是什么?
【问题讨论】: