当我在数组中使用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:无法确定接口变量的类型。需要内联功能
我不明白其含义,需要内联函数
答案 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;
}