Стоп положить в длину на всех:
layout (binding = 1, std430) writeonly buffer bl1
{
uint data[];
};
Это уникальная особенность SSBOs. И вы можете иметь только один несертифицированный массив в SSBO, и он должен быть последним членом в интерфейсном блоке. Размер data
будет вычисляться в зависимости от размера диапазона объектов буфера, привязанного к этой точке привязки. Поэтому, если вы связываете 32 Кбайт буферного пространства, вы получите 8 тыс. Единиц (размер uint
составляет 4 байта).
Во время выполнения ваш шейдер может использовать gl_WorkGroupSize.x * gl_NumWorkGroups.x * gl_NumWorkGroups.y
для вычисления длины data
. Кроме того, просто используйте data.length()
, чтобы получить длину буфера, который дал вам пользователь. В качестве альтернативы ... вам не нужно явно знать длину, в зависимости от того, как вы ее используете.
До тех пор, пока ваш код привязки буфера OpenGL использует буфер с достаточной памятью для вашего количества отправлений и размера рабочей группы, вы в порядке.