DrawElements与多个对象无法正常工作

时间:2014-03-05 14:23:43

标签: java opengl lwjgl

在我的程序中,我基本上将所有对象放在一个缓冲区中,现在我想要绘制多个对象时遇到问题,如果我只绘制一个它仍然可以工作。
当我大致更改所有glDrawArraysglDrawElements来电,当然还有所有底层基础架构时,问题就开始发生了。
截至目前,我只是简单地从顶点到索引进行了一对一映射。

我正在使用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并将所有索引存储在那里。
  4. 内容如下;

    顶点数据:

    -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个索引相对应的顶点数据并绘制。

    这可能是什么原因导致这种情况无效?

1 个答案:

答案 0 :(得分:2)

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