我正在设计一个小型OpenGL抽象层,用于快速原型化GPU渲染。现在我正在设计用于从着色器渲染代码中分离缓冲区对象的对象模型。
目标是让 数据和着色器代码变得非常容易,所以我试图减少两者之间显式耦合的次数。
现在我的道路上有点刺激的是VAO。例如,如果我的顶点数据如下所示:
vbo = [1,1,1,1]
然后,这些数据实际上可以使用这两个着色器顶点声明:
in float x;
in float y;
或
in vec2 position;
问题在于VAO绑定需要不同。 我的结论是,与实际对象数据相比,VAO信息与着色器代码关联得更紧密。
此外,您实际上可以推断"直接来自着色器代码的VAO规范(即VAO是一种语义,并且在着色器代码中指定了语义)。
所以我在想,不是将VAO存储在数据对象中,我实际上可以自动推断它并将其存储在着色器对象中。然后每次我绘制我从数据对象绑定VBO和从着色器绑定VAO。这样我可以使用不同的着色器进行相同的VBO工作。
这是疯了吗?这有什么根本明显的缺点吗?答案 0 :(得分:4)
通过Vertex Attrib Binding和Program Interface Query扩展程序,最近版本的GL已经可以解决您所说的一般脱钩。
自己实现此功能所需的工作量值得注意,但自从通用顶点属性(ARB VP1)开始以来,您在任何版本的GL中都无法锁定刚性顶点数据规范。由于您已经标记了此GL4,您可能会发现上面提到的两个核心扩展(两者都是GL 4.3中的核心)很有用。