【问题标题】:How to achieve better anti-aliasing in GlControl in OpenTK?如何在 OpenTK 中的 GlControl 中实现更好的抗锯齿?
【发布时间】:2014-04-13 21:36:07
【问题描述】:

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 的打印屏幕。我检查了我的驱动程序设置,上面写着Antializaing mode = Application controlled

UPDATE2:好的,这可能很尴尬,在 NVIDIA 控制面板中有另一个选项称为Antialiasing - transparency,它被设置为Off。我没有注意,因为我认为那是一些 alpha 混合的东西,但我错了。我将它设置为8x (supersample),现在 GlControl 确实是 8xSSAA。

【问题讨论】:

  • 在代码中,我发现 win 和 ctl (some info) 的上下文创建之间没有很大差异。
  • @j-p 是的,构造函数的签名基本相同,但它们做的事情却大不相同。我想知道为什么 GlControl 不提供多重采样,但窗口提供,什么是交易破坏者。
  • WinGLContext 似乎在 Win 和 ctl 的 OpenTK 内部很常见,但你可能是对的,WinGLNative,累了要深入检查......
  • 您通常希望控制 MSAA 样本的数量而不是缓冲区。然而,更重要的是,您需要启用 Multisample 光栅化 - 仅为样本分配存储将无济于事(与深度缓冲区相同)。
  • 另外,任何标准 GL 框架中的样本数都应该是 MSAA; GL 没有对可配置 SSAA 的核心支持。所有这一切的现代方法实际上是使用多重采样 FBO,然后在绘制完成时将其内容 blit 到窗口的帧缓冲区中。 FBO 方法更加灵活 - 例如,您不必破坏渲染上下文来更改抗锯齿质量。

标签: c# opengl opentk


【解决方案1】:

有两种常见的基于硬件的抗锯齿方法: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 example
  2. WGL_ARB_multisample
  3. WGL_ARB_create_context
  4. GL_ARB_framebuffer_object
  5. OpenGL 4.4 specification
  6. OpenGL 4.4 reference card

【讨论】:

  • 我明白了,这是我对术语的误解,感谢您的澄清。我已经编辑了这个问题来解决它。我的问题是如何获得更好的抗锯齿质量?似乎默认情况下,GlControl 做了一些模糊边缘的后处理,看起来不太好。
  • 你能提供截图吗?可能是驱动程序选择使用 FXAA (Nvidia) 或 MLAA (Ati) 而不是更高质量的 MSAA/SSAA。这是一个驱动程序设置,只能通过驱动程序控制面板进行更改。 GLControl 对此无法控制(当然也不会自行执行任何后处理。)
  • 你确实是对的,这是NVIDIA控制面板中的驱动程序设置。谢谢!
猜你喜欢
  • 2022-01-10
  • 2014-02-18
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
相关资源
最近更新 更多