了解 VAO、VBO 和程序

Posted

技术标签:

【中文标题】了解 VAO、VBO 和程序【英文标题】:Understanding VAO, VBO and program 【发布时间】:2016-03-20 15:27:28 【问题描述】:

我一直在自学OpenGL,Op​​enGL中的一些概念让我很困惑。

我知道 VBO 是驻留在服务器端的未描述数据的缓冲区,VAO 是 VBO 的描述,而 Program 是用于将网格显示到屏幕上的着色器渲染管道。

让我困惑的是这三者之间的关系,正如我所见,在创建和填充 VBO 之后,VAO 是为程序属性规范生成的。这是否意味着每次绑定 VAO 时都必须提前使用某些程序?如果这不正确,请纠正我。以及一些关于这些 OpenGL 概念之间交互的简要介绍会很棒。

谢谢

【问题讨论】:

【参考方案1】:

这是否意味着每次绑定 VAO 时都必须提前使用某些程序

VAO 描述了(除其他外)format of vertex data。作为该格式的一部分,它描述了哪些数据去往哪些顶点属性。它通过分配属性“位置”来做到这一点。

您的顶点着色器有多个user-defined input variables。这些输入都被分配了一个“位置”。

渲染时,顶点格式会根据匹配的位置指定填充哪些 VS 输入。因此,您不必将 VAO 的使用限制为特定的 VS。但是,您必须使用带有兼容程序的 VAO。一种具有与格式位置匹配的输入。

如果您的 VAO 指定属性位置 0、1 和 4 将填充浮点数据,那么您与该 VAO 一起使用的任何 VS 都必须与之兼容。从技术上讲,它不必实际使用位置 0、1 或 4,但如果这样做,它必须使用浮点输入值。该格式提供的任何未使用的位置都将被有效地忽略(尽管几乎可以肯定它们仍会从缓冲区中读取)。

如果 VAO 将浮点数据放在属性 0、1 和 4 中,但 VS 期望在属性 1 中放入无符号整数数据,那么您就有问题了。

【讨论】:

以上是关于了解 VAO、VBO 和程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用不同的 VAO、VBO 绘制 2 个或更多对象?

通过 IBO 了解 VAO

OpenGL 大项目、VAO-s 等

重用 VBO 进行硬件实例化

glUseProgram 会改变 VAO 和/或 VBO 状态吗?

绘图时 VAO 和 VBO 崩溃