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

Using glBindVertexArray in update loop in DSA code or not

我正在将一些 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

总而言之,按照问题中显示的示例编写更新循环是完全正确的。 VAO 在更新循环中使用时应该绑定。但是当你使用 DSA 时,你不需要在修改它们时绑定 VAO(也不是 VBO 或索引缓冲区)。 因此,没有其他选择 glDrawElements 将 VAO id 作为参数,例如glVertexArrayElementBuffer 确实如此。