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

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

我尝试了红皮书中提到的GL_SMOOTH_POLYGON方法。但是,这似乎没有任何作用。

我正在使用带有英特尔集成显卡的笔记本电脑。卡doesn't support之类的东西,例如GL_ARB_multisample。

这时我的应用看起来反走样了,我有什么选择?

最佳答案

英特尔集成显卡因缺乏对OpenGL抗锯齿的支持而臭名昭著。但是,您可以解决此问题。

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

会导致抗锯齿能力较弱(因此,我不建议您在时钟等台式机软件中使用它)。你自己看:

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

第三种选择:
通过通过纹理模拟OpenGL的原始来使用纹理和双线性插值,以发挥自己的优势。该技术描述为here

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

例如,对于小时箭头,请不要使用形状像箭头一样的浅黑色GL_POLYGON。取而代之的是使用旋转的GL_QUAD,该GL_QUAD带有在图像程序中绘制的一小时箭头图像。然后,双线性插值将在您旋转时进行抗锯齿处理。

此选项将花费最少的精力,并且外观非常好。

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

  • Qt
  • 开罗
  • Windows GDI +
  • WPF
  • XRender

  • 此类库包含自己的抗锯齿渲染算法,因此它们不依赖于视频卡进行抗锯齿。优点是:
  • 将在每个平台上呈现相同的内容。 (在各种情况下OpenGL都无法保证-例如,屏幕截图中的粗斜线“刻度线”显示为平行四边形,而不是矩形)
  • 有很多方便的绘图函数(“drawArc”,“drawText”,“drawConcavePolygon”,这些函数将支持渐变和边框。您还可以获得类似Image类的东西。)
  • 一些工具,例如Qt,将提供更多的桌面应用程序类型功能。即使对于时钟应用程序,这也可能非常有用。例如:

    在OpenGL应用程序中使用
  • ,您可能每20毫秒循环一次,然后重新渲染时钟,甚至都不会三思而后行。这会占用不必要的CPU周期,并唤醒笔记本电脑上的CPU,从而耗尽电池。相比之下,Qt对于何时必须重绘时钟的一部分(例如,何时时钟的右半边不再被窗口覆盖或时钟向分钟箭头移动一步)非常聪明。
  • 一旦您开始实现,例如时钟的托盘图标或设置对话框,像Qt这样的库可以使它变得轻而易举。对所有内容都使用相同的库非常好。

  • 缺点是性能要差得多,但对于时钟应用程序根本不重要,考虑到我提到的智能重绘功能后,它就会扭转。

    对于时钟应用程序,强烈建议使用第五个选项。 OpenGL主要用于游戏,3D软件和诸如音乐可视化工具之类的图形化内容。对于桌面应用程序,它的级别太低,实现方式也相差太多。

    09-04 15:31
    查看更多