1

以下代码导致 glsl 错误:lvalue in assignment too complex

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

我再次收到该错误。谁能告诉发生了什么?

4

2 回答 2

3

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

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

于 2012-09-08T22:14:30.640 回答
1

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

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

于 2013-09-19T00:38:59.723 回答