标题说明了一切,但为了清楚起见,我将添加一些额外的词。
在这种情况下,调整大小意味着:
编辑
至于解释更多细节并证明我的问题是合理的:
我会将(正手)未知大小的数据存储到 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/