OpenGL - 在渲染循环中创建 VAO 是个不错的选择吗?

OpenGL - Creation of VAO inside the rendering loop is good option?

我已经为我在 OpenGL 中设计的内容粘贴了一个伪代码。

我有:

我想要的:

我的问题:

- 将 VAO(VBO 和 EBO)的创建放在渲染循环中是否明智?如果不是,最好的解决方案是什么?

考虑下面我的伪代码:

int main (void)
{
    //Init OpenGL, Glew,etc

    //Load Shaders

    createVAOs(); //triangles vertices (VBO) and indices (EBO)

    while (!glfwWindowShouldClose(m_window)) //the LOOP!
    {
        //updateEvents ();

        //use shaders

        //bindVAO();

            /*createVAOs();*/ //<---- is this wise??
            draw_textures();

        //freeVAO

        //swapBuffers
    }

    return 0;
}

void draw_textures()
{
    glBindTexture(GL_TEXTURE_2D, texture.id());
    glDrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_INT, (void*)(0));
}

要删除(或插入)三角形,您需要更改 VBO 数据并通过多种方法之一更新它(例如 glBufferDataglSubBufferData)。

我没有看到带有纹理的点,因为它绑定在 VAO 创建之外。如果您需要为不同的三角形使用不同的纹理,那么您有两个选择:

  • 绑定多个纹理并将其中一个作为顶点的属性传递给着色器
  • 将 VBO 拆分为多个 VBO(具有各自的 VAO)并一个一个地绘制它们(当然你需要按 shaders/texture 对它们进行分组,因为你想最小化状态变化)。