В моем приложении я рисую много кубов через OpenGL ES Api. Все кубы имеют одинаковые размеры, только они расположены в разных координатах в пространстве. Я могу представить два способа их рисования, но я не уверен, какой из них наиболее эффективен. Я не эксперт OpenGL, поэтому я решил спросить здесь.
Метод 1, который я использую сейчас: поскольку все кубы имеют одинаковые размеры, я вычисляю буфер вершин, буфер индекса, обычный буфер и цветной буфер только один раз. Во время обновления сцены я просматриваю все кубы, делаю bufferData() для одного и того же набора буферов, а затем рисую треугольную сетку куба с помощью вызова drawElements(). Поскольку каждый куб находится в другом положении, я переводил mvMatrix, прежде чем рисовать. bufferData() и drawElements() выполняется для каждого куба. В этом методе я, вероятно, сохраняю много памяти, не вычисляя буферы каждый раз. Но я делаю много вызовов drawElements().
Метод 2 будет: обрабатывать все кубы как множество полигонов, распространяющихся по всей сцене. Вычислите вершины, индексы, цвета, нормальные буферы для каждого многоугольника (фактически треугольники внутри полигонов) и подтолкните их к памяти графической карты при одном вызове bufferData(). Затем нарисуйте их одним вызовом drawElements(). Преимущество такого подхода заключается в том, что я выполняю только один вызов bindBuffer и drawElements. Недостатком является то, что я использую много памяти для создания буферов.
Мой опыт работы с OpenGL достаточно ограничен, чтобы не знать, какой из вышеперечисленных методов лучше с точки зрения производительности.
Я использую это в приложении WebGL, но это общий вопрос OpenGL ES.