OpenGL:缓冲到VBO后我还需要一个顶点数组吗?

fre*_*ish 2 c++ opengl vbo vertex-buffer

假设我有一个顶点数组和一个VBO指针:

std::vector<Vertex> vertices;
GLuint vbo;
glBindBuffer(GL_ARRAY_BUFFER, vbo);
Run Code Online (Sandbox Code Playgroud)

现在我缓冲数据:

glBufferData(
    GL_ARRAY_BUFFER,
    vertices.size()*sizeof(Vertex), 
    &vertices[0],
    GL_STATIC_DRAW
);
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,我仍然需要保持顶点数组GL_STATIC_DRAW.但是,如果我将其更改为GL_STATIC_COPY然后所有数据都将被复制到GPU的内存中,这样我就可以释放所使用的内存vertices.那是对的吗?如果是这样的话我们为什么需要*_DRAW?由于GPU的内存限制,这有用吗?加上GL_STATIC_READ真的有用吗?

Die*_*Epp 8

所有这些都在glBufferData()手册页中进行了解释.

https://www.opengl.org/sdk/docs/man/html/glBufferData.xhtml

您不需要在程序的内存中保留额外的副本.完整的目的glBufferData()是将数据从程序复制到OpenGL缓冲区,复制完成后,您可以使用程序存储器执行任何操作.

如果数据不是NULL,则使用来自此指针的数据初始化数据存储.

不要使用GL_STATIC_COPY,这是不正确的.文件内容如下:

COPY

通过从GL读取数据来修改数据存储内容,并将其用作GL绘图和图像规范命令的源.

因此GL_STATIC_COPY,仅适用于不同OpenGL缓冲区之间的内部副本,而不适用于从应用程序到OpenGL的副本.使用DRAW.