OpenGL有 一些功能 直接指点。他们中有一些 从这些指针中读取数据, 其他 将数据写入这些指针。
但是,OpenGL函数通常不会立即执行。通常,当您绘制某些内容时,绘图需要一段时间才能完成。
那么我怎么知道OpenGL何时完成了我给它的指针呢?
OpenGL有 一些功能 直接指点。他们中有一些 从这些指针中读取数据, 其他 将数据写入这些指针。
但是,OpenGL函数通常不会立即执行。通常,当您绘制某些内容时,绘图需要一段时间才能完成。
那么我怎么知道OpenGL何时完成了我给它的指针呢?
除了下面提到的例外,所有OpenGL函数都将使用在函数返回时给出的任何指针完成。所以 glReadPixels
将在返回时完成所有像素读取和格式转换。这就是为什么 异步像素传输 对阅读操作非常重要。它允许OpenGL 不 这样做,不与GPU同步。
此规则的唯一例外是以“指针”一词结尾的每个函数。像 glVertexAttribPointer
, glTexCoordPointer
等等。当您使用具有这些功能的客户端内存(在核心配置文件OpenGL 3.2+中不再合法)时,这些函数会存储指向该内存的指针。因此,只要您打算使用这些顶点属性进行渲染,就必须确保此指针有效。
在使用客户端内存进行每次渲染调用之后,OpenGL要求在渲染函数返回时实现已从客户端内存中完成读取。所以你可以打电话 glDrawArrays
,然后删除有问题的指针。只要你在改变那些指针之前不再进行另一次抽签,你就没事了。这意味着OpenGL必须在渲染调用返回时复制出所有相关的顶点数据(使用缓冲区对象的原因之一更快)。