姬長信(Redy)

c – 何时与VAO绑定什么?


我已经学习OpenGL三天了,我可以完成任务,但我觉得在不知道自己在做什么的情况下复制粘贴.我认真地认为我缺乏对何时(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一样,所以我希望同样的“规则”适用.

制服应该像全局一样,所以它们不应该受到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的大小存储在那里?