在OpenGL中渲染矢量图形?

时间:2010-11-09 02:17:26

标签: opengl vector-graphics

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

将其转换为光栅并不是很有用,因为我想实时放大对象。

5 个答案:

答案 0 :(得分:9)

我看到大多数答案都是关于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库的数量随着时间的推移而变化,我愚蠢地认为,使用主要供应商不支持的东西进行大赌注。

答案 1 :(得分:6)

让我谈谈格雷格的答案。

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

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

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

  1. 停止使用当前设置窗口的方法(和GL上下文),并开始使用QGLWidget进行所有渲染,包括 SVG渲染。根据您的需要,这可能是一个非常小的变化。 QGLWidget的功能并没有特别限制。
  2. 使用QSvgRenderer渲染到QImage,然后将来自该QImage的数据放入GL纹理(正常情况下),并以您想要的任何方式渲染(例如,变成矩形GL_QUAD)。可能性能比其他方法差,但需要对代码进行最少的更改。
  3. 想知道QGLWidget究竟做了什么?好吧,当您向QGLWidget发出Qt渲染命令时,它们会被转换为GL调用。当SVG渲染器发出渲染命令时,也会发生这种情况。所以最后,你的SVG最终将通过一堆GL原语(线条,多边形等)进行渲染。

    这有一个缺点。不同的视频卡以稍微不同的方式实现OpenGL,而Qt不会(也不能)解释所有这些差异。因此,例如,如果您的用户有一个便宜的板载英特尔显卡,那么他的显卡不支持OpenGL抗锯齿,这意味着如果您直接将其渲染到QGLWidget,您的SVG也会看起来别名(锯齿状)。通过QImage避免了这些问题。

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:2)

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

我希望有所帮助。

答案 4 :(得分:0)

它具有GL_LINES和GL_LINE_STRIP等基元,用于在空间中绘制线条,如果这就是你的意思。编辑:此网站包含一些信息:http://www.falloutsoftware.com/tutorials/gl/gl2p5.htm