【问题标题】:Antialiasing an entire scene after resterization恢复后对整个场景进行抗锯齿处理
【发布时间】:2010-08-10 05:39:37
【问题描述】:

我在编译 openGl 代码时遇到了问题。问题是我想实现全场景抗锯齿,但我不知道如何。我从 Nvidia 控制面板打开了强制抗锯齿,这就是我真正想要获得的。我现在用 GL_POLYGON_SMOOTH 来做。显然,它既不高效也不好看。以下是问题

1) 我应该使用多重采样吗? 2) openGl 在管道中的哪个位置混合颜色以进行抗锯齿? 3) 除了 GL_*_SMOOTH 和多重采样之外,还有哪些选择?

【问题讨论】:

  • AA 不是光栅化的一部分吗?

标签: opengl glut antialiasing


【解决方案1】:

GL_POLYGON_SMOOTH 不是一种进行全屏 AA (FSAA) 的方法。

不确定在这种情况下您所说的“效率不高”是什么意思,但它肯定不好看,因为它倾向于混合在网格中间(在三角形边缘)。

现在,关于 FSAA 和您的问题:

  1. 多重采样(又名 MSAA)是当今执行 FSAA 的标准方法。通常的替代方案是超级采样 (SSAA),它包括以更高分辨率渲染,最后进行下采样。它要贵得多。
  2. 规范说从逻辑上讲,GL 保留一个样本缓冲区(像素缓冲区大小的 4 倍,对于 4xMSAA)和一个像素缓冲区(总共 5 倍内存),并在每个样本写入样本缓冲区,使用样本缓冲区中当前 4 个样本中的 resolved 值更新像素缓冲区(顺便说一下,这不称为混合。混合是在写入样本缓冲区时发生的事情,由glBlendFunc 等人控制)。实际上,这不是硬件中发生的情况。通常,您只写入样本缓冲区(硬件通常会尝试压缩数据),当需要使用它时,GL 实现会在使用发生之前立即解析完整的缓冲区。如果您实际直接使用样本缓冲区,这也很有帮助(那么根本不需要解析)。
  3. 我介绍了 SSAA 及其成本。最新技术称为形态抗锯齿 (MLAA),目前正在积极研究中。这个想法是对完全渲染的图像进行后期处理,并对看起来像锐利边缘的东西进行抗锯齿处理。底线是,它不是由 GL 本身实现的,您必须将其编码为后处理通道。我将其包括在内以供参考,但它可能会花费quite a lot

【讨论】:

  • MLAA 真的很棒,但是除非你真的有很多时间来正确实现它,否则不要尝试这个。你应该去 MSAA。
  • @Calvin1602:确实。这就是为什么我提到它“仍在研究中”:D
【解决方案2】:

我在这里写了一篇关于这个的帖子:Getting smooth, big points in OpenGL

在选择像素格式或视觉对象时,您必须在创建 OpenGL 上下文之前指定 WGL_SAMPLE_BUFFERS 和 WGL_SAMPLES(或 XOrg/GLX 的 GLX 前缀)。

在 Windows 上,如果您想要具有扩展特征的像素格式,请确保使用 wglChoosePixelFormatARB(),而不是来自 GDI/GDI+ 的 ChoosePixelFormat()。 wglChoosePixelFormatARB 必须使用来自 ICD 驱动程序的 wglGetProcAddress 进行查询,因此您需要事先创建一个虚拟 OpenGL 上下文。 WGL 函数指针即使在 OpenGL 上下文被销毁后仍然有效。

WGL_SAMPLE_BUFFERS 是一个布尔值(1 或 0),用于切换多重采样。 WGL_SAMPLES 是您想要的缓冲区数量。通常为 2,4 或 8。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-05
    • 2012-12-18
    • 2023-03-20
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    相关资源
    最近更新 更多