Joo*_*kia 15 opengl vector-graphics
有没有办法加载矢量图形文件,然后使用OpenGL渲染它?这是一个模糊的问题,因为我对矢量图形的文件格式知之甚少.不过我知道SVG.
将它转换为栅格并不是很有用,因为我想实时放大对象.
我看到大多数答案都是以某种方式关于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库的数量随着时间的推移而变得越来越多,我愚蠢地认为,使用一些主要供应商不支持的东西,你会大打赌.
让我扩展Greg的答案.
确实,Qt有一个SVG渲染器类QSvgRenderer.此外,您在Qt中执行的任何绘图都可以在任何"QPaintDevice"上完成,我们对以下"绘图设备"感兴趣:
因此,如果您决定使用Qt,您的选择是:
想知道QGLWidget究竟做了什么?好吧,当您向QGLWidget发出Qt渲染命令时,它们会被转换为GL调用.当SVG渲染器发出渲染命令时,也会发生这种情况.所以最后,你的SVG最终将通过一堆GL原语(线条,多边形等)进行渲染.
这有一个缺点.不同的视频卡以稍微不同的方式实现OpenGL,而Qt不会(也不能)解释所有这些差异.因此,例如,如果您的用户有一个便宜的板载英特尔显卡,那么他的显卡不支持OpenGL抗锯齿,这意味着如果您直接将其渲染到QGLWidget,您的SVG也会看起来别名(锯齿状).通过QImage可以避免这些问题.
您也可以在实时放大时使用QImage方法.这取决于你需要多快.您可能需要仔细优化,例如重用相同的QImage,以及为QPainter启用剪辑.
这不是一个实现,但与您的问题和查看者非常相关.
第25章在GPU上渲染矢量艺术 https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html