在哪里存储 VAO 属性?

Where to store VAO attributes?

我正在设计一个小型 OpenGL 抽象层,用于快速制作 GPU 渲染原型。现在我正在设计用于将缓冲区对象与着色器渲染代码分开的对象模型。

目标是让 数据和着色器代码的更改变得非常容易,所以我试图减少两者之间的显式耦合数量。

VAO 现在是我前进道路上的一个棘手问题。例如,如果我的顶点数据如下所示:

vbo = [1,1,1,1]

那么这个数据实际上可以与这两个着色器顶点声明一起使用:

in float x;
in float y;

in vec2 position;

问题是 VAO 绑定需要不同。 我的结论是 VAO 信息与着色器代码的关联比与实际对象数据的关联更紧密。

此外,您实际上可以直接从着色器代码中 "infer" VAO 规范(即 VAO 是一种语义,语义在着色器代码中指定)。

所以我在想,与其将 VAO 存储在数据对象中,不如我实际上可以自动推断它并将其存储在着色器对象中。然后每次绘制时,我都会从数据对象绑定 VBO,从着色器绑定 VAO。这样我就可以让相同的 VBO 与不同的着色器一起工作。

这是疯了吗?这有什么根本上明显的缺点吗?

您所说的一般解耦在最近版本的 GL 中已经可以通过 Vertex Attrib Binding and Program Interface Query 扩展实现。

您自己实现此功能所需的工作量值得注意,但自通用顶点属性 (ARB VP1) 诞生以来,您肯定不会被任何版本的 GL 中严格的顶点数据规范所束缚。既然你已经标记了这个 GL4,你可能会发现上面提到的两个核心扩展(都在 GL 4.3 中成为核心)很有用。