Glsl 赋值中的左值太复杂

Glsl 赋值中的左值太复杂,glsl,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

以下代码导致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);
}

我又犯了那个错误。有人知道发生了什么吗?

我猜您运行的是不允许索引分配的GPU/驱动程序组合。因此,为了编译代码,它需要完全展开循环,将左值中的所有索引更改为常量。这显然在某些情况下会发生,但并非所有情况下都会发生


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

我猜您运行的GPU/驱动程序组合不允许索引分配。因此,为了编译代码,它需要完全展开循环,将左值中的所有索引更改为常量。这显然在某些情况下会发生,但并非所有情况下都会发生


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

我也有此错误,但原因不同


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

我也有此错误,但原因不同


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

什么驱动程序版本,什么GPU?nvlddmkm 8.17.13.142ForceWare 301.42/Win7,NVIDIA GeForce GTX 560 TiWhat驱动程序版本,什么GPU?nvlddmkm 8.17.13.142ForceWare 301.42/Win7,NVIDIA GeForce GTX 560 TiI在使用pragma选项NV unroll all时未出现该错误。在使用pragma选项NV unroll all时未出现该错误。