Glsl 赋值中的左值太复杂
以下代码导致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
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时未出现该错误。