【发布时间】:2014-04-13 21:36:07
【问题描述】:
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));
更新:这是一个带有 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 方法更加灵活 - 例如,您不必破坏渲染上下文来更改抗锯齿质量。