在没有中间栅格的情况下在OpenGL中显示SVG

时间:2009-06-22 13:20:41

标签: c++ opengl graphics svg

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

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

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

5 个答案:

答案 0 :(得分:12)

Qt可以做到这一点 QSvgRenderer可以使用SVG并将其绘制在QGLWidget上 如果你想在除了SVG之外的QGLWidget上绘制任何其他东西,你可能需要摆弄paintEvent() abit。

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分: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年提供了代码。)其中一位开罗开发者(也是英特尔员工)似乎也喜欢http://lists.cairographics.org/archives/cairo/2013-March/024134.html,尽管我还没有意识到任何具体的努力让cairo使用NV_path_rendering。

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

答案 4 :(得分:1)

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

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

我确定还有其他工具可以做这样的事情。一个问题是SVG早于现代图形硬件,因此使用OpenGL实现其许多功能真的很痛苦,特别是以高效的方式。像群体上的不透明度,不规则形状的渐变,基于栅格的滤镜操作等等都会变得混乱,所以我不确定SVG的更深奥的功能是否通常可以被可以将事物转换为3d格式的程序支持