Давайте объявим большой блок интерфейса в шейдере:
struct InstancingData
{
// whatever
};
#define LARGE_SIZE 1048576
layout(std140, row_major, binding = 0) uniform InstanceBlock
{
InstancingData data[LARGE_SIZE];
};
Затем я хочу связать небольшой блок UBO, содержащий менее LARGE_SIZE
записей InstancingData
с этим блоком. Это может быть либо glBingBufferBase
небольшого массива, либо glBindBufferRange
небольшого диапазона в большем массиве.
Следовательно, я буду индексировать data
только с индексами, меньшими, чем позволяет размер базового буфера, используя соответствующую униформу или gl_VertexID
. Так что формально это не должно приводить к нарушению доступа.
Будут ли эти действия вызывать ошибку или неопределенное поведение в любой версии OpenGL?
Другой путь:
Я объявил
InstancingData data[1];
Затем я связал буфер из 42 структур и проиндексировал все из них (квадратное ложе 6х7 экземпляров моделей), и он отлично работал на моей машине. Гарантируется ли работа в любом месте?