OpenGL中显式多重采样与常规多重采样有何区别?

4
我正在阅读28byteslater.com上关于延迟着色中MSAA的教程(此处链接)
它说在显式多重采样中,我们可以访问特定样本。
难道我们不能从绑定到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。此外,如果我没记错的话,在着色器中不能使用渲染缓冲区,现在我们可以使用了吗?

2
你的链接现在已经失效了。 - Ruslan
1个回答

7
我觉得你有点困惑。在OpenGL 3.2 / DirectX 10之前,唯一实现多重采样抗锯齿(MSAA)的方法是将多重采样缓冲区复制并进行“解决”(即将多个采样真正地合并成单个采样以用于正常输出)。这也是多重采样能做的全部——它不能在着色器中明确使用。
GL3.2 / DX10引入了"显式"(可编程)多重采样解决方法,采用的是多重采样纹理的形式。你可以通过使用texelFetch(...)访问着色器中的各个采样值。这种新功能允许在延迟着色引擎中实现MSAA,因为现在光照着色器能够在获取G-Buffers时进行多重采样解析。这个新特性也打开了使用多重采样缓冲区进行与抗锯齿无关的事情的可能性,比如通过Stencil Routed A-Buffering技术实现无序透明度。
简而言之,DX10级别的硬件允许多重采样缓冲区作为纹理使用。这意味着为了暴露多重采样获取,现有的着色语言如HLSL和GLSL需要进行很少的改动。你会失去某些东西,比如mipmaps和过滤,但如果你愿意,你实际上可以自己实现这些。然而,DX10缺乏支持多重采样深度纹理的功能——这个功能在DX10.1中添加了。
在OpenGL 3.2之前,存在供应商特定的扩展(例如NV_explicit_multisample),允许多重采样纹理,因为硬件早在2007年就已经支持它(随着DX10的发布)。在OpenGL 3.2实现中,忽略供应商特定的内容,只需使用ARB_texture_multisample即可。

感谢您回答那个问题,Andon。所以,总结一下您的答案:NV_explicit_multisample不再是供应商特定的,现在(从OGL 3.2开始)已成为核心OGL的一部分。而我之前提到的OpenGL代码(sampler2DMS,texelFetch)是在OGL 3.2+中使用它的新方法吗? - viktorzeid
从技术上讲,“ARB_texture_multisample”是替代“NV_explicit_multisample”的非供应商特定扩展。这个ARB扩展可能在非3.2实现中可用,但所有3.2+的实现都保证提供它。更或者少一些。 - Andon M. Coleman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接