2012-09-08 46 views
1

下面的代码导致错误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); 
    } 
} 

但在其他着色器程序的代码相同的一块工作正常。当代码不一样,如果声明包含,例如

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); 
} 

我再次得到这个错误。任何人都可以告诉发生了什么事?

+0

什么驱动程序版本,什么GPU? –

+0

nvlddmkm 8.17.13.142(ForceWare 301.42)/ Win7,NVIDIA GeForce GTX 560 Ti – Irbis

回答

3

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

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

+0

当我使用#pragma optionNV展开所有内容时,我不会收到该错误。 – Irbis

1

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

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