何时清除顶点缓冲区对象

Hul*_*000 1 opengl vbo

我只是想知道:何时(以及可能如何)清除VBO中的数据.在重写数据之前,您是否必须清除它?为什么清楚呢?

Col*_*Two 5

清除缓冲区(即将每个字节设置为0)并不太有用.使缓冲区无效.

使缓冲区的一部分无效意味着该部分的内容变为无效,并且在使用之前必须将新内容写入该部分.这允许OpenGL实现避免等到缓冲区对象不再被使用,以便通过给你一个完全"新"的缓冲区来写入(在同一名称下)来向它上传数据.这种技术称为缓冲孤儿.

无效的缓冲区,你可以调用glBufferData相同尺寸和使用提示,但有一个NULL数据指针,使用glMapBufferRangeGL_MAP_INVALIDATE_BUFFER_BIT,或者glInvalidateBufferData如果你的GPU支持它.

用于缓冲对象流OpenGL Wiki文章更详细地介绍了这一点,并提供了其他几种解决方案.

要直接回答您的问题,在更新缓冲区之前不需要使缓冲区无效或清除缓冲区.glBufferSubData只要您想要更新所需的任何内容,就可以拨打电话.但是,在没有失效的情况下这样做可能会导致管道停滞,因为OpenGL在安全更新之前等待缓冲区完成使用.

  • 对于寻求现代方法的人,请考虑像 glClearNamedBufferSubData 这样的函数 (2认同)