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