首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解VAO和VBO

理解VAO和VBO
EN

Computer Graphics用户
提问于 2020-10-22 16:44:37
回答 3查看 9.9K关注 0票数 5

我正在阅读学习OpenGL,以刷新基本概念,因为我已经很长一段时间没有触及这些概念了。

具体来说,我仍然认为我不能完全理解VAO和VBO的含义,这本书主要是通过例子来进行的,它并没有给出严格的定义。

关于VBO:

定义了顶点数据后,我们希望将其作为输入发送到图形管道的第一个进程:顶点着色器。这是通过在GPU上创建内存来实现的,在GPU上存储顶点数据,配置OpenGL应该如何解释内存,并指定如何将数据发送到显卡。然后,顶点着色器处理的顶点和我们从它的记忆中告诉它的一样多。我们通过所谓的顶点缓冲对象(VBO)来管理这个内存,它可以在GPU的内存中存储大量的顶点。使用这些缓冲区对象的优点是,我们可以同时将大量数据发送到显卡,并在内存不足的情况下将其保存在那里,而不必一次发送一个顶点的数据。从CPU向显卡发送数据的速度相对较慢,所以只要我们能够同时发送尽可能多的数据。一旦数据进入显卡的内存中,顶点着色器几乎可以立即访问顶点,使其速度非常快。

所以我对VBO的理解,它们本质上是缓冲区对象(将被发送到GPU的字节),但是VBO专门用于顶点数据的区别。这是正确的吗?

关于VAO:

相反,我不太明白。

顶点数组对象(也称为VAO)可以被绑定,就像顶点缓冲区对象一样,此后的任何顶点属性调用都将存储在VAO中。

这意味着从那一点开始的任何后续顶点属性调用都将存储在VAO中,我不理解“调用被存储”位,它是否意味着在opengl上下文中,我们存储一些与顶点属性调用相关的数据(比如调用的一对输入输出)?电话的输出?(与电话有关的事?)

这样做的优点是,在配置顶点属性指针时,只需进行一次调用,只要我们想要绘制对象,就可以绑定相应的VAO。这使得在不同顶点数据和属性配置之间的切换就像绑定不同的VAO一样容易。我们刚刚设置的状态都存储在VAO里面。

我不明白这里的优势。我理解“一次调用”,因为它们存储在VAO中(不管“存储部分”的意思是什么)。切换部分是否意味着我可以创建多个VAO,每个VAO捕获不同的顶点属性调用,而我可以在需要时绑定每个顶点属性,而无需再次调用顶点属性?

作为参考,我还找到了这个问题,我认为它有一个有趣的答案。

EN

回答 3

Computer Graphics用户

发布于 2020-10-22 18:05:02

所以我对VBO的理解,它们本质上是缓冲区对象(将被发送到GPU的字节),但是VBO专门用于顶点数据的区别。这是正确的吗?

一个"VBO“并不是一件真正的事情,我真的希望教程停止假装他们是。

您是正确的,因为存在缓冲对象。这些是由GPU存储并可以访问各种进程的未格式化数据的线性数组。GPU可以使用它们的“各种进程”之一是为顶点呈现操作提供数组数据。

但是缓冲区本身并不特殊。它并不仅仅因为您将其用于顶点数据而成为另一回事,也没有规则规定您当前用于顶点数据的缓冲区也不能用于其他缓冲区使用。

请注意,这与纹理的工作方式不同。当您创建一个纹理对象并将其绑定为一个2D纹理时,该纹理对象将永远成为一个2D纹理。你以后不能把它绑定成1D或cubemap之类的东西。缓冲区对象不是这样的;绑定它们的地方只定义了当前使用它们的方式。

这是什么意思?“从此点开始的任何后续顶点属性调用都将存储在VAO中”。

这是另一个令人讨厌的教程技巧:对象“存储调用”或者是宏或其他诸如此类的废话。

OpenGL中的对象不存储调用;它们存储状态。它们就像结构;它们有数据成员。将对象绑定到OpenGL上下文允许访问特定状态的OpenGL操作在绑定对象中找到该状态。因此,如果您调用一个函数修改来自绑定对象的特定状态,则该函数将修改对象内的状态。

当您绑定一个VAO时,您将绑定一个存储用于顶点数组的状态的对象。当您调用修改顶点数组状态的函数时,该函数将修改存储在当前绑定的VAO中的状态。在呈现时,呈现系统将使用当前绑定的VAO中的顶点数组状态。

票数 11
EN

Computer Graphics用户

发布于 2021-03-14 23:09:50

简而言之,VBO是一个原始数据数组,而VAO是一个属性数组--用于着色程序如何使用数据的指令。

例如,以前在OpenGL ES 2.0中,VAO还没有引入,而VBO是可选的。您仍然可以传递给您的着色器您的数据RAM地址。尽管这些数据必须在每个调用上传递CPU到GPU的“桥”,但是这个过程并没有暴露给您。VBO允许将数据保存在GPU端,这样可以节省传输时间,您只需知道VBO的id即可。

但仅靠VBO本身是不够的。你必须告诉GPU如何使用它。您必须为着色器的每个属性(输入数据变量)定义“顶点属性指针”(命令glVertexAttribPointer)。在VAO之前,您必须为每个glDrawArrays调用定义属性(这很大),在每个帧中(比如每秒30+次数)。VAO允许仅通过VAO的id附加整个属性数组。因此,当VBO相对独立时,VAO是VBO+着色器特有的.

票数 5
EN

Computer Graphics用户

发布于 2020-10-23 12:53:13

VBO是gpu可以访问的内存缓冲区。仅此而已。

VAO是存储顶点绑定的对象。这意味着当您调用glVertexAttribPointer和朋友来描述您的顶点格式时,这种格式的信息会存储在当前绑定的VAO中。当您绘制时,它将使用当前绑定的VAO中的顶点绑定。

假装它重播绑定调用是误导的。这是一个遗物,为什么VAO被创建,因为在VAOs之前,您确实需要在每次更改所绘制的网格时重新执行顶点绑定。一个VAO可以让你在一个电话中做到这一点。

票数 4
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/10332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档