Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽屉元素在多个对象中无法按预期工作_Java_Opengl_Lwjgl - Fatal编程技术网

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参数时,您已经有了这些信息。