Opengl 着色器存储缓冲区数组

Opengl 着色器存储缓冲区数组,opengl,glsl,Opengl,Glsl,我已成功使用以下形式的着色器存储缓冲区(OpenGL 4.3 Core): 现在我正在尝试以下方法: layout(std430) buffer Data { uint data[]; } buffer_data[2]; ... uint x = buffer_data[0].data[i]; 但这拒绝联系,报道: 错误C1308:未调整大小的数组没有大小 用于访问缓冲区的行(请注意,这是在链接期间报告的,而不是在编译期间报告的)。这是我的错误、GL规范的限制还是驱动程序错误?如果这是

我已成功使用以下形式的着色器存储缓冲区(OpenGL 4.3 Core):

现在我正在尝试以下方法:

layout(std430) buffer Data
{
  uint data[];
} buffer_data[2];

...

uint x = buffer_data[0].data[i];
但这拒绝联系,报道:

错误C1308:未调整大小的数组没有大小


用于访问缓冲区的行(请注意,这是在链接期间报告的,而不是在编译期间报告的)。这是我的错误、GL规范的限制还是驱动程序错误?如果这是一个限制,是否有合适的解决方法?

@AndonM.Coleman我的印象是,SSB的行为就像分配的缓冲区的指针,拥有一个像我的示例那样的数组将只是一个由两个指针组成的数组,并且可以作为拥有两个命名缓冲区(工作正常)的替代方案。是的,这是正确的。我误读了
缓冲区
声明。在SSB的末端有一个动态长度数组,这不需要了解
数据大小的链接时间。出于好奇,如果您在第二次尝试中替换了用于索引
data[]
的非常量表达式,它会改变什么吗?(例如,
uint x=buffer[0]。data[0];
)我的直觉告诉我这是一个驱动程序错误。一般要求使用常量积分表达式对未调整大小的数组进行索引,但在引入SSB时(仅针对存储块中的最后一个元素),这一要求被放宽了。。。链接器可能会混淆。使用名称
buffer
作为缓冲区也确实没有帮助。我会认真考虑一个更好的名字,它不会与保留关键字冲突。如果你从中练习,任何奇怪的事情都可能发生。编译器实际上应该为执行此操作生成一种完全不同的错误。@AndonM.Coleman这是真的。这确实会产生一个错误。我简化的例子太简单了。我要换个名字。(我的实际代码不使用此名称)。
layout(std430) buffer Data
{
  uint data[];
} buffer_data[2];

...

uint x = buffer_data[0].data[i];