2

次の単純なフラグメント シェーダーは、非常に奇妙な動作を示します。ループがない場合、予想どおり、出力はすべて赤になります。しかし、ループでは黄色、つまり rgb(1,1,0) になります。ここで何が起こっているかについて、誰かが私に教えてくれるでしょうか?

void main(void)
{
    mat4 redUnit = mat4(
        1.0, 1.0, 1.0, 1.0,
        1.0, 1.0, 1.0, 1.0,
        1.0, 1.0, 1.0, 1.0,
        1.0, 1.0, 1.0, 1.0
    );
    mat4 greenUnit = mat4(
        0.0, 0.0, 0.0, 0.0,
        0.0, 0.0, 0.0, 0.0,
        0.0, 0.0, 0.0, 0.0,
        0.0, 0.0, 0.0, 0.0
    );
    mat4 blueUnit = mat4(
        0.0, 0.0, 0.0, 0.0,
        0.0, 0.0, 0.0, 0.0,
        0.0, 0.0, 0.0, 0.0,
        0.0, 0.0, 0.0, 0.0
    );

    for (int x = -1; x < 3; x++) {
        for (int y = -1; y < 3; y++) {
            redUnit[x+1][y+1] = 1.0;
            greenUnit[x+1][y+1] = 0.0;
            blueUnit[x+1][y+1] = 0.0;
        }
    }

    gl_FragColor = vec4(redUnit[0][0], greenUnit[0][0], blueUnit[0][0], 1.0);
}

編集: 出力色は、変数が宣言されている順序によって異なります。そのため、どういうわけかメモリ境界が侵害されています。ただし、まだ動作を説明していません。

4

1 に答える 1

2

他の誰かがこれに遭遇した場合:これはIntelGMAグラフィックスドライバーのバグです。別のグラフィックカードを搭載した別のマシンでは、すべてが正常に機能します。

于 2012-12-07T23:05:18.450 に答える