OpenGL计算着色器缓冲区分配失败

OpenGL计算着色器缓冲区分配失败,opengl,buffer,compute-shader,Opengl,Buffer,Compute Shader,我尝试在计算着色器中使用缓冲区,如下所示: layout (binding = 1, std430) writeonly buffer bl1 { uint data[gl_WorkGroupSize.x * gl_NumWorkGroups.x * gl_NumWorkGroups.y]; }; 但我得到以下错误(因为使用gl_NumWorkGroups作为大小): 我怎样才能解决这个问题?不要再加长度了: layout (binding = 1, std430) writeonly

我尝试在计算着色器中使用缓冲区,如下所示:

layout (binding = 1, std430) writeonly buffer bl1
{
    uint data[gl_WorkGroupSize.x * gl_NumWorkGroups.x * gl_NumWorkGroups.y];
};
但我得到以下错误(因为使用gl_NumWorkGroups作为大小):


我怎样才能解决这个问题?

不要再加长度了:

layout (binding = 1, std430) writeonly buffer bl1
{
    uint data[];
};
这是SSBO独有的功能。一个SSBO中只能有一个未调整大小的数组,它必须是接口块中的最后一个成员。
数据的大小将根据绑定到该绑定点的缓冲区对象范围的大小来计算。因此,如果您绑定32KB的缓冲区空间,您将获得8K的项(一个
uint
的大小是4个字节)

在运行时,着色器可以使用
gl\u WorkGroupSize.x*gl\u NumWorkGroups.x*gl\u NumWorkGroups.y
计算
数据的长度。或者,只需使用
data.length()
获取用户提供给您的缓冲区长度。或者。。。您不需要明确知道长度,这取决于您如何使用它

只要OpenGL缓冲区绑定代码使用一个具有足够内存的缓冲区来满足分派计数和工作组大小,就可以了

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