伪代码:

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 周期)。

    关于opengl - glDrawArrays : when has it finished?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5848116/

    10-16 03:42