赋值中的左值太复杂了

时间:2012-09-08 14:41:50

标签: glsl

以下代码会导致glsl错误:赋值中的左值太复杂

for(int i = 0; i < 4; i++)
{
    if(Lgt.lights[i].position.w == 0.0)
    {
        LightDir[i] = normalize(vec3(Lgt.lights[i].position));
        ViewDir[i] = normalize(cameraWorldPosition - worldPosition);
    }
    else
    {
        LightDir[i] = normalize(vec3(Lgt.lights[i].position) - worldPosition);
        ViewDir[i] = normalize(cameraWorldPosition - worldPosition);
    }
}

但是在其他着色器程序中,相同的代码片段工作正常。当代码不包含if语句时,例如

for(int i = 0; i < 4; i++)
{
    LightDir[i] = normalize(vec3(Lgt.lights[i].position) - worldPosition);
    ViewDir[i] = normalize(cameraWorldPosition - worldPosition);
}

一切正常,但是当我使用乘法时:

for(int i = 0; i < 4; i++)
{
     LightDir[i] = LocalMat * normalize(vec3(Lgt.lights[i].position) - worldPosition);
     ViewDir[i] = LocalMat * normalize(cameraWorldPosition - worldPosition);
}

我再次收到错误。谁能说出发生了什么?

2 个答案:

答案 0 :(得分:3)

我猜你正在使用不允许编入索引的GPU /驱动程序组合。因此,为了编译代码,需要完全展开循环,将左值中的所有索引更改为常量。这显然发生在某些情况下,但不是全部。

如果您使用的是Nvidia GPU /驱动程序,您可以尝试将#pragma optionNV unroll all放在着色器程序的顶部以强制完全展开所有循环 - 但如果您有其他循环可能会导致问题不应该展开。

答案 1 :(得分:1)

我也有这个错误,但我的原因不同。

事实证明我的for循环中有一个硬编码的最大索引,它比我试图分配的数组大。我的猜测是编译器在尝试展开时感到困惑,并且左值没有足够的索引。