慢跑。 OpenGL。如何更新 VBO?

Posted

技术标签:

【中文标题】慢跑。 OpenGL。如何更新 VBO?【英文标题】:JOGL. OpenGL. How to update a VBO? 【发布时间】:2019-03-24 05:55:41 【问题描述】:

这个想法 - 用如下代码画一些线:

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);

pvalues 是float[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]);但结果相同。

有缓存之类的吗?

【问题讨论】:

【参考方案1】:

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

FloatBuffer vertBuf = Buffers.newDirectFloatBuffer(pvalues);
gl.glBufferData(GL_ARRAY_BUFFER, vertBuf.limit() * 4, vertBuf, GL_STATIC_DRAW);

此代码不会生成 “VBO 对象索引”。 glGenBuffers 保留名称以用作缓冲区对象。glBufferData 创建并初始化缓冲区对象的数据存储。

因此,当调用gl.glBufferData(...) 时,缓冲区数据将被销毁、重新创建和初始化。这会导致缓冲区数据的变化丢失。 只需在缓冲区初始化时执行一次,而不是在每一帧中执行一次。

【讨论】:

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

以上是关于慢跑。 OpenGL。如何更新 VBO?的主要内容,如果未能解决你的问题,请参考以下文章

opengl vbo建议[关闭]

切换到使用交错 VBO - 编译但没有绘制 - opengl es 2.0

OpenGL 使用单个 VBO 渲染多个对象,并使用另一个 VBO 更新对象的矩阵

更新 openGL VBO

OpenGL 更新不同大小的 VBO 数据

OpenGL VBO 没有正确更新