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

しかし、他のシェーダープログラムでは、同じコードが正常に機能します。たとえば、コードに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 に答える