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

OpenGL compute shader buffer allocation fails

我正在尝试像这样在计算着色器中使用缓冲区:

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

我该如何解决这个问题?

完全停止输入长度:

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

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

在运行时,您的着色器可以使用 gl_WorkGroupSize.x * gl_NumWorkGroups.x * gl_NumWorkGroups.y 来计算 data 的长度。或者,只需使用 data.length() 来获取用户给你的缓冲区的长度。或者......你不需要明确知道长度,这取决于你如何使用它。

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