我已经学习OpenGL三天了,可以完成工作,但感觉只是在复制粘贴而不知道自己在做什么。我认为我严重缺乏关于何时将、属性等绑定到顶点数组对象(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 的行为相同,所以我希望相同的“规则”适用。
Uniform 应该像全局变量一样运作,因此它们不应受到 VAO 的影响。
现在,关于解绑:
如果我将 VBO 绑定到 VAO,然后取消绑定 VBO,VBO 是否会从 VAO 中分离?
如果一个 VBO 绑定到多个 VAO,当我取消绑定该 VBO 时会发生什么?
关于释放资源:
当我删除一个 VBO 时会发生什么?它会从所有的 VAO 中删除吗?还是它们仍然有指向该 VBO 的“悬挂引用”?
关于程序:
如果我想在不同的程序之间重复使用 VBOs,是否可以这样做?然而,如果 VAOs 绑定属性和 VBOs,属性又需要程序参数,那么我能否在不同程序之间重复使用 VAOs?为什么属性需要程序参数?
关于调试:
是否有一种方法可以美观地打印 OpenGL 状态机?我想知道已链接的程序、使用的着色器、存在哪些 VAOs、哪些 VBOs 绑定到哪些 VAOs 上、哪些属性绑定到哪些 VAOs 和 VBOs 上,它们是否已设置并启用,有哪些 Uniforms 等信息。
关于绘制调用:
假设有人给我一个 VAO,并要求我将其绘制出来。有没有一种方法可以知道我应该调用 glDrawArrays 还是 glDrawElements?我能否从 VAO 中查询这些信息?也许还包括存储在其中的 VBO 的大小?