28

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

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

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

4

5 回答 5

12

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

于 2009-06-22T13:26:25.680 回答
5

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

于 2009-06-22T13:27:41.963 回答
2

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

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

于 2009-06-22T13:29:28.170 回答
2

我的答案是关于使用 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 库的数量随着时间的推移来来去去,在我的拙见中,您正在使用主要供应商不支持的东西进行大赌注。

于 2014-08-06T15:23:43.527 回答
1

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

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

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

于 2018-05-22T02:48:26.500 回答