如何在OpenTK的GlControl中实现更好的抗锯齿效果?

3
OpenTK提供了两种使用OpenGL的方式:
  1. GlControl是标准的WinForms控件,
  2. 本地窗口与OpenGL上下文。
我正在使用GlControl,但FSAA的质量似乎很低。我正在开发一个应用程序,OpenGL控件周围有很多控件,所以我被迫使用GlControl。
是否有任何方法可以在GLControl中实现更好的抗锯齿效果(例如超采样)?在我的应用程序中,我渲染了许多具有像素甚至亚像素大小的东西,当前的FSAA处理得不好。
我在构造函数中看到了一个指定缓冲区数量的参数,将该数字设置为6并渲染4个样本,将它们组合到第5个缓冲区中并与第6个缓冲区交换,这种做法可行吗?或者,最简单的实现SSAA的方法是什么?
以下是我创建GlControl的方式,其中8是FSAA的样本数:
glControl = new GLControl(new OpenTK.Graphics.GraphicsMode(32, 24, 0, 8));

更新:这里是带有8x FSAA的GlControl的屏幕截图。我检查了我的驱动程序设置,它说“抗锯齿模式 = 应用程序控制”。
更新2:好吧,这可能很尴尬,NVIDIA控制面板中还有另一个选项叫做“抗锯齿-透明度”,它被设置为“关闭”。我没有注意到,因为我以为那是一些alpha混合之类的东西,但我错了。我将其设置为“8x(超采样)”,现在GlControl确实是8xSSAA。

在代码中,我看不出在为win和ctl创建上下文方面有什么很大的区别(一些信息)。 - j-p
@j-p 是的,构造函数基本上具有相同的签名,但它们执行非常不同的操作。我想知道为什么 GlControl 不提供多重采样,而窗口却提供了,这是什么关键问题。 - NightElfik
WinGLContext 在 OpenTK 内部的 win 和 ctl 中似乎很常见,但你可能是对的,有 WinGLNative,我已经尽力深入检查了... - j-p
1
此外,任何标准的GL框架中的样本计数都应该是MSAA;GL没有可配置SSAA的核心支持。现代方法实际上是使用多采样FBO,然后在绘制完成时将其内容复制到窗口的帧缓冲区中。FBO方法更加灵活-例如,您不必销毁渲染上下文以改变抗锯齿质量。 - Andon M. Coleman
@NightElfik:你是否熟悉FBO?另外,你的目标最低GL版本是什么?如果你已经知道FBO的工作原理,我可以写几行代码来展示如何分配和附加多重采样渲染缓冲区。 - Andon M. Coleman
显示剩余2条评论
1个回答

11

有两种常见的基于硬件的抗锯齿方法:MSAA(多重采样抗锯齿)和SSAA(超级采样抗锯齿)。两种方法都是FSAA(全屏抗锯齿)的子类。

使用哪种方法取决于您的GPU和驱动程序设置。默认情况下,所有现代GPU都会给您提供MSAA。您可以在驱动程序控制面板中覆盖此设置。

换句话说,这条线:

glControl = new GLControl(new OpenTK.Graphics.GraphicsMode(32, 24, 0, 8));

在任何现代GPU上,都可以通过本方法获得8倍FSAA。这可以是MSAA(默认)或SSAA,这取决于您的驱动程序设置。

如果您需要更多地控制抗锯齿实现,请创建没有抗锯齿的GLControl,并使用您需要的精确设置渲染到FBO。

更多信息:

  1. OpenTK FBO示例
  2. WGL_ARB_multisample
  3. WGL_ARB_create_context
  4. GL_ARB_framebuffer_object
  5. OpenGL 4.4规范
  6. OpenGL 4.4参考卡

我明白了,那是我对术语理解上的误解。感谢您的澄清。我已经稍微编辑了一下问题以解决这个问题。我的问题是如何实现更好的抗锯齿质量?似乎默认情况下 GlControl 进行了一些边缘模糊的后处理,看起来效果不是很好。 - NightElfik
你能提供一张截图吗?可能是驱动程序选择使用FXAA(Nvidia)或MLAA(Ati)而不是更高质量的MSAA / SSAA。这是一个只能通过驱动程序控制面板更改的驱动程序设置。GLControl对此没有控制权(当然也不会自行执行任何后处理)。 - The Fiddler
你说得没错,问题确实出在NVIDIA控制面板的驱动程序设置上。谢谢! - NightElfik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接