gpt4 book ai didi

c++ - OpenGL 中的抗锯齿

转载 作者:可可西里 更新时间:2023-11-01 17:00:26 25 4
gpt4 key购买 nike

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

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

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

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

此时我的应用程序看起来抗锯齿有哪些选择?

最佳答案

Intel 集成视频卡因不支持 OpenGL 抗锯齿而臭名昭著。不过,您可以解决这个问题。

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

会导致抗锯齿(所以我不推荐它用于像你的时钟这样的桌面软件)。自己看看:
antialiasing vs supersampling

第二个选项:(高级)
使用着色器执行 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 软件和诸如音乐可视化器之类的强烈图形化的东西。对于桌面应用程序,它的级别太低且实现差异太大。

关于c++ - OpenGL 中的抗锯齿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4112106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com