在OpenGL中渲染矢量图形?

Joo*_*kia 15 opengl vector-graphics

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

将它转换为栅格并不是很有用,因为我想实时放大对象.

Fiz*_*izz 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库的数量随着时间的推移而变得越来越多,我愚蠢地认为,使用一些主要供应商不支持的东西,你会大打赌.


Ste*_*nov 6

让我扩展Greg的答案.

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

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

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

  1. 停止使用当前设置窗口(和GL上下文)的方法,并开始使用QGLWidget进行所有渲染,包括 SVG渲染.根据您的需要,这可能是一个非常小的变化.QGLWidget的功能并没有特别限制.
  2. 使用QSvgRenderer渲染到QImage,然后将来自该QImage的数据放入GL纹理(正常情况下),并以您想要的任何方式渲染(例如,变成矩形GL_QUAD).可能性能比其他方法差,但需要对代码进行最少的更改.

想知道QGLWidget究竟做了什么?好吧,当您向QGLWidget发出Qt渲染命令时,它们会被转换为GL调用.当SVG渲染器发出渲染命令时,也会发生这种情况.所以最后,你的SVG最终将通过一堆GL原语(线条,多边形等)进行渲染.

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

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


Geo*_*e R 5

这不是一个实现,但与您的问题和查看者非常相关.

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