什么时候OpenGL完成函数指针?

OpenGL有许多直接指针的函数 。 其中一些从这些指针中读取数据 ,另一些则将数据 写入这些指针 。

但是,OpenGL函数通常不会立即执行。 通常,当您绘制某些内容时,绘图需要一段时间才能完成。

那么我怎么知道OpenGL何时完成了我给它的指针呢?

除了下面提到的例外,所有OpenGL函数都将使用在函数返回时给出的任何指针完成。 因此glReadPixels将在返回时完成所有像素读取和格式转换。 这就是异步像素传输对于读取操作如此重要的原因。 它允许OpenGL 这样做,不与GPU同步。

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

在使用客户端内存进行每次渲染调用之后,OpenGL要求在渲染函数返回时实现已从客户端内存中完成读取。 所以你可以调用glDrawArrays ,然后删除有问题的指针。 只要你在改变那些指针之前不再进行另一次抽签,你就没事了。 这意味着OpenGL必须在渲染调用返回时复制出所有相关的顶点数据(使用缓冲区对象的原因之一更快)。