显式多重采样与OpenGL中的常规多重采样有何不同

时间:2013-10-19 01:00:01

标签: opengl glsl opengl-3 multisampling

我在28byteslater.com上以延迟着色在MSAA上阅读this tutorial

它表示在显式多重采样中我们可以访问特定样本。

我们不能从绑定到GL_TEXTURE_2D_MULTISAMPLE的常规纹理中做同样的事情吗?

这是我之前用于访问单个样本的着色器代码(不使用明显的多重采样):

uniform sampler2DMS Diffuse;

ivec2 Texcoord          = ivec2(textureSize(Diffuse) * In.Texcoord);
vec4  colorFirstSample  = texelFetch(Diffuse, Texcoord, 0);
vec4  colorSecondSample = texelFetch(Diffuse, Texcoord, 1);
vec4  colorThirdSample  = texelFetch(Diffuse, Texcoord, 2);

我在显式多重采样中看到的唯一不同之处是它们在着色器中使用texelFetchRenderbuffer()并且纹理绑定到GL_TEXTURE_RENDERBUFFER_NV。 另外如果我没记错,在着色器中无法使用RenderBuffer,现在我们可以吗?

1 个答案:

答案 0 :(得分:7)

我觉得你有点困惑。在OpenGL 3.2 / DirectX 10出现之前,进行多重采样抗锯齿(MSAA)的唯一方法是对多重采样缓冲区进行blit并让它进行“解析”(将多个样本逐字解析为单个样本的过程)正常输出)。这是关于所有多重采样也是有益的 - 它不能在着色器中明确使用。

GL3.2 / DX10以多重采样纹理的形式引入了“显式”(可编程)多重采样分辨率。您在着色器中访问各个样本的方式是使用texelFetch (...)。这个新功能允许MSAA在延迟着色引擎中实现,因为现在照明着色器能够在获取G-Buffers时对其进行多重采样。这一新功能还开辟了使用多重采样缓冲区来解决与抗锯齿无关的问题的可能性,通过一种名为Stencil Routed A-Buffering的技术立即想到了与顺序无关的透明度。

简而言之,DX10级硬件允许多重采样缓冲区作为纹理。这意味着必须对现有的着色语言(如HLSL和GLSL)进行很少的操作才能公开多重采样;你会牺牲某些东西,如mipmap和过滤,但如果你这么倾向,你可以自己实现。然而,DX10缺少的一件事是支持多样本深度纹理 - DX10.1增加了这个。

在OpenGL 3.2之前,有供应商特定的扩展(例如NV_explicit_multisample)允许多重采样纹理,因为自2007年以来硬件已经支持它(随着DX10的发布)。在OpenGL 3.2实现中,忽略供应商特定的东西,只需使用ARB_texture_multisample