英特尔集成显卡因缺乏对 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 软件和音乐可视化器等密集图形的东西。对于桌面应用程序来说,它的级别太低了,而且实现的差别太大了。