У меня есть 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, также легко дополняются.
Есть ли способ или метод, позволяющий обойти выравнивание и сократить потерянную память / пропускную способность?