Java 顶点数组的问题

Java 顶点数组的问题,java,opengl,lwjgl,vertex-array,vertex-array-object,Java,Opengl,Lwjgl,Vertex Array,Vertex Array Object,我正在尝试学习如何处理VBO(VertexBufferObjects),但我只能学习顶点数组。我遵循了一些关于这个主题的基本教程,每一个都以不同的方式进行教学,这使我很难理解和实施 问题:使用glDrawArrays()进行渲染的工作方式应与即时模式下的渲染相同。因此,我试图通过测试代码,但我得到的只是本机代码中的JVM崩溃。询问谷歌一点帮助都没有,因为这种方法有几十种变体。但我认为我的参数是主要问题 以下是我到目前为止得到的信息: 我使用LWJGL,所以我将数据存储在浮动缓冲区中: Float

我正在尝试学习如何处理VBO(VertexBufferObjects),但我只能学习顶点数组。我遵循了一些关于这个主题的基本教程,每一个都以不同的方式进行教学,这使我很难理解和实施

问题:使用
glDrawArrays()进行渲染的工作方式应与即时模式下的渲染相同。因此,我试图通过测试代码,但我得到的只是本机代码中的JVM崩溃。询问谷歌一点帮助都没有,因为这种方法有几十种变体。但我认为我的参数是主要问题

以下是我到目前为止得到的信息:

我使用LWJGL,所以我将数据存储在浮动缓冲区中:

FloatBuffer buffer = BufferUtils.createFloatBuffer(triangles.size() * 3 * 3);

for(Triangle tri : triangles) {
    buffer.put((float) tri.getA().x);
    buffer.put((float) tri.getA().y);
    buffer.put((float) tri.getA().z);

    buffer.put((float) tri.getB().x);
    buffer.put((float) tri.getB().y);
    buffer.put((float) tri.getB().z);

    buffer.put((float) tri.getC().x);
    buffer.put((float) tri.getC().y);
    buffer.put((float) tri.getC().z);
}
我的三角形类由3个向量A B C组成,每个向量定义一个顶点。在第一行中,我为顶点分配空间,每个三角形9个浮动(每个顶点3个浮动,每个三角形3个顶点)。到目前为止,没有什么不寻常的,放在缓冲区内的浮动量正好等于分配的大小

立即模式下的渲染:

    glBegin(GL_TRIANGLES);
    for (Triangle tri : this.triangles) {
        glVertex3d(tri.getA().x, tri.getA().y, tri.getA().z);
        glVertex3d(tri.getB().x, tri.getB().y, tri.getB().z);
        glVertex3d(tri.getC().x, tri.getC().y, tri.getC().z);
    }
    glEnd();
也没什么特别的,到目前为止看到的一切对我来说都很好。但是数组变量让我头疼

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, 0, buffer);

    glDrawArrays(GL_TRIANGLES, 0, buffer.capacity());

    glDisableClientState( GL_VERTEX_ARRAY );

崩溃的JVM生成的错误日志指向
gldrawArray(GL_三角形,0,buffer.capacity())行,但我找不到我的错误

首先,您需要在代码中添加
buffer.flip()

Java中的缓冲区有一个内部当前位置,这是LWJGL在调用
glvertexinter(…)
时用来标记数据开头的位置。每次调用
buffer.put(…)
,它都会增加缓冲区的大小,并将当前位置设置为缓冲区的结尾

调用
flip(…)
将当前位置移动到缓冲区的开头。这样,当您尝试绘制
容量(…)
-从“当前”位置开始的多个顶点时,将不会溢出缓冲区


此外,每个顶点都是从3浮动中构建的。这里的容量是根据浮点组件的数量来衡量的,所以存储在缓冲区中的顶点数量实际上是它的容量除以3

似乎有效,我将用它做更多的测试。谢谢