【问题标题】:Rendering Vector Graphics in OpenGL? [duplicate]在 OpenGL 中渲染矢量图形? [复制]
【发布时间】:2010-11-09 02:17:26
【问题描述】:

有没有办法加载矢量图形文件,然后使用 OpenGL 进行渲染?这是一个模糊的问题,因为我对矢量图形的文件格式了解不多。不过,我知道 SVG。

将其转换为光栅并没有什么帮助,因为我想实时放大对象。

【问题讨论】:

  • 你的显示器是一个光栅显示器,所以它最终会在某个时候被光栅化,问题是光栅化是否发生在足够晚的阶段以方便你做你的事情想要做。 OpenGL 没有对任何文件格式的特定支持(可能除了用着色器语言编写的代码),所以这一切都取决于你愿意写什么。
  • 基本上和stackoverflow.com/questions/4054612/…是同一个问题

标签: opengl vector-graphics


【解决方案1】:

我看到大多数答案都是关于 Qt 的,尽管最初的问题没有提到它。这是我仅就 OpenGL 而言的答案(随着时间的推移,这也大大受益,因为它在 2010 年不可能给出):

自 2011 年以来,最先进的是 Mark Kilgard 的宝贝 NV_path_rendering,它目前只是一个供应商 (Nvidia) 扩展,您可能已经从它的名称中猜到了。这方面的资料很多:

NV_path_rendering 现在由 Google 的 Skia 库在后台使用(如果可用)。 (Nvidia 在 2013 年末和 2014 年贡献了代码。)

您当然可以加载 SVG 等 https://www.youtube.com/watch?v=bCrohG6PJQE。它们还支持路径的 PostScript 语法。您还可以将路径渲染与其他 OpenGL (3D) 内容混合使用,如下所示:

目前正在开发和维护的NanoVG 是一个拥有更少(或完全没有)供应商支持或学术浮华的新贵。 (https://github.com/memononen/nanovg) 鉴于 OpenGL 上的 2D 库的数量随着时间的推移来来去去,在我看来,您正在押注使用主要供应商不支持的东西。

【讨论】:

    【解决方案2】:

    这不是一个实现,但与您的问题和观众非常相关。

    第 25 章。在 GPU 上渲染矢量图 https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html

    【讨论】:

    • 链接已损坏(这本质上是一个仅链接的答案......)
    • 不要紧,它只是一个链接的答案,它仍然有用。
    【解决方案3】:

    让我扩展 Greg 的答案。

    Qt 确实有一个 SVG 渲染器类,QSvgRenderer。此外,您在 Qt 中所做的任何绘图都可以在任何“QPaintDevice”上完成,我们对以下“绘图设备”感兴趣:

    • Qt 小部件;
    • 特别是基于 GL 的 Qt 小部件 (QGLWidget);
    • Qt 图像

    因此,如果您决定使用 Qt,您的选择是:

    1. 停止使用当前设置窗口(和 GL 上下文)的方法,并开始使用 QGLWidget 进行所有渲染,包括 SVG 渲染。这可能是一个很小的变化,具体取决于您的需要。 QGLWidget 的功能并没有特别的限制。
    2. 使用 QSvgRenderer 渲染到 QImage,然后将该 QImage 中的数据放入 GL 纹理(就像您通常那样),并以您想要的任何方式渲染它(例如放入矩形 GL_QUAD)。可能比其他方法性能更差,但对代码的更改最少。

    想知道 QGLWidget 究竟做了什么?好吧,当您向 QGLWidget 发出 Qt 渲染命令时,它们会为您转换为 GL 调用。当渲染命令由 SVG 渲染器发出时,也会发生这种情况。所以最后,你的 SVG 最终会通过一堆 GL 基元(线、多边形等)来渲染。

    这有一个缺点。不同的显卡实现 OpenGL 略有不同,Qt 没有(也不能)解释所有这些差异。因此,例如,如果您的用户有一个便宜的板载 Intel 显卡,那么他的显卡不支持 OpenGL 抗锯齿,这意味着如果您将 SVG 直接渲染到 QGLWidget,它也会看起来有锯齿(锯齿状)。通过 QImage 可以避免此类问题。

    您可以在实时放大时使用 QImage 方法。这仅取决于您需要多快。您可能需要仔细优化,例如重用相同的 QImage,并为您的 QPainter 启用剪辑。

    【讨论】:

      【解决方案4】:

      Qt 对使用 OpenGL 功能直接渲染 SVG 图像有很好的支持(请参阅QSvgRenderer 的文档)。

      希望对你有帮助。

      【讨论】:

        【解决方案5】:

        它有像 GL_LINES 和 GL_LINE_STRIP 这样的原语,用于在空间中绘制线条,如果这就是你的意思的话。编辑:这个网站有一些信息:http://www.falloutsoftware.com/tutorials/gl/gl2p5.htm

        【讨论】:

          猜你喜欢
          • 2023-03-21
          • 1970-01-01
          • 2014-04-15
          • 1970-01-01
          • 2018-08-10
          • 2013-01-13
          • 2023-03-14
          • 2011-12-08
          • 1970-01-01
          相关资源
          最近更新 更多