2012-09-08 88 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

我也有這個錯誤,但我的原因是不同的。

事實證明,我的循環中有一個硬編碼的最大索引,它比我試圖分配的數組大。我的猜測是編譯器在嘗試展開時感到困惑,並且沒有足夠的左值索引。