opengl - 是否可以就地调整 VBO 的大小?

标签 opengl vbo

标题说明了一切,但为了清楚起见,我将添加一些额外的词。

在这种情况下,调整大小意味着:

  • 在旧 vbo 末尾获得更多存储空间
  • 将旧数据保存在前面
  • (希望不是复制,但至少不是在 CPU 端,这意味着驱动程序应该处理这个)

  • 编辑

    至于解释更多细节并证明我的问题是合理的:
    我会将(正手)未知大小的数据存储到 VBO,但我只知道一个非常粗略的估计上限(10 - 100 倍,在异常情况下甚至更多)。

    当然,我知道我存储了多少数据,当我完成它时,所以存储数据会很好,直到我发现我的 VBO 太小并调整它的大小然后继续存储。

    这就是我不想复制的原因(尤其是不在 CPU 端):
    我在 GPU 上执行所有这些操作以获得交互式帧速率。当我必须复制时,它非常慢甚至不可能,因为没有足够的空间。最糟糕的是通过 CPU 复制数据,从而将所有内容通过总线传递到一个具有足够大小的新内存区域,然后 glBufferData使用新大小和新内存区域作为源的 VBO。那将是性能杀手。

    绕过

    我通过精确估计所需空间来规避这个问题。但是我会让这个问题一个星期没有答案,看看是否有人对此有另一个提示,因为我对解决方案不太满意。

    最佳答案

    我认为不做副本你就不会解决这个问题,因为调整缓冲区大小的唯一方法是调用 glBufferData并且 IMO 无法告诉驱动程序保留旧数据。

    您可以做的至少不将其复制到 CPU 并再次返回,就是为此目的创建某种辅助 VBO,并直接从 VBO 复制到辅助 VBO(使用 ARB_copy_buffer 扩展名),调整 VBO 的大小并将其内容复制回来。

    但我认为最好的方法是事先分配一个更大的缓冲区,因此不需要调整大小,但当然在这种情况下,您需要知道大约需要多少额外的存储空间。

    关于opengl - 是否可以就地调整 VBO 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7256479/

    相关文章:

    java - glDrawElements 不绘制任何东西

    c - 简单的 VBO 示例存在问题

    c++ - 在着色器中从 glOrtho 切换到 MVP 矩阵后没有绘制任何东西

    python - 如何在 PyOpenGL 中旋转某个对象(Quad)?

    c++ - OpenGL:如何检查用户是否支持 glGenBuffers()?

    c - OpenGL - 着色器测试

    performance - OpenGL ES 2.0 : The most efficient setup for a VBO with GL_STREAM_DRAW?

    python - 有没有办法更改 Pygame 中导入的 .obj 文件的位置和大小?

    android - 为什么要使用 VBO 和/或 IBO 而不是简单的顶点数据?

    opengl - 在空间中移动多个对象(存储在 VBO 中)的最有效方法是什么?我应该使用 glTranslatef 还是着色器?