Java 抽屉元素在多个对象中无法按预期工作
在我的程序中,我基本上把所有对象放在一个缓冲区中,现在我想画多个对象时遇到了问题,如果我只画一个对象,它仍然可以工作。Java 抽屉元素在多个对象中无法按预期工作,java,opengl,lwjgl,Java,Opengl,Lwjgl,在我的程序中,我基本上把所有对象放在一个缓冲区中,现在我想画多个对象时遇到了问题,如果我只画一个对象,它仍然可以工作。 当我粗略地将所有glDrawArrays更改为glDrawElements调用,当然还有所有底层基础结构时,问题就开始出现了。 到现在为止,我只是做了一个从顶点到索引的一对一映射 我正在使用Java8、LWJGL和OpenGL3.3 初始化: //drawable vertex buffer vertexBuffer = new StaticDrawArrayBuffer().
当我粗略地将所有
glDrawArrays
更改为glDrawElements
调用,当然还有所有底层基础结构时,问题就开始出现了。到现在为止,我只是做了一个从顶点到索引的一对一映射 我正在使用Java8、LWJGL和OpenGL3.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));
因此,我做了以下工作:
数组\u缓冲区
,并将所有顶点数据存储在其中位置
数据的位置元素\数组\缓冲区
,并将所有索引存储在其中-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个索引对应的顶点数据并绘制
这不起作用的可能原因是什么?glDraweElements最后一个参数是指向索引数组的指针。对于VBO,此参数将作为字节大小的偏移量重新使用到VBO中。因此,它不采用索引,而是将字节偏移量输入到VBO中数据开始的位置。在您的情况下,这将是
sizeof(GLfloat)*x
,其中sizeof(GLfloat)
通常是4。因此,您必须将特定的数据布局相乘,您必须将偏移量索引乘以4才能得到字节偏移量。看起来它需要是sizeof(GL_float)*x
,而不是额外的*3
,这也正确吗?@skiwi:是的,我不小心想到了VBOs中的偏移量,当然,在使用glVertexAttribPointer的size参数时,您已经有了这些信息。