glGetUniformLocation不可预测的行为

时间:2014-10-22 23:39:14

标签: opengl glsl

我在片段着色器中定义了struct,如下所示:

struct light_source{
    vec4 Ld, location;
    int type;
    float radii, specular_exponent;
};  

我正在使用此uniform来访问结构成员:
uniform light_source light_sources[5];

现在,从我的C ++代码中,我得到了这样的统一位置:

Ld = glGetUniformLocation(Globals::ProgramId, "light_sources[0].Ld");
Ls = glGetUniformLocation(Globals::ProgramId, "light_sources[0].Ls");
location = glGetUniformLocation(Globals::ProgramId, "light_sources[0].location");
type = glGetUniformLocation(Globals::ProgramId, "light_sources[0].type");
radii = glGetUniformLocation(Globals::ProgramId, "light_sources[0].radii");
specular_exponent = glGetUniformLocation(Globals::ProgramId, "light_sources[0].specular_exponent");

当我打印上述值时,我发现值为-1,1,2,-1,3,4。因此,我无法获取Ldtype的位置。同样,如果我现在向着色器添加一个新变量,有时我会获得该位置,有时我会得到-1。

我在这里没有遇到问题。所有变量定义都是正确的,没有拼写错误。可以纠正这种行为吗?

1 个答案:

答案 0 :(得分:3)

如果未使用统一/属性或对输出没有影响,则编译器/链接器可以完全删除它,这会导致getUniformLocation和glGetAttributeLocation返回无效值。