Opengl / GLSL在数组中使用SSBO

时间:2014-08-19 02:16:45

标签: opengl glsl

当我在数组中使用SSBO时,我得到了一个错误。

这是我在顶点着色器中的源代码:

#version 430 compatibility
in int aID;
in int bID;
out vec4 vColor;
struct Vertex{  
    vec4 Position;  
    vec4 Color;
};
layout(std430) buffer shader_data{
    Vertex vertex[];
}mybuffers[4];      // using a fixed size
void main()
{
    vColor = mybuffers[bID].vertex[aID].Color;  // using bID to locate the ssbo. the error is here
    vec4 worldPos = mybuffers[0].vertex[aID].Position;
    gl_Position = gl_ModelViewProjectionMatrix * worldPos;
}

然后当我链接glsl程序对象时出现错误。

错误是:

链接错误

0(17):错误C1306:无法确定接口变量的类型。需要内联功能

我不明白其含义,需要内联函数

1 个答案:

答案 0 :(得分:1)

GLSL说你必须在链接时解决你正在使用的缓冲区。因此,如果您将mybuffers[bID]替换为mybuffers[0](例如),则会干净地链接。

此问题的解决方案是使用显式if(因为您的缓冲区很小 - 仅限4个):

void main()
{
    // explicitly index the buffer so GLSL can see it at link time:
    if(bId == 0)
        vColor = mybuffers[0].vertex[aID].Color;
    else if(bId == 1)
        vColor = mybuffers[1].vertex[aID].Color;
    else if(bId == 2)
        vColor = mybuffers[2].vertex[aID].Color;
    else if(bId == 3)
        vColor = mybuffers[3].vertex[aID].Color;

    vec4 worldPos = mybuffers[0].vertex[aID].Position;
    gl_Position = gl_ModelViewProjectionMatrix * worldPos;
}