4

我正在阅读这篇关于 MSAA 延迟着色的教程,来自 28byteslater.com。

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

例如,我们不能对绑定到的常规纹理做同样的事情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,现在我们可以了吗?

4

1 回答 1

7

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

GL3.2 / DX10 以多重采样纹理的形式引入了“显式”(可编程)多重采样解析。在着色器中访问单个样本的方式是使用texelFetch (...). 这个新功能允许在延迟着色引擎中实现 MSAA,因为现在光照着色器能够在提取 G 缓冲区时对它们进行多重采样解析。这项新功能还开辟了使用多重采样缓冲区处理与抗锯齿无关的事物的可能性,通过一种称为 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.

于 2013-10-19T05:16:40.587 回答