【问题标题】:Displaying SVG in OpenGL without intermediate raster在没有中间光栅的情况下在 OpenGL 中显示 SVG
【发布时间】:2009-06-22 13:20:41
【问题描述】:

我有一些简单的 SVG 图稿(图标和字形之类的东西),我想在 OpenGL 应用程序中显示(在 Debian 上使用 C++ 开发,使用 Qt)。

显而易见的解决方案是使用 convert SVG 的 ImageMagick 库来光栅图像并将它们纹理映射到一些合适的多边形上(或者只使用旧的 glDrawPixels)。

但是,我想知道是否有任何东西可以将 SVG 直接转换为一系列 OpenGL 调用并使用 OpenGL 的线条、多边形等进行渲染。任何人都知道可以做到这一点吗?

【问题讨论】:

  • hmm.. 涉及贝塞尔曲线时的棘手问题。很高兴看到解决方案,因为这两种技术可以很好地互补。
  • tkzinc 也有可能
  • 此问题已在stackoverflow.com/questions/6287650/…再次提出

标签: c++ opengl graphics svg


【解决方案1】:

Qt 可以做到这一点。
QSvgRenderer 可以获取 SVG 并在 QGLWidget 上绘制它
如果您想在 QGLWidget 上绘制除 SVG 之外的任何其他内容,您可能需要摆弄 paintEvent() abit。

【讨论】:

  • 谢谢,非常有趣(我自己应该也注意到了)。从文档中我不清楚向量方面是否会完全保留在 QPainter-on-QGLWidget 中,或者是否会发生一些中间光栅化。应该很容易使用 GLintercept/GLtrace 找出来......
  • QPainter 通常不做任何光栅化。在 SVG 的情况下,它没有理由开始这样做。
  • 在让 GLTrace 在我的平台上使用 Qt4 应用程序(简单修复,发送给作者)之后,我可以确认 SVG 正在使用大量 gl*调用在 GLWidget 上绘制。奇趣科技在doc.trolltech.com/4.4/opengl-overpainting.html 提供了一个结合 2D 和 3D 世界的好例子。我能想象的唯一想做的事情就是在 GL 显示列表中捕获 SVG 渲染调用(尽管这样做的唯一原因是性能,如果这成为问题,我更有可能缓存渲染的位图而是)。
  • 无论如何我都会使用错误报告网络表单发送功能请求。
  • 我还注意到,在 Nvidia 驱动程序中启用自动多重采样也使 SVG 图形看起来非常漂亮和抗锯齿(如果 Qt 只是对一些软件渲染的位图进行 blitting 则不会发生这种情况)。
【解决方案2】:

SVGL 似乎解决了这个问题,但已经休眠了好几年。你仍然可以在那里找到一些有价值的代码。

【讨论】:

  • 下面“dru”提到的“sauvage”项目似乎是继任者。同一作者,但使用 python 而不是 C++。
【解决方案3】:

看起来Inkscape 有一些有趣的导出选项,您可能会觉得有用。它们包括 DXF、PovRay、EPS、PS (PostScript)、XAML、Latex 和 OpenDocument 绘图 (ODG)。也许其中有一个转换器,您可以使用 Inkscape 作为中介。

DXF 尤其是一个可能的候选者,因为它已经是一种常见的 3D 格式。 assimp 非常适合加载 DXF。

【讨论】:

  • Inkscape 还没有完整的 SVG 实现,所以我想它的导出选项也是部分的。
  • 其实我使用的所有 SVG 都是在 Inkscape 中创建的,所以只要它可以导出所有它自己的东西......没问题。
  • 无论如何,与 SVG 相比,您将受到输出格式的更多限制。 DXF 已有一百万年的历史,它不支持裁剪标记或复杂的渐变。
【解决方案4】:

我的答案是关于使用 OpenGL 显示矢量图形,因为这个问题的所有解决方案都可以特别支持相当微不足道的 SVG,尽管没有一个支持动画 SVG (SMIL)。由于没有关于动画的内容,我认为这个问题只暗示了静态 SVG。

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

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

NV_path_rendering 现在由 Google 的 Skia 库在后台使用(如果可用)。 (Nvidia 在 2013 年末和 2014 年贡献了代码。)其中一位 cairo 开发人员(也是英特尔员工)似乎也喜欢它http://lists.cairographics.org/archives/cairo/2013-March/024134.html,尽管我 [尚未] 知道为 cairo 做出的任何具体努力使用 NV_path_rendering。

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

【讨论】:

    【解决方案5】:

    我制作了一个名为Omber 的矢量绘图程序,它具有导入 SVG 文件的能力,并且可以将矢量绘图导出为 glTF 2.0 格式的“扁平化”3d 模型。 glTF 格式几乎只是原始的 OpenGL 数据,因此您可以用最少的代码读入并显示它。我写了一点 Pixi.js plugin 用于使用 WebGL 显示包含矢量艺术的 glTF 文件。

    Blender 还支持导入 SVG 文件。然后,您可以将结果导出为 3d 文件格式,但 Blender 对 SVG 的支持更多地用于导入简单曲线而不是复杂的绘图。

    我相信还有其他工具也可以做这样的事情。一个问题是 SVG 早于现代图形硬件,因此使用 OpenGL 实现它的许多功能确实很痛苦,尤其是以一种有效的方式。诸如组的不透明度、不规则形状的渐变、基于光栅的过滤器操作等可能会变得混乱,所以我不确定 SVG 的更深奥的功能是否通常被可以将事物转换为 3d 格式的程序支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 2017-11-10
      相关资源
      最近更新 更多