2

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

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

4

2 回答 2

5

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

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

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

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

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

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

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

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

于 2010-08-11T14:25:25.300 回答