OpenGL 顶点数组/缓冲区对象

标签 opengl vbo vao

问题一

在某个 VAO 下创建的顶点缓冲区对象是否会在该 VAO 被删除后被删除?

一个例子:

glGenBuffers(1, &bufferObject);
glGenVertexArrays(1, &VAO);

glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, bufferObject);
glBufferData(GL_ARRAY_BUFFER, sizeof(someVertices), someVertices, 
             GL_STATIC_DRAW);
glEnableVertexAttribArray(positionAttrib);
glVertexAttribPointer(positionAttrib, 3, GL_FLOAT, GL_FALSE, 0, NULL);

稍后调用 glDeleteVertexArrays(1, &VAO); , 将bufferObject也被删除?

我问的原因是我在网上看到了一些没有删除那些缓冲区对象的例子。

问题2

我可以为缓冲区对象分配的最大内存量是多少?当然,它必须取决于系统,但我似乎无法找到它的估计值。当显存不够大时会发生什么?我怎么会知道?

最佳答案

1:缓冲区对象不是“在”VAO 下“创建的”。缓冲区对象状态不是 VAO 状态的一部分。 VAO 可以引用缓冲区对象,但这种关联只能通过调用 glVertexAttribPointer 进行。 (或其他 *Pointer 调用)。只需将缓冲区绑定(bind)到 GL_ARRAY_BUFFER不把它放在VAO中。您可以在不绑定(bind) VAO 的情况下将缓冲区绑定(bind)到该目标。这是法律代码:

glGenBuffers(1, &bufferObject);
glBindBuffer(GL_ARRAY_BUFFER, bufferObject);
glBufferData(GL_ARRAY_BUFFER, sizeof(someVertices), someVertices, 
             GL_STATIC_DRAW);  //Creates the buffer storage.

glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glEnableVertexAttribArray(positionAttrib);
glVertexAttribPointer(positionAttrib, 3, GL_FLOAT, GL_FALSE, 0, NULL); //Uses whatever is bound to GL_ARRAY_BUFFER

请注意,GL_ELEMENT_ARRAY_BUFFER 并非如此。 .该绑定(bind)直接是 VAO 状态的一部分。因此,在绑定(bind)到该目标之前,您需要绑定(bind) VAO。

但是,绑定(bind)到目标不是创建。您可以将缓冲区绑定(bind)到 GL_TRANSFORM_FEEDBACK_BUFFER , 使用 glBufferData 创建它的存储,然后绑定(bind)它以供 GL_ARRAY_BUFFER 使用.或作为 GL_ELEMENT_ARRAY_BUFFER .

至于你问题的主旨,没有。 VAO 的销毁不会破坏它引用的缓冲区对象。

2:没有标准的OpenGL函数来检测可用资源的数量。如果您尝试创建存储并且实现资源不足,您将获得 GL_OUT_OF_MEMORY​错误。

关于OpenGL 顶点数组/缓冲区对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13342403/

相关文章:

c++ - 由于某种原因,OpenGL VAO 指向地址 0

opengl - OpenGL 顶点缓冲区绑定(bind)点可以在不同的 VAO 之间重用吗?

c++ - 带有用于 c/cpp 的 Material 文件的 Wavefront obj 加载器

c++ - 事件驱动编程 : callback vs message polling

java - 为什么使用十六进制常量?

iOS OpenGL ES 2.0 VBO 混淆

opengl - 使用 glDrawArrays 绘制交错的 VBO

c++ - VBO 和 glTranslatef 是否需要将 GLSL 着色器中的 gl_vertex 与某些东西相乘?

java - 为什么没有绑定(bind) VAO 时 glValidateProgram 会失败?

c++ - 帧缓冲区对象替代品?