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

时间:2016-05-05 10:51:30

标签: opengl buffer 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 个答案:

答案 0 :(得分:1)

完全停止长度:

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

这是SSBO特有的功能。并且在SSBO中只能有一个未大小的数组,并且它必须是接口块中的最后一个成员。 data的大小将根据绑定到该绑定点的缓冲区对象范围的大小来计算。因此,如果绑定32KB的缓冲区空间,您将获得8K项(uint的大小为4个字节)。

在运行时,着色器可以使用gl_WorkGroupSize.x * gl_NumWorkGroups.x * gl_NumWorkGroups.y来计算data的长度。或者,只需使用data.length()来获取用户为您提供的缓冲区长度。或者......您不需要明确知道长度,具体取决于您的使用方式。

只要您的OpenGL缓冲区绑定代码使用的缓冲区具有足够的内存用于调度计数和工作组大小,您就可以了。