我刚开始使用OpenGL编程,我正在构建一个时钟应用程序。我希望它看起来像这样简单:http://i.stack.imgur.com/E73ap.jpg
但是,我的应用程序看起来非常“反锯齿”:http://i.stack.imgur.com/LUx2v.png
我尝试了红皮书中提到的GL_SMOOTH_POLYGON方法。然而,这似乎没有做任何事情。
我正在使用带有Intel集成显卡的笔记本电脑。卡片doesn't support卡如GL_ARB_multisample。
此时我的应用程序有什么选择让我的应用看起来有抗锯齿效果?
答案 0 :(得分:28)
英特尔集成的视频卡因缺乏对OpenGL抗锯齿的支持而臭名昭着。但是,你可以解决这个问题。
第一个选项:手动超级采样
使纹理的大小是屏幕的2倍。通过FBO将场景渲染到纹理,然后渲染半个大小的纹理,使其填充屏幕,使用双线性插值。由于要绘制的像素增加4倍,因此可能非常慢(在复杂的场景中)。
将导致弱抗锯齿(因此我不建议像桌面软件一样使用它)。亲眼看看:
第二个选项:(高级)
使用着色器执行 Morphological Antialiasing 。这是一项新技术,我不知道实施起来有多容易。它被一些高级游戏使用。
第三个选项:
通过纹理模拟OpenGL的基元,使用纹理和双线性插值来获得优势。该技术被描述为here。
第四个选项: 为时钟的每个元素使用单独的纹理。
例如,对于您的小时箭头,请勿使用形状像箭头的扁平黑色GL_POLYGON。而是使用旋转的GL_QUAD,使用在图像程序中绘制的小时箭头图像进行纹理处理。然后双线性插值将在旋转时对其进行抗锯齿处理。
这个选项花费最少,看起来非常好。
第五种选择:
使用支持软件渲染 -
这些库包含自己的抗锯齿渲染算法,因此它们不依赖于您的视频抗锯齿。优点是:
缺点是性能要差得多,但这对于时钟应用程序来说根本不重要,当你考虑我提到的智能重绘功能时,它会转过来。
对于像时钟应用程序这样的东西,非常推荐第五个选项。 OpenGL主要用于游戏,3D软件和音乐可视化等强大的图形内容。对于桌面应用程序,它太低级别,实现差异太大。
答案 1 :(得分:0)
以最终分辨率的两倍(或更多)将其绘制到帧缓冲对象中,然后将该图像用作实际窗口中绘制的单个四边形的纹理。