Я недавно заменил все использование glUniform()
в своем коде, чтобы вместо этого использовать Uniform Buffer Objects (UBO), чтобы лучше организовать мой код рендеринга объектов. Тем не менее, моя производительность резко упала по мере увеличения числа нарисованных объектов (в моем случае объект - это что-либо со своим смещением в UBO; только один UBO распределяется между всеми, кто использует одну и ту же шейдерную программу).
Я думаю, это может быть потому, что мои объекты на самом деле используют очень мало однородных данных, иногда всего лишь один vec4
, в то время как UBO требует, чтобы каждое смещение было кратно GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT
, что может быть довольно большим.
Я понял, что UBO является строгим обновлением для использования glUniform()
, я ошибаюсь? Должен ли я иметь glUniform()
путь для этих простых объектов или есть необходимый шаг для эффективного использования UBO со многими различными простыми объектами, которые я не взял?
Моя сцена в основном четырехугольная, с очень немногими объекты, использующие более 4 вершин, 6 индексов. Некоторые из этих четырехугольников имеют большие однородные блоки, в то время как у большинства есть очень простые блоки, возможно один или два vec4
.
(На данный момент я справился с этой проблемой, внедрив данные этого объекта в вершины, хотя это определенно кажется неправильным делать это таким образом.)