0

8 つのサンプルでマルチサンプル テクスチャを作成したとします。

そして私のフラグメントシェーダーは

out vec4 color;
uniform sampler2DMS tex;
in vec2 txcoords;

void main()
{
    vec4 col;
    ivec2 txSize = ivec2(textureSize(tex)* txcoords);
    for(int i=0;i<8;i++)
        col += texelFetch(tex, txSize, i); 
    color = col/8;
}

これはうまくいきます。ただし、上記の for ループを次のように置き換えると、

    for(int i=10050;i<10058;i++)

これはまだ機能します。(作品によって、私はまだ正しい画像を取得していることを意味します)

なんで?OpenGL が無効な操作エラーを生成するべきではありません。

同様に、テクスチャには 8 つのサンプルがありますが、i = 9 の場合、9 番目のサンプルを取得できますか? 私には正しく聞こえません。Fragment シェーダは実行時に失敗するはずです。

4

1 に答える 1

2

通常、範囲外のバッファ アクセスは、OpenGL では未定義の動作をすることを指摘しておく必要があります。ただし、最近の OpenGL 4.x の強化により、堅牢性が向上したため、これらの場合の動作を定義できる拡張機能があります。

GL_ARB_robust_buffer_access_behavior

この拡張機能は、作成時に OpenGL コンテキストに新しいフラグを渡すことで機能し、範囲外のバッファ アクセスは適切に定義された値になります。

あなたの場合、texelFetch (...)範囲外の a が返されますvec4 (0.0, 0.0, 0.0, 0.0)

于 2013-08-24T21:32:03.320 に答える