c# - 如何在 OpenTK 的 GlControl 中实现更好的抗锯齿?

标签 c# opengl opentk

OpenTK 提供了两种使用 OpenGL 的方法:

  1. GlControl 是标准的 WinForms 控件,以及
  2. 具有 OpenGL 上下文的 native 窗口。

我正在使用 GlControl,而 FSAA 的质量似乎很低。我正在开发一个应用程序,其中包含许多围绕 OpenGL 控件的控件,因此我有点被迫使用 GlControl。

有没有办法在 GLControl 中实现更好的抗锯齿(例如 super 采样)?在我的应用程序中,我渲染了很多具有像素甚至子像素大小的东西,而当前的 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

Aliasing example

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

Aliasing fixed

最佳答案

有两种常见的基于硬件的抗锯齿方法: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

关于c# - 如何在 OpenTK 的 GlControl 中实现更好的抗锯齿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23048723/

相关文章:

c# - 如何强制将单个域用于 ASP.NET MVC 站点?

c# - 如何在 Entity Framework 中保存组合的(新的+修改的)分离实体?

c++ - 从 HDRi LatLong 贴图直接渲染到浮点立方体贴图 - 而不是 HDR

OpenGL 法线不起作用?

c# - 简单队列算法

c# - 如何在 C# 中对 PowerShell Core 二进制 cmdlet 进行单元测试

opengl - 究竟什么是顶点属性?

c++ - 渲染到纹理,然后在 OpenGL 中将结果渲染到屏幕

c# - 如何调试 OpenTK?

c# - 正确使用 GLTexImage3D 的问题