2013-10-19 61 views
4

我正在阅读来自28byteslater.com的MSAA中延迟着色的this tutorial显式多重采样与OpenGL中的常规多重采样有何不同

它说,在明确的多重采样中,我们可以访问特定的样本。

难道我们不能从一个普通的纹理来做同样的事吗?例如,它会绑定到GL_TEXTURE_2D_MULTISAMPLE

这是我用来较早用于访问个别样品的shader代码(不使用显式的多采样):

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,现在我们可以吗?

+2

您的链接已被打破。 – Ruslan

回答

7

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

GL3.2/DX10引入了“显式”(可编程)多采样解析,采用多采样纹理的形式。在着色器中访问单个样本的方式是使用texelFetch (...)。这个新功能允许MSAA在延迟着色引擎中实现,因为现在照明着色器能够在获取G-Buffers时多重采样解析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

+0

感谢您回答Andon。因此总结一下你的答案:NV_explicit_multisample不再是供应商特定的,现在(OGL 3.2以上版本)它已经成为核心OGL的一部分。我之前提到的OpenGL代码(sampler2DMS,texelFetch)是在OGL 3.2+中使用它的新方法吗? – viktorzeid

+0

或多或少。从技术上讲,'ARB_texture_multisample'是替代'NV_explicit_multisample'的非供应商特定的扩展。这种ARB扩展可能在非3.2实现中可用,但所有3.2+实现都可以保证提供它。 –