以下代码会导致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);
}
我再次收到错误。谁能说出发生了什么?
答案 0 :(得分:3)
我猜你正在使用不允许编入索引的GPU /驱动程序组合。因此,为了编译代码,需要完全展开循环,将左值中的所有索引更改为常量。这显然发生在某些情况下,但不是全部。
如果您使用的是Nvidia GPU /驱动程序,您可以尝试将#pragma optionNV unroll all
放在着色器程序的顶部以强制完全展开所有循环 - 但如果您有其他循环可能会导致问题不应该展开。
答案 1 :(得分:1)
我也有这个错误,但我的原因不同。
事实证明我的for循环中有一个硬编码的最大索引,它比我试图分配的数组大。我的猜测是编译器在尝试展开时感到困惑,并且左值没有足够的索引。