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

标签 opengl glsl opengl-3 multisampling

我正在阅读 this tutorial关于 MSAA 的延迟着色,来自 28byteslater.com。

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

我们不能对绑定(bind)到 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()在着色器和纹理中绑定(bind)到 GL_TEXTURE_RENDERBUFFER_NV .
另外,如果我没记错的话,它不可能在着色器中使用 RenderBuffer,现在我们可以了吗?

最佳答案

我觉得你有点困惑。在 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 .

关于opengl - 显式多重采样与 OpenGL 中的常规多重采样有何不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19461133/

相关文章:

c# - 如何在 OpenTK .NET Core 中设置 OpenGL API 版本?

glsl - 如何在 ALBEDO 上传递着色器颜色

python - 通过glUnproject从鼠标坐标到世界坐标

opengl - 如何避免现代 GPU 上三角形之间出现黑线?

opengl - 在计算着色器中写入空 3D 纹理

arrays - glVertex3fv 和 glVertex3f 之间的区别

c# - glsl VertexShader/FragmentShader 拒绝在 OpenTk c# 中编译

c# - 在 Windows 桌面应用程序中通过 OpenGL 窗口显示 WPF 控件

opengl - 导出展示应用

c++ - Vulkan 几何着色器意外崩溃