重新消毒后对整个场景进行抗锯齿处理

时间:2010-08-10 05:39:37

标签: opengl glut antialiasing

我在编译openGl代码时遇到了一个问题。问题是,我想实现全景抗锯齿,我不知道如何。我从Nvidia控制面板开启了强制抗锯齿,这才是我真正想要获得的。我现在用GL_POLYGON_SMOOTH做。显然它没有效率和好看。以下是问题

1)我应该使用多次采样吗? 2)管道中的哪个部分openGl混合了抗锯齿的颜色? 3)除了GL _ * _ SMOOTH和多重采样之外还存在哪些替代方案?

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:3)

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

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

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

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