我正在设计一个用于快速原型GPU渲染的小型OpenGL抽象层。现在我正在设计用于将缓冲区对象与着色器渲染代码分离的对象模型。
目标是使更改数据和着色器代码变得非常容易,因此我正在努力减少这两者之间的显式耦合数量。
现在有一件事让我有点头疼,那就是VAO。例如,如果我的顶点数据看起来像这样:
vbo=[1,1,1]
然后,这些数据实际上可以与以下两个着色器顶点声明一起使用:
in float x;
in float y;
或
in vec2 position;
问题是VAO绑定需要有所不同。我的结论是,VAO信息与着色器代码的关联比与实际对象数据的关联更紧密。
此外,您实际上可以直接从着色器代码"推断"VAO规范(即VAO是一种语义,语义在着色器代码中指定)。
所以我想,与其将VAO存储在数据对象中,我实际上可以自动推断它并将其存储在着色器对象中。然后每次绘制时,我都会绑定来自数据对象的VBO和来自着色器的VAO。通过这种方式,我可以让相同的VBO与不同的着色器一起工作。
这疯了吗?这有什么根本上明显的缺点吗?
您所说的一般解耦在最新版本的GL中已经可以通过顶点-属性绑定和程序接口查询扩展实现。
您自己实现此功能所需的工作量是值得注意的,但自通用顶点属性(ARB VP1)问世以来,您肯定不会被任何版本的GL中的刚性顶点数据规范所束缚。既然您已经标记了这个GL4,您可能会发现上面提到的两个核心扩展(这两个扩展都在GL 4.3中成为核心)很有用。