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 个样本?对我来说听起来不对。片段着色器应该在运行时失败。

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 回答