Итак, я делаю кучу кубов; например, на экране сразу появятся тысячи кубов. Проблема заключается в том, что вычисление матриц преобразования каждого кадра для каждого куба, как оказалось, не очень эффективно: 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);
}
В основном, мой вопрос: как я могу эффективно вычислить матрицы преобразования для каждого экземпляра куба?
Существует одна операция, которая будет медленной: первая для цикла. вместо этого просто передайте Commons::PERSPECTIVE_MATRIX
как единую и просто часть перевода в атрибуте.
Затем в вершинном шейдере вы будете умножать их, а затем применить к вершине.
Если вам понадобится ротация для каждого экземпляра, я бы предложил передать ему кватернион.