Java 慢跑。OpenGL。如何更新VBO?

Java 慢跑。OpenGL。如何更新VBO?,java,opengl,jogl,vbo,Java,Opengl,Jogl,Vbo,想法-通过代码画一些线,如: gl.glBindBuffer(GL_ARRAY_BUFFER, line.getVertexOpenGLArray()); gl.glVertexAttribPointer(VERTEX_INDEX, 3, GL_FLOAT, false, 0, 0); gl.glEnableVertexAttribArray(VERTEX_INDEX); gl.glEnable(GL_DEPTH_TEST); gl.glDepthFunc(GL_LEQUAL); gl.g

想法-通过代码画一些线,如:

gl.glBindBuffer(GL_ARRAY_BUFFER, line.getVertexOpenGLArray());

gl.glVertexAttribPointer(VERTEX_INDEX, 3, GL_FLOAT, false, 0, 0);

gl.glEnableVertexAttribArray(VERTEX_INDEX);

gl.glEnable(GL_DEPTH_TEST);
gl.glDepthFunc(GL_LEQUAL);
gl.glFrontFace(GL_CCW);

gl.glDrawArrays(GL_LINES, 0, line.getVertices().length);
line.getVertexOpenGLArray()返回由以下生成的VBO对象索引时:

        FloatBuffer vertBuf = Buffers.newDirectFloatBuffer(pvalues);
        gl.glBufferData(GL_ARRAY_BUFFER, vertBuf.limit() * 4, vertBuf, GL_STATIC_DRAW);
FloatBuffer vertBuf = Buffers.newDirectFloatBuffer(pvalues);
gl.glBufferData(GL_ARRAY_BUFFER, vertBuf.limit() * 4, vertBuf, GL_STATIC_DRAW);
pvalues是
浮点[6]{x1,y1,z1,x2,y2,z2}
包含这条线的两个顶点的坐标

然后,我尝试通过以下方式更改VBO中的第二个顶点:

        FloatBuffer line_buf = Buffers.newDirectFloatBuffer(new_vertexes); 

        gl.glBufferSubData(GL_ARRAY_BUFFER, 0, line_buf.limit() * 4, line_buf);
        Buffer f = Buffers.newDirectFloatBuffer(line_vertexes);

        gl.glGetBufferSubData(GL_ARRAY_BUFFER, 0, line_buf.limit() * 4, f);

        System.out.println("Vertexes: " +
                ((FloatBuffer) f).get() + ", "+
                ((FloatBuffer) f).get() + ", "+
                ((FloatBuffer) f).get() + ", "+
                ((FloatBuffer) f).get() + ", "+
                ((FloatBuffer) f).get() + ", "+
                ((FloatBuffer) f).get());
它报告说,值已成功更改。但是,当我渲染下一帧时,我看到由旧顶点坐标放置的线

我尝试使用gl.glInvalidateBufferData(vbo[VERTEX_INDEX]);但同样的结果

有什么缓存之类的吗

line.getVertexOpenGLArray()返回由以下生成的VBO对象索引时:

        FloatBuffer vertBuf = Buffers.newDirectFloatBuffer(pvalues);
        gl.glBufferData(GL_ARRAY_BUFFER, vertBuf.limit() * 4, vertBuf, GL_STATIC_DRAW);
FloatBuffer vertBuf = Buffers.newDirectFloatBuffer(pvalues);
gl.glBufferData(GL_ARRAY_BUFFER, vertBuf.limit() * 4, vertBuf, GL_STATIC_DRAW);
此代码不生成“VBO对象索引”。 保留用作缓冲区对象的名称。
创建并初始化缓冲区对象的数据存储

因此,当调用
gl.glBufferData(…)
时,缓冲区数据将被销毁、重新创建和初始化。这会导致缓冲区数据的更改丢失。

这只能在缓冲区初始化时执行一次,而不是在每一帧中执行。

谢谢。现在我调用gl.glBufferData(…),每个帧都有一组新的顶点,它工作正常。