OpenGL中的抗锯齿技术

8
我刚开始学习OpenGL编程,并正在构建一个时钟应用程序。我希望它看起来像这样简单:http://i.stack.imgur.com/E73ap.jpg 然而,我的应用程序看起来非常“未抗锯齿”:http://i.stack.imgur.com/LUx2v.png 我尝试了《红皮书》中提到的GL_SMOOTH_POLYGON方法。但是似乎没有任何效果。
我正在使用一台配备英特尔集成显卡的笔记本电脑。该显卡不支持诸如GL_ARB_multisample之类的功能。
在这种情况下,我有哪些选项可以使我的应用程序具有抗锯齿效果?
2个回答

29

英特尔集成显卡以不支持OpenGL抗锯齿而闻名。不过,您可以绕过此问题。

第一选择:手动超采样
创建一个比屏幕大2倍的纹理。通过FBO将场景渲染到纹理中,然后以双线性插值的方式将纹理渲染为半尺寸以填充屏幕。由于要绘制的像素数量增加了4倍,因此在复杂场景中可能会非常慢。

结果将产生抗锯齿效果(因此我不建议将其用于桌面软件,例如时钟)。自行查看:
antialiasing vs supersampling

第二选择:(高级)
使用着色器执行形态抗锯齿。这是一种新技术,我不知道它有多容易实现。一些高级游戏使用它。

第三选择:
通过纹理和双线性插值利用模拟OpenGL的基元来进行优化。该技术在此描述

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

例如,对于您的小时指针,不要使用一个类似于箭头形状的黑色GL_POLYGON。相反,使用旋转的GL_QUAD,用图像程序绘制的小时指针图像进行纹理处理。然后双线性插值将在旋转时进行抗锯齿处理。

这个选项需要的工作最少,看起来效果非常好。

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

  • Qt
  • Cairo
  • Windows GDI+
  • WPF
  • XRender
  • 等等

这些库包含了自己的抗锯齿渲染算法,因此它们不依赖于你的显卡进行抗锯齿处理。以下是优点:

  • 在每个平台上都能呈现相同的效果。(使用OpenGL时,在某些情况下不能保证这一点-例如,您截图中厚重的对角“勾”线条会呈平行四边形而非矩形)
  • 具有大量方便的绘图函数(如“drawArc”,“drawText”,“drawConcavePolygon”),同时也支持梯度和边框。此外,还有像Image类之类的其他功能。
  • 像Qt这样的库将提供更多的桌面应用程序类型功能。即使是对于一个时钟应用程序来说也非常有用。例如:
    • 在OpenGL应用程序中,您可能会每20毫秒循环一次并重新渲染时钟,而且甚至不会有任何疑问。这会占用不必要的CPU周期,并唤醒笔记本电脑上的CPU,耗尽电池电量。相比之下,Qt非常聪明,可以智能地重新绘制您的时钟的部分区域(例如,当窗口不再覆盖时钟的右半部分或者当分钟表针移动了一步时)。
    • 一旦您开始实现,例如托盘图标或时钟的设置对话框,像Qt这样的库可以使其变得轻而易举。使用同一库可让所有内容变得更加美好。

缺点是性能较差,但对于时钟应用程序来说这并不重要,并且考虑到我提到的智能重绘功能,情况会逆转。

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


也许我的回答过于仓促了:我假设这个练习的重点是使用OpenGL,但你说得很对,2D库更加适合。在示例时钟中,没有任何“3D”效果是通过实际的3D渲染、光照、阴影等实现的。 - Ben Jackson
1
受这个答案的启发,我提出了这个后续问题,它涉及实现超采样的技术细节,例如,是否双线性过滤真的是超采样的正确方式。 - bluenote10

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接