【问题标题】:DrawElements not working as expected with multiple objectsDrawElements 不能按预期与多个对象一起工作
【发布时间】: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));

所以我做了以下事情:

  1. 创建一个ARRAY_BUFFER 并将所有顶点数据存储在其中。
  2. 创建一个顶点数组对象,并设置position数据的位置。
  3. 创建一个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 个索引对应的顶点数据并绘制。

这不起作用的可能原因是什么?

【问题讨论】:

    标签: java opengl lwjgl


    【解决方案1】:

    glDrawElements 最后一个参数曾经是一个指向索引数组的指针。对于 VBO,此参数可作为字节大小的偏移量重用到 VBO。所以它不需要一个索引,而是一个字节偏移量到 VBO 到数据开始的位置。在您的情况下,sizeof(GLfloat) * x 其中sizeof(GLfloat) 通常为 4。因此,您必须将特定数据布局相乘,您必须将偏移索引乘以 4 才能获得字节偏移。

    【讨论】:

    • 好像应该是sizeof(GL_float) * x,而不是多余的* 3,这样也对吗?
    • @skiwi:是的,我不小心想到了 VBO 的偏移量,当然使用 glVertexAttribPointer 的 size 参数你已经有了这些信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2021-04-07
    • 2020-03-28
    • 1970-01-01
    相关资源
    最近更新 更多