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}指针设置为可处置) glDrawElements(返回后,将gl {Normal,Color,TexCoord,Attrib,Vertex} Pointer设置为指针,可以处理元素数组) glTexImage(内存数据指向) glTexSubImage(内存数据指向) glBufferData(内存数据指向) glBufferSubData(内存数据指向) 重要的是要知道gl {Normal,Color,TexCoord,Attrib,Vertex} Pointer只是设置了一个指针,而不创建副本。但是,将通过glDrawElements和glDrawArrays调用创建某种类型的数据副本(取决于驱动程序,不是立即生成物理副本,而是根据写时复制方案调整了内存管理,以防缓冲区未获得由用户程序修改或释放,可以节省关键的带宽和CPU周期。     

要回复问题请先登录注册