我在编译 openGl 代码时遇到了问题。问题是我想实现全场景抗锯齿,但我不知道如何。我从 Nvidia 控制面板打开了强制抗锯齿,这就是我真正想要获得的。我现在用 GL_POLYGON_SMOOTH 来做。显然,它既不高效也不好看。以下是问题
1)我应该使用多重采样吗?2) openGl 在管道中的哪个位置混合颜色以进行抗锯齿?3) 除了 GL_*_SMOOTH 和多重采样之外,还有哪些选择?
我在编译 openGl 代码时遇到了问题。问题是我想实现全场景抗锯齿,但我不知道如何。我从 Nvidia 控制面板打开了强制抗锯齿,这就是我真正想要获得的。我现在用 GL_POLYGON_SMOOTH 来做。显然,它既不高效也不好看。以下是问题
1)我应该使用多重采样吗?2) openGl 在管道中的哪个位置混合颜色以进行抗锯齿?3) 除了 GL_*_SMOOTH 和多重采样之外,还有哪些选择?
GL_POLYGON_SMOOTH不是进行全屏 AA (FSAA) 的方法。
不确定在这种情况下“效率不高”是什么意思,但它肯定不好看,因为它倾向于混合在网格中间(在三角形边缘)。
现在,关于 FSAA 和您的问题:
glBlendFunc
等)。实际上,这不是硬件中发生的情况。通常,您只写入样本缓冲区(硬件通常会尝试压缩数据),当需要使用它时,GL 实现会在使用发生之前立即解析完整的缓冲区。如果您实际直接使用样本缓冲区,这也很有帮助(那么根本不需要解析)。我在这里写了一篇关于这个的帖子: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。