【问题标题】:Anti-aliasing in OpenGLOpenGL中的抗锯齿
【发布时间】:2010-11-06 05:48:23
【问题描述】:

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

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

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

我正在使用配备英特尔集成显卡的笔记本电脑。卡片doesn't support GL_ARB_multisample 之类的东西。

此时我有哪些选项可以让我的应用看起来抗锯齿?

【问题讨论】:

    标签: c++ opengl antialiasing


    【解决方案1】:

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

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

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

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

    第三个选项:
    通过纹理模拟 OpenGL 的基元,使用纹理和双线性插值对您有利。该技术被描述为here

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 也许我自己的回答太仓促了:我认为练习的重点是使用 OpenGL,但你说得对,2D 库更合适。示例时钟中的“3D”效果都不是通过实际的 3D 渲染、照明、阴影等实现的。
    • 受这个答案的启发,我问this follow up question,它解决了实现超级采样的技术细节,例如,提出双线性过滤是否真的是超级采样的方法。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 2011-02-16
      相关资源
      最近更新 更多