我有一些简单的 SVG 图稿(图标和字形之类的东西),我想在 OpenGL 应用程序中显示(在 Debian 上使用 C++ 开发,使用 Qt)。
显而易见的解决方案是使用 ImageMagick 库将 SVG转换为光栅图像并将它们纹理映射到一些合适的多边形上(或者只使用旧的 glDrawPixels)。
但是,我想知道是否有任何东西可以将 SVG 直接转换为一系列 OpenGL 调用并使用 OpenGL 的线条、多边形等进行渲染。任何人都知道可以做到这一点吗?
Qt 可以做到这一点。
QSvgRenderer可以获取一个 SVG 并将其绘制在一个 SVG上,如果您想在 QGLWidget 上绘制除 SVG 之外的任何其他内容,您QGLWidget
可能需要摆弄一下。paintEvent()
SVGL似乎解决了这个问题,但已经休眠了好几年。您仍然可以在那里找到一些有价值的代码。
我的答案是关于使用 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 库的数量随着时间的推移来来去去,在我的拙见中,您正在使用主要供应商不支持的东西进行大赌注。
我制作了一个名为Omber的矢量绘图程序,它具有导入 SVG 文件的能力,它可以将矢量图导出为 glTF 2.0 格式的“扁平化”3d 模型。glTF 格式几乎只是原始的 OpenGL 数据,因此您可以用最少的代码读入并显示它。我写了一个小Pixi.js 插件,用于使用 WebGL 显示包含矢量艺术的 glTF 文件。
Blender 还支持导入 SVG 文件。然后,您可以将结果导出为 3d 文件格式,但 Blender 对 SVG 的支持更多地用于导入简单曲线而不是复杂绘图。
我敢肯定还有其他工具也可以做这样的事情。一个问题是 SVG 早于现代图形硬件,因此使用 OpenGL 实现它的许多功能确实很痛苦,尤其是以一种有效的方式。诸如组的不透明度、不规则形状的渐变、基于光栅的过滤器操作等可能会变得混乱,所以我不确定 SVG 的更深奥的功能是否通常被可以将事物转换为 3d 格式的程序支持。