OpenGL: эффективный расчет матриц преобразования

0

Итак, я делаю кучу кубов; например, на экране сразу появятся тысячи кубов. Проблема заключается в том, что вычисление матриц преобразования каждого кадра для каждого куба, как оказалось, не очень эффективно: 1000 кубов визуализируются со скоростью 54 кадра в секунду и 10 000 кубов при 6 кадрах в секунду. Мне нужно изменить эти матрицы преобразования, потому что игрок сможет их пересечь.

Здесь мой код рендеринга:

void Tester::render()
{
    for (int i = 0; i < numInstances; i++)
        transforms[i] = Commons::PERSPECTIVE_MATRIX * translations[i];

    glBindBuffer(GL_ARRAY_BUFFER, m_transformationMatrixBuffer);
    glBufferData(GL_ARRAY_BUFFER, numInstances * sizeof(glm::mat4), &transforms[0], GL_DYNAMIC_DRAW);

    for (int i = 0; i < 4; i++)
    {
        glVertexAttribPointer(MVP_LOC + i, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (const void*)(sizeof(float) * i * 4));
        glEnableVertexAttribArray(MVP_LOC + i);
        glVertexAttribDivisor(MVP_LOC + i, 1);
    }

    glDrawElementsInstanced(GL_TRIANGLES, m_numIndexDataElements, GL_UNSIGNED_SHORT, 0, numInstances);
}

В основном, мой вопрос: как я могу эффективно вычислить матрицы преобразования для каждого экземпляра куба?

  • 0
    Почему вы думаете, что нужно настроить матричный расчет? Вы делали профилирование? Если вы будете, вы, вероятно, будете удивлены. Другое дело: вам действительно нужно менять трансформации всех 10k-объектов в каждом отдельном кадре? Также используйте VAO.
  • 0
    Не могли бы вы объяснить, что вы имеете в виду под настройкой матрицы? Вы, вероятно, правы в том, что вам не нужно менять 10k преобразований в каждом кадре, но мне нужно изменить как минимум 1k преобразований. Я буду внедрять ВАО.
Показать ещё 2 комментария
Теги:
opengl
matrix

1 ответ

0

Существует одна операция, которая будет медленной: первая для цикла. вместо этого просто передайте Commons::PERSPECTIVE_MATRIX как единую и просто часть перевода в атрибуте.

Затем в вершинном шейдере вы будете умножать их, а затем применить к вершине.

Если вам понадобится ротация для каждого экземпляра, я бы предложил передать ему кватернион.

Сообщество Overcoder
Наверх
Меню