OpenTK提供了两种使用OpenGL的方法:GlControl
是标准WinForms控件,以及
具有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));
更新:这是GlControl的8倍FSAA的打印屏幕。我检查了驱动程序设置,并显示
Antializaing mode = Application controlled
。UPDATE2:好的,这很令人尴尬,NVIDIA控制面板中还有一个名为
Antialiasing - transparency
的选项,该选项设置为Off
。我没有注意,因为我认为这是一些alpha混合的东西,但是我错了。我将其设置为8x (supersample)
,现在GlControl的确是8xSSAA。 最佳答案
有两种常见的基于硬件的抗混叠方法:MSAA(多样本抗混叠)和SSAA(超样本抗混叠)。两种方法都是FSAA(又名全屏抗锯齿)的子类别。
使用哪种方法取决于您的GPU和驱动程序设置。默认情况下,所有现代GPU都会为您提供MSAA。您可以在驱动程序控制面板中覆盖它。
换句话说,这一行:
glControl = new GLControl(new OpenTK.Graphics.GraphicsMode(32, 24, 0, 8));
将在任何现代GPU上为您提供8倍的FSAA。根据您的驱动程序设置,它可以是MSAA(默认)或SSAA。
如果需要对抗锯齿实现进行更多控制,请创建不带抗锯齿的GLControl并使用所需的精确设置呈现给FBO。
更多信息:
OpenTK FBO example
WGL_ARB_multisample
WGL_ARB_create_context
GL_ARB_framebuffer_object
OpenGL 4.4 specification
OpenGL 4.4 reference card