Сбой выделения буфера вычислительного шейдера OpenGL

Я пытаюсь использовать буфер в вычислительном шейдере следующим образом:

layout (binding = 1, std430) writeonly buffer bl1
{
    uint data[gl_WorkGroupSize.x * gl_NumWorkGroups.x * gl_NumWorkGroups.y];
};

но я получаю следующую ошибку (из-за использования gl_NumWorkGroups для размера):

Array size must be a constant integer expression

Как я могу обойти это?


person markwalberg    schedule 05.05.2016    source источник


Ответы (1)


Перестаньте вводить длину вообще:

layout (binding = 1, std430) writeonly buffer bl1
{
    uint data[];
};

Это особенность, уникальная для SSBO. И у вас может быть только один неразмерный массив в SSBO, и он должен быть последним элементом в интерфейсном блоке. Размер data будет вычисляться на основе размера диапазона объектов буфера, который вы привязываете к этой точке привязки. Таким образом, если вы привяжете 32 КБ буферного пространства, вы получите 8 КБ элементов (размер uint составляет 4 байта).

Во время выполнения ваш шейдер может использовать gl_WorkGroupSize.x * gl_NumWorkGroups.x * gl_NumWorkGroups.y для вычисления длины data. В качестве альтернативы просто используйте data.length(), чтобы получить длину буфера, который дал вам пользователь. В качестве альтернативы... вам не нужно явно знать длину, в зависимости от того, как вы ее используете.

Пока ваш код привязки буфера OpenGL использует буфер с достаточным объемом памяти для вашего счетчика отправки и размера рабочей группы, все в порядке.

person Nicol Bolas    schedule 05.05.2016