【问题标题】:LWJGL/OpenGL: Handling dynamic voxel terrain with dyanmic LOD with VBOs and VAOsLWJGL/OpenGL:使用 VBO 和 VAO 处理具有动态 LOAD 的动态体素地形
【发布时间】:2013-02-16 15:41:08
【问题描述】:

编辑:

我有不断变化的细节层次的块。每当一个块的细节级别发生变化时,我必须重新计算要绘制的顶点。顶点的数量因此而动态变化。

我的问题是,我不知道如何才能画出这个。我以为我可以删除旧缓冲区,然后重新加载新缓冲区。每隔几秒钟删除和重新加载缓冲区是有效的还是只是一个坏主意?有没有更好的方法来做到这一点?

这是我的想法:

//delete old buffers
    GL20.glDisableVertexAttribArray(0);

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
    GL15.glDeleteBuffers(vboID);

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
    GL15.glDeleteBuffers(vboiID);

    GL30.glBindVertexArray(0);
    GL30.glDeleteVertexArrays(vaoID);

//reload buffers with new vertex data
    vaoID = GL30.glGenVertexArrays();
    GL30.glBindVertexArray(vaoID);

    vboID = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertex_buffer, GL15.GL_DYNAMIC_DRAW);
    GL20.glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

    vboiID = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboiID);
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, index_buffer, GL15.GL_DYNAMIC_DRAW);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);

    GL30.glBindVertexArray(0);

必须有比这更好的方法来做到这一点......我可能只是像往常一样错过了一些关键概念,所以请让我知道我是否只是一个完整的白痴尝试这样做。谢谢!

【问题讨论】:

    标签: java opengl 3d buffer lwjgl


    【解决方案1】:

    尝试使用 glBufferSubData(),它一定是你需要的。

    【讨论】:

    • 这是否允许我将数据动态添加到列表中,而不仅仅是覆盖已经存在的数据?
    • 我真的不知道,但我读过它。我认为这是关于 OpenGL 的问题的错误地方。
    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    相关资源
    最近更新 更多