OpenGL中的抗锯齿

hoj*_*ram 8 c++ opengl antialiasing

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

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

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

我正在使用带有Intel集成显卡的笔记本电脑.该卡不支持 GL_ARB_multisample等内容.

到目前为止,我的应用程序看起来有什么选择可以消除锯齿?

Ste*_*nov 29

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

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

将导致抗锯齿(因此我不推荐它用于桌面软件,如你的时钟).你自己看:
抗锯齿与超级采样

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

第三种选择:
通过纹理模拟OpenGL的基元,使用纹理和双线性插值来获得优势.这里描述该技术.

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

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

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

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

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

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

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

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

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