Как сократить использование выравнивания OpenGL UBO? - PullRequest
1 голос
/ 10 марта 2020

У меня есть UBO (Uniform Buffer Object), который распределяется между многими drawcalls.

Drawcalls использует часть одного большого UBO, используя:
glBindBufferRange(GL_UNIFORM_BUFFER, bindIndex, uboName, offset * alignment, alignment);

  • offset уникален для каждого вызова (начиная с 0)
  • alignment определяется как glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &alignment); (некоторая дополнительная математика выполняется, если выравнивание меньше, чем мне нужно)

Моя проблема в том, что выравнивание довольно велико (256b), в то время как мой шейдер использует только немного каждого фрагмента выравнивания на один вызов (максимум 64b). Это приводит к тому, что более 75% UBO теряется в качестве наполнителя. Хуже того, UBO транслируется по кадрам, поэтому более 75% данных, загружаемых в GPU, также легко дополняются.

Есть ли способ или метод, позволяющий обойти выравнивание и сократить потерянную память / пропускную способность?

...