【问题标题】:glGetUniformLocation unpredictable behaviorglGetUniformLocation 不可预知的行为
【发布时间】:2014-10-22 23:39:13
【问题描述】:

我在片段着色器中定义了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。

我不明白这里的问题。所有变量定义都是正确的,没有错别字。这种行为可以纠正吗?

【问题讨论】:

  • 你在用吗?如果这些值没有被使用,那么它们可能会被优化
  • @ratchetfreak 谢谢!早些时候,我也为此添加了一些虚拟用法。就像将 light_sources[0].Ld 分配给某个新变量一样。但是这个新变量也没有在任何地方使用(因为它只是一个虚拟赋值)。现在我为变量添加了一个正确的用法,我得到了位置。非常感谢!

标签: opengl glsl


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 2017-09-09
    相关资源
    最近更新 更多