OpenGL – 我必须始终保存上传到VBO的数据吗?

如果我将我的顶点数据从一个文件加载到RAM中的一个缓冲区中,然后将其上传到GPU(例如,对于一个静态的VBO,所以不需要修改数据),我是否需要保留这个缓冲区? 如果不是,我怎么知道上传完成?

所有OpenGL函数(除了下面提到的例外)都将在函数返回时完成。 所以glBufferDataglBufferSubData在它们返回的时候将完成从它们指针的所有读取。

这并不一定意味着他们已经读入这些缓冲区。 实现可能已经分配了一块存储并将数据复制到其中,之后它将asynchronous地调度数据的上传。

这个规则的唯一例外是每个以“Pointer”结尾的函数。 像glVertexAttribPointerglTexCoordPointer等等。 当你使用这些函数的客户端内存(在OpenGL 3.2+核心configuration文件中不再合法)时,这些函数会存储一个指向该内存的指针。 因此,只要您打算使用这些顶点属性进行渲染,就必须确保此指针有效。

在使用客户端内存进行每个渲染调用之后,OpenGL要求实现已经在渲染函数返回时从客户端内存读取完毕。 所以你可以调用glDrawArrays ,然后删除有问题的指针。 而且只要你改变了这些指针,你就不要再打一个电话了,你就没事了。 这意味着在渲染调用返回的时候,OpenGL必须复制出所有相关的顶点数据(这是使用缓冲对象的原因之一)。

glBufferData将阻塞,直到所有数据被安全地复制到某个地方。

您可以改为将缓冲区映射到RAM并填充该缓冲区。 然后,当您取消映射数据传输将完成。

不,你不需要保存RAM中的数据。

该function需要上传数据,直到上传完成。