OpenGL中的抗锯齿

时间:2010-11-06 05:48:24

标签: c++ opengl antialiasing

我刚开始使用OpenGL编程,我正在构建一个时钟应用程序。我希望它看起来像这样简单:http://i.stack.imgur.com/E73ap.jpg

但是,我的应用程序看起来非常“反锯齿”:http://i.stack.imgur.com/LUx2v.png

我尝试了红皮书中提到的GL_SMOOTH_POLYGON方法。然而,这似乎没有做任何事情。

我正在使用带有Intel集成显卡的笔记本电脑。卡片doesn't support卡如GL_ARB_multisample。

此时我的应用程序有什么选择让我的应用看起来有抗锯齿效果?

2 个答案:

答案 0 :(得分:28)

英特尔集成的视频卡因缺乏对OpenGL抗锯齿的支持而臭名昭着。但是,你可以解决这个问题。

第一个选项:手动超级采样
使纹理的大小是屏幕的2倍。通过FBO将场景渲染到纹理,然后渲染半个大小的纹理,使其填充屏幕,使用双线性插值。由于要绘制的像素增加4倍,因此可能非常慢(在复杂的场景中)。

将导致抗锯齿(因此我不建议像桌面软件一样使用它)。亲眼看看:
antialiasing vs supersampling

第二个选项:(高级)
使用着色器执行 Morphological Antialiasing 。这是一项新技术,我不知道实施起来有多容易。它被一些高级游戏使用。

第三个选项:
通过纹理模拟OpenGL的基元,使用纹理和双线性插值来获得优势。该技术被描述为here

第四个选项: 为时钟的每个元素使用单独的纹理。

例如,对于您的小时箭头,请勿使用形状像箭头的扁平黑色GL_POLYGON。而是使用旋转的GL_QUAD,使用在图像程序中绘制的小时箭头图像进行纹理处理。然后双线性插值将在旋转时对其进行抗锯齿处理。

这个选项花费最少,看起来非常好。

第五种选择:
使用支持软件渲染 -

的库
  • Qt的
  • 开罗
  • Windows GDI +
  • WPF
  • XRENDER

这些库包含自己的抗锯齿渲染算法,因此它们不依赖于您的视频抗锯齿。优点是:

  • 在每个平台上呈现相同的内容。 (在各种情况下,OpenGL不能保证这一点 - 例如,屏幕截图中的粗对角“勾”线呈现为平行四边形,而不是矩形)
  • 有很多方便的绘图功能(“drawArc”,“drawText”,“drawConcavePolygon”,这些将支持渐变和边框。你也可以得到像Image类的东西。)
  • 有些像Qt一样,会提供更多桌面应用类型的功能。即使对于时钟应用程序,这也非常有用。例如:
    • 在一个OpenGL应用程序中,你可能每20毫秒循环一次并重新渲染时钟,甚至不会三思而后行。这会占用不必要的CPU周期,并在笔记本电脑上唤醒CPU,耗尽电池电量。相比之下,Qt非常聪明,它必须重新绘制时钟的一部分(例如,当时钟的右半部分停止被窗口覆盖,或者当你的时钟移动分钟箭头一步时)。
    • 一旦你开始实施,例如一个托盘图标,或一个设置对话框,为您的时钟,像Qt这样的库可以使它成为一个快照。很高兴为所有东西使用相同的库。

缺点是性能要差得多,但这对于时钟应用程序来说根本不重要,当你考虑我提到的智能重绘功能时,它会转过来。

对于像时钟应用程序这样的东西,非常推荐第五个选项。 OpenGL主要用于游戏,3D软件和音乐可视化等强大的图形内容。对于桌面应用程序,它太低级别,实现差异太大。

答案 1 :(得分:0)

以最终分辨率的两倍(或更多)将其绘制到帧缓冲对象中,然后将该图像用作实际窗口中绘制的单个四边形的纹理。