【发布时间】:2014-10-24 16:54:38
【问题描述】:
我已经学习 OpenGL 三天了,我可以完成一些事情,但我感觉就像在不知道自己在做什么的情况下复制粘贴。我认真地认为我缺乏关于什么时候what(VBO,属性,...)绑定到顶点数组对象(VAO)的基本理解,并且没有找到任何资源来澄清这些方面详细。
特别是,这些是我的一些问题。如果我创建一个 VAO:
GLuint vao;
glGenVertexArrays(1, &vao);
在我绑定 VAO 之前可以绑定任何东西吗? (如果我现在创建一个 VBO,它会绑定到 VAO 吗?)
glBindVertexArray(vao);
绑定VAO后,如果我创建一个VBO:
GLuint vbo;
glGenBuffers(1, &vbo);
它是否绑定到 VAO?还是我绑定的时候会出现这种情况?
glBindVertexArray(vbo);
或者当我向它复制一些东西时?
如果我得到一个属性位置:
att = glGetAttribLocation(program_id, "name");
它是否绑定到 VAO?还是启用后会发生:
glEnableVertexAttribArray(att);
...或设置后:
glVertexAttribPointer(att, ...);
?
我猜 EBO 的行为就像 VBO,所以我希望同样的“规则”适用。
Uniforms 的行为应该像全局变量,因此它们根本不受 VAO 的影响。
现在,关于解除绑定:
如果我将 VBO“绑定”到 VAO,然后解除绑定 VBO,它会与 VAO 分离吗?
如果我有一个绑定到多个 VAO 的 VBO,当我取消绑定该 VBO 时会发生什么?
关于释放资源:
当我删除 VBO 时会发生什么?它会从所有 VAO 中删除吗?还是他们仍然对那个 VBO 有“悬空引用”?
关于程序:
IIUC 我可以在程序之间重用 VBO。但是,如果 VAO 绑定了属性和 VBO,并且属性带有程序参数,我可以在程序之间重用 VAO 吗?为什么属性完全采用程序参数?
关于调试:
有没有办法漂亮地打印 OpenGL 状态机?我想知道已链接的程序,与哪些着色器,存在哪些 VAO,哪些 VBO 绑定到哪些 VAO,哪些属性绑定到哪些 VAO 和 VBO,是否已设置?他们启用了吗?那里有哪些制服……
关于绘图调用:
假设有人给了我一个 VAO,我必须画出来。有没有办法知道我应该调用 glDrawArrays 还是 glDrawElements?我可以从 VAO 以某种方式查询这些信息吗?也许连同存储在那里的我的 VBO 的大小?
【问题讨论】:
-
应该已经有很多相关的答案了。例如,查看我在 stackoverflow.com/questions/26228498/… 和 stackoverflow.com/questions/25794454/… 上的回答。
-
谢谢,这些答案确实有很大帮助!我仍然对释放资源、调试 VAO 和操作系统感到困惑。我会继续寻找。
-
如果释放绑定到 VAO 的 VBO,则 VBO 实际上并没有“释放”,直到它不再绑定到 VAO(但你不能再绑定它了)。转储整个状态机也是相当不切实际的; OpenGL 是一个相当大的状态机。