8

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

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

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

我正在使用带有英特尔集成显卡的笔记本电脑。该卡不支持GL_ARB_multisample 之类的东西。

在这一点上,我有哪些选项可以让我的应用看起来抗锯齿?

4

2 回答 2

29

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

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

会导致抗锯齿(所以我不建议将它用于像你的时钟这样的桌面软件)。你自己看:
抗锯齿与超级采样

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

第三种选择:通过纹理模拟 OpenGL 的图元
,使用纹理和双线性插值对您有利。此处描述了该技术。

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

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

此选项将花费最少的精力并且看起来非常好。

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

  • Qt
  • 开罗
  • 视窗 GDI+
  • WPF
  • XRender
  • ETC

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

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

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

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

于 2010-11-06T06:37:00.223 回答
0

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

于 2010-11-06T06:20:05.703 回答