Opengl 顶点数组对象

Posted

技术标签:

【中文标题】Opengl 顶点数组对象【英文标题】:Opengl Vertex Array Objects 【发布时间】:2012-10-13 00:58:38 【问题描述】:

OpenGL 的顶点数组对象是否存储在 VRam 中?

我真正要问的是:如果我加载一个模型,例如使用 Assimp,然后将顶点和索引数据读入顶点数组对象;我会在 Ram 中复制数据,还是将其复制到 GPU?

【问题讨论】:

【参考方案1】:

这里似乎缺乏对 OpenGL 术语的理解。

您无法将“顶点和索引数据”读入Vertex Array Objects。他们实际上并不存储数据;数据数组存储在buffer objects 中。 VAO 仅引用它们。 VAO 描述了这些缓冲区中的数据是如何格式化的,以便 OpenGL 能够理解它们的含义。

如果您询问client-side vertex arrays(请注意缺少“对象”一词,尽管您可以将客户端顶点数组与 VAO 一起使用),那么根据定义,它们不会存储在 GPU 上。客户端顶点数组的“客户端”是用户的代码。 IE:您分配、拥有和管理的内存。

如果您询问buffer objects 的使用,是的,缓冲区对象存储驻留在“服务器”上(即:OpenGL 实现所拥有的内存)。您无法确定它是否在任何特定时间点实际上在 GPU 上。但是在你调用glBufferDataglBufferSubData或其他更新缓冲区对象的函数后,服务器已经复制了这些数据。

【讨论】:

是的,对术语缺乏了解。我刚刚开始研究openGL。我很高兴你明白我在问什么。我想知道是否通过分配缓冲区对象并用我在 Assimp Scene 结构中已有的数据填充它们,我会复制数据并浪费我的时间。 @Kronos25:您将复制数据,但不会“浪费时间”。运行时性能是您所追求的,因此将数据放到 GPU 上对于实现这一目标很重要。此外,您应该在完成上传后删除您的场景结构。

以上是关于Opengl 顶点数组对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 和顶点数组对象渲染两个对象

我的OpenGL学习进阶之旅介绍 顶点数组对象VAO并实战一下

OpenGL 顶点数组/缓冲区对象

OpenGL顶点数组对象不记录VBO和IBO绑定

无法捕捉 OpenGL 和顶点数组对象的错误

OpenGL - glDrawElements vs 顶点数组对象