【发布时间】:2016-04-06 18:04:44
【问题描述】:
我正在设计一个小型 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。
这很疯狂吗?这有什么根本上明显的缺点吗?
【问题讨论】:
-
"此外,您实际上可以直接从着色器代码“推断”VAO 规范" 不,您不能。可以推断出整体类型(浮点型、整数型、双精度型),但细节与数据绑定。无符号字节或短裤可以通过规范化或仅转换为浮点数。整数可以从字节、short 或 int 中输入。等等。
-
当然,很抱歉没有让自己说清楚。在快速原型设计的背景下,我可以做出额外的假设,这些假设对于更一般的情况是不正确的。在这种情况下,我愿意假设所有 VBO 数据都是浮点数。无论如何,我发现我想要的实际上可能需要为每个 VBO 缓存一个 VAO,因为需要为每个缓冲区设置一次绑定点。无赖...