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

时间:2014-04-13 21:36:08

标签: c# opengl opentk

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

  1. GlControl是标准的WinForms控件,
  2. 带有OpenGL上下文的本机窗口。
  3. 我正在使用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

    Aliasing example

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

    Aliasing fixed

1 个答案:

答案 0 :(得分:10)

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

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

换句话说,这一行:

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

将在任何现代GPU上为您提供8x 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