gpt4 book ai didi

opengl - glDrawArrays : when has it finished?

转载 作者:行者123 更新时间:2023-12-02 04:41:13 26 4
gpt4 key购买 nike

伪代码:

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

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

调用 glDrawArrays 后,我想要:

  • 释放我的顶点数组(“删除顶点;”)
  • 也许修改一些顶点

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

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

那么我什么时候可以自由地释放/修改我的顶点数组?

最佳答案

OpenGL 向您保证,一旦任何实际访问某些内存的函数返回,您就可以更改或释放其内容。这些功能是:

  • glDrawArrays(返回后可以释放内存gl{Normal,Color,TexCoord,Attrib,Vertex}Pointer)
  • glDrawElements(返回后,内存gl{Normal,Color,TexCoord,Attrib,Vertex}指针被设置,并且可以处理元素数组)
  • 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com