glDrawArrays:什么时候完成



伪代码:

void draw()
{
    Vertex* vertices = scene.GetVertexArray();
    glEnableClientState(...);
    glVertexPointer(..., vertices);
    glDrawArrays(...);
    glDisableClientState(...);
    delete vertices;
}

我不使用VBO,因为我想支持旧的OpenGL实现。

调用glDrawArrays后,我想:

  • 取消分配我的顶点数组("delete vertices;"(
  • 可能修改一些顶点

然而,GL可以自由地异步执行glDrawArrays,并且在数组完成之前解除分配或修改数组是不安全的。

我可以做一个glFinish来确保这一点,但它会减慢应用程序的速度。

那么,在什么时候我可以自由地解除分配/修改我的顶点数组呢?

OpenGL向您保证,一旦任何实际访问内存的函数返回,您就可以更改或取消分配其内容。这些功能是:
  • glDrawArrays(返回后,内存gl{Normal,Color,TexCoord,Attrib,Vertex}Pointer已设置为可以处置(
  • glDrawElements(返回后,内存gl{Normal,Color,TexCoord,Attrib,Vertex}Pointer已设置为,并且可以处理元素阵列(
  • glTexImage(内存数据指向(
  • glTexSubImage(内存数据指向(
  • glBufferData(内存数据指向(
  • glBufferSubData(内存数据指向(

重要的是要知道gl{Normal,Color,TexCoord,Attrib,Vertex}Pointer只需设置一个指针,不要创建副本。然而,某种数据的副本是由glDrawElements和glDrawArrays调用生成的(根据驱动程序的不同,不会立即生成物理副本,而是根据写时复制方案调整内存管理——如果用户程序没有修改或释放缓冲区,这将节省关键的带宽和CPU周期(。

相关内容

  • 没有找到相关文章

最新更新