在我的程序中,我基本上将所有对象放在一个缓冲区中,现在我想要绘制多个对象时遇到问题,如果我只绘制一个它仍然可以工作。
当我大致更改所有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 :(得分:2)
glDrawElements最后一个参数曾经是指向索引数组的指针。使用VBO,此参数将作为字节大小的偏移量重新用于VBO。所以它不需要一个索引,而是一个字节偏移到VBO到数据开始的位置。在你的情况下,sizeof(GLfloat) * x
sizeof(GLfloat)
通常为4.所以你必须乘以你的特定数据布局,将偏移索引乘以4得到字节偏移量。