2016-05-05 3 views
2

Я пытаюсь использовать буфер в вычислительном шейдере, как это:OpenGL распределения Compute Shader буфер не удается

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 

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

ответ

1

Стоп положить в длину на всех:

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 использует буфер с достаточной памятью для вашего количества отправлений и размера рабочей группы, вы в порядке.

Смежные вопросы