OpenGL - создание VAO внутри цикла рендеринга - хороший вариант?

Я вставил псевдокод для своего дизайна в OpenGL.

Что у меня есть:

  • В функции createVAOs () ниже я создал все нужные мне вершины (VBO) и индексы (EBO), чтобы нарисовать красивые квадраты.
  • Затем в основном цикле в функции draw_textures () я привязываю текстуру и рисую элемент с текстурой к вершинам VBO.

Чего я хочу:

  • Теперь я хочу динамически менять VAO. Представим: я хочу добавить новую текстуру к определенному треугольнику или даже удалить несколько треугольников на моем VAO. Но поскольку VAO был создан до цикла, у меня проблема ... Я не знаю, "разумно" или "оптимизировано" создавать VAO каждый раз внутри цикла ..

Мой вопрос:

- Разумно ли размещать создание 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));
}

person waas1919    schedule 09.07.2015    source источник


Ответы (1)


Чтобы удалить (или вставить) треугольники, вы изменяете данные VBO и обновляете их одним из многих способов (например, glBufferData или glSubBufferData).

Я не вижу смысла в текстуре, поскольку она связана с созданием VAO. Если вам нужны разные текстуры для разных треугольников, у вас есть два варианта:

  • связать несколько текстур и передать какую из них шейдеру как атрибут вершины
  • разделить VBO на несколько VBO (с соответствующим VAO) и нарисовать их один за другим (конечно, вам нужно сгруппировать их по шейдерам / текстуре, поскольку вы хотите минимизировать изменения состояния).
person Jack    schedule 09.07.2015