是否在DSA代码的更新循环中使用glBindVertexArray

时间:2019-01-09 19:48:26

标签: opengl opengl-4 vertex-array

我正在将一些opengl代码转换为DSA的过程,并且其编写的所有内容都不绑定顶点数组,因为它是在DSA中继承的。所以我用

GLuint VBO, VAO, indexBuffer;
glCreateVertexArrays(1, &VAO);
glCreateBuffers(1, &indexBuffer);
glCreateBuffers(1, &VBO);
...

而不是glGen ...的对应对象。

但是现在我只是想知道在更新循环中是否有绑定顶点数组的DSA版本。现在我有

    while (!glfwWindowShouldClose(window)) {
       glfwPollEvents();

       glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
       glClear(GL_COLOR_BUFFER_BIT);
       // Draw the triangle
       ourShader.Use();
       const auto Textureloc = glGetUniformLocation(ourShader.Program, "ourTexture");
       glBindTextureUnit(Textureloc, texture);

         glBindVertexArray(VAO);
         glDrawElements(GL_TRIANGLES, 9, GL_UNSIGNED_INT, 0);
         glBindVertexArray(0);
         glBindTextureUnit(0, 0);

       glfwSwapBuffers(window);
   }

可以正常工作。但是,如果我不将glBindVertexArray替换为其他内容,我会在以后的编码中遇到一些有趣的问题。就像我将glBindTexture替换为glBindTextureUnit

1 个答案:

答案 0 :(得分:0)

总结起来,按照问题所示的示例编写更新循环是完全正确的。在更新循环中使用VAO时,应将其绑定。但是,当您使用DSA时,您在修改它们时不需要绑定VAO(既不绑定VBO,也不绑定索引缓冲区)。 因此,没有其他选择glDrawElements将VAO ID作为参数,例如glVertexArrayElementBuffer可以。