Binding GLSL:绑定着色器存储缓冲区对象

Binding GLSL:绑定着色器存储缓冲区对象,binding,glsl,Binding,Glsl,我正在绑定一个着色器存储缓冲区对象(SSBO)并在片段着色器中使用。绑定很好,缓冲块是规范要求的vec4(4B)块的倍数。但是,以下代码具有意外行为。变量“datapoint”具有正确的“a”值,但“b、c、d”值是垃圾 我使用的是Nvidia Quadro K5000,驱动程序版本为340.52 struct data { int a; float b; float c; float d; }; // the same location '0' is used

我正在绑定一个着色器存储缓冲区对象(SSBO)并在片段着色器中使用。绑定很好,缓冲块是规范要求的vec4(4B)块的倍数。但是,以下代码具有意外行为。变量“datapoint”具有正确的“a”值,但“b、c、d”值是垃圾

我使用的是Nvidia Quadro K5000,驱动程序版本为340.52

struct data
{
    int a;
    float b;
    float c;
    float d;
};

// the same location '0' is used on the host
layout(std430, binding = 0) buffer MyBuffer 
{
    data mydata[];
}

data datapoint;

void main()
{
    ...

    datapoint = mydata[some_index]; // some_index is withing range

    ...
}

您可以尝试向缓冲区添加一个限定符,例如只读或一致,并查看是否有帮助。据我所知,您必须为MyBuffer命名,并通过name.mydata[]访问它。问题似乎在于=运算符。可以通过“mydata[some_index].c”访问数据。但是,将其复制到结构的另一个实例只会复制结构的第一个元素。问题可能是NVidia的GLSL编译器造成的。