OpenGL4 多重采样抗锯齿和渲染到纹理

Posted

技术标签:

【中文标题】OpenGL4 多重采样抗锯齿和渲染到纹理【英文标题】:OpenGL4 Multisample Anti-Aliasing and Render To Texture 【发布时间】:2014-04-23 13:19:54 【问题描述】:

我有一个可用的 OpenGL 多通道渲染示例,需要添加多重采样。

我尝试了两种方法。这两种方法都不使用深度或模板缓冲区,而只渲染颜色。

主渲染期间的多重采样

1. Bind Multisampling Fbo
2. Render geometry 
3. Blit / resolve multisampling
4. [1..n] Bind normal Fbo and apply post-process

最后进行多重采样

1. Bind normal Fbo
2. Render geometry
3. [1..n] Bind normal Fbo and apply post-process
4. Bind Multisample Fbo
5. Render result texture onto a quad into the multisample fbo
6. Blit / resolve multisampling

问题

虽然这两种方法似乎都有效(完整的帧缓冲区等),但我可以清楚地看到第二种方法的硬边。仅使用第一种方法,我实际上得到了抗锯齿的软边缘。

第二种方法是否存在概念问题?多重采样是否有一些特定的先决条件,这样它就不会像描述的那样工作?

我更喜欢使用第二种方法。

【问题讨论】:

【参考方案1】:

您的第二种方法行不通。多重采样使用覆盖信息为属于像素的每个样本写入不同的值。当您将几何图形绘制到非多重采样缓冲区中时,您会丢失此信息。将非多样本缓冲区渲染到多样本缓冲区无法恢复不再存在的信息(混叠已经发生)。

【讨论】:

但是纹理上的“锯齿状”边缘不应该也抗锯齿吗?我的意思是,这个像素是新渲染到多重采样 fbo 中的,所以这个新像素不应该也生成覆盖值吗? 但是像素已经使用单个几何体(四边形)渲染,因此它被 100% 覆盖,并且会从源纹理中获得单一颜色值。 顺便说一下,你可以看看 FXAA (en.wikipedia.org/wiki/Fast_approximate_anti-aliasing)。意见分歧在于它的优点,但我认为它在高分辨率下效果很好。

以上是关于OpenGL4 多重采样抗锯齿和渲染到纹理的主要内容,如果未能解决你的问题,请参考以下文章

在 GLFW 窗口中启用多重采样不会提高抗锯齿的质量

在 OpenGL ES 2.0 中渲染到纹理时的抗锯齿

Unity自定义SRP(十四):抗锯齿和缩放渲染

Metal2剖析:抗锯齿之基于Imageblock特性的增强MSAA

WebGPU学习:MSAA

在qt的QOpenGLWidget开启opengl的抗锯齿