Object 使用glBufferData后是否可以删除浮点数组?

Object 使用glBufferData后是否可以删除浮点数组?,object,opengl,buffer,vertices,Object,Opengl,Buffer,Vertices,我正在学习OpenGL API,我想问一下,在将浮点数组的顶点传递给OpenGL之后,是否可以删除它 示例代码: GLuint VBO; float *vertices = new float[2]; vertices[0] = 0.0f; vertices[1] = 1.0f; glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices

我正在学习OpenGL API,我想问一下,在将浮点数组的顶点传递给OpenGL之后,是否可以删除它

示例代码:

GLuint VBO;
float *vertices = new float[2];
vertices[0] = 0.0f;
vertices[1] = 1.0f;

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

delete[] vertices;
您能告诉我这样做的后果吗?

根据此函数创建“一个新的数据存储”和“使用此指针的数据初始化数据存储”。
这意味着数据被复制到一个新位置,删除此原始数据是安全的(调用glBufferData后对原始数据所做的任何操作都不会影响此gl缓冲区)。
您可能会注意到,它还声明“未映射新数据存储”,这意味着您尚未“直接”访问新缓冲区。如果您以后选择映射缓冲区(例如,使用glMapBuffer​, glMapBufferRange或类似产品​) 您将获得一个新指针,它允许您“直接”使用数据,您必须小心使用这些映射的缓冲区。

是的,绝对正确。在
glBufferData()
调用返回后,您可以对数据执行任何您想要的操作。覆盖它,删除它,等等

结果是OpenGL实现要么在调用过程中立即更新缓冲区(这在某种程度上与OpenGL喜欢的异步操作方式相反),要么创建数据的临时副本(出于性能原因,这是不可取的)

这是引入
glMapBufferRange()
等调用的主要原因。它们避免了在使用
glBufferData()
glBufferSubData()
时经常发生的额外数据复制。如果不小心使用,它们有自己的同步注意事项

纹理数据也有一个非常类似的情况,像
glTexImage2D()
这样的调用通常会在OpenGL实现中导致额外的数据副本。在这种情况下,性能影响可能会更糟糕,因为纹理数据通常要大得多。苹果有一个用于此目的的扩展(),您可以通过承诺在OpenGL使用数据之前保持数据不变来避免额外的副本


几乎所有以数据指针作为参数的OpenGL调用都会将数据作为调用的一部分来使用。我能想到的唯一值得注意的例外是在没有VBOs的情况下使用时
glVertexAttributePointer()
。这种用法通常称为“客户端顶点数组”,并且数据在draw调用期间被消耗,这可能在
glvertexattributepointer()
调用之后很长时间。此用法已被弃用,并且在OpenGL核心配置文件中不可用。

好的,我将在使用此函数(映射函数)时删除副本:D释放内存非常好,我将始终从映射函数中删除内存:D