2013-08-24 47 views
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(int i=10050;i<10058;i++) 

这仍然有效。 (通过作品,我的意思是我仍然得到正确的形象)

为什么?不应该OpenGL产生了一个无效的操作错误。

同样,即使纹理有8个样本,我仍然可以获取第9个样本,如果我= 9?对我来说听起来不合适。片段着色器应该在运行时失败。

+1

确切位置在哪里,你会喜欢的OpenGL产生一个无效操作?着色器不像其他API函数那样进行评估; GLSL编译器的静态分析能够检测出你使用的是超出范围的样本,而这可能永远不会发生。它可能在运行时“失败”,它只是在这种情况下的行为是未定义的,所以在此之后发生的任何事情在技术上是正确的:P –

+0

至少如果不是无效的操作错误,我期望颜色输出是垃圾或全部在这种情况下i> = 8时,零(0,0,0,0)。或至少当我> = GL_MAX_SAMPLES。 – viktorzeid

+0

是的,你不应该期望这些东西。当需要移植软件的时候,你会被烧得更多 - 未定义的行为通常只有在不同的实现行为不同时才会知道。 –

回答

2

我应该指出,通常情况下超出范围的缓冲区访问在OpenGL中有未定义的行为。然而,随着OpenGL 4.x为提高健壮性而推出,有一个扩展可以让你在这些情况下定义行为。

GL_ARB_robust_buffer_access_behavior

这种扩展的工作原理是通过一个新的标志,当你创建它,然后缓冲区,超出范围的访问将导致在明确规定的值的OpenGL上下文。

在你的情况下,texelFetch (...)是超出范围将返回vec4 (0.0, 0.0, 0.0, 0.0)