2010-11-09 205 views
15

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

把它变成光栅并不是真的有用,因为我想对对象进行实时放大。

+0

您的监视器是一个光栅显示器,因此它最终会在某个时间点被光栅化,问题在于光栅化是否发生在足够晚的阶段,以便方便地执行您想要执行的操作。 OpenGL对任何文件格式都没有特别的支持(除了用着色器语言编写的代码之外),所以这一切都归结于你愿意写的东西。 – 2010-11-09 17:22:29

+1

基本上,这是同样的问题http://stackoverflow.com/questions/4054612/2d-vector-graphic-renderer-for-opengl – Fizz 2014-08-06 14:57:07

回答

6

让我扩展Greg的答案。

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

  • Qt widget;
  • 特别是,一个基于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启用裁剪。

2

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

我希望有帮助。

5

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

第25章绘制矢量图的GPU https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html

+1

链接被破坏(这实际上是一个仅链接的答案...) – chtz 2017-07-25 08:57:45

+0

无关紧要,它只是一个链接而已,它仍然有用。 – 2018-02-05 20:39:08

8

我看到大部分的答案是关于Qt不知何故,即使原来的问题没有提到它。这是我在孤独的OpenGL方面的答案(这也从时间的推移极大地受益,因为它不能已在2010年给出):

2011年以来,技术状态是马克·基尔加德的婴儿,NV_path_rendering ,目前它只是一个供应商(Nvidia)的扩展,你可能已经从它的名字中猜到了。还有一些对很多材料:

NV_path_rendering现在所使用的谷歌的场景,当可用的背后Skia的库。 (Nvidia在2013年底和2014年贡献了代码。)

您当然可以加载SVG等https://www.youtube.com/watch?v=bCrohG6PJQE。它们还支持路径的PostScript语法。你也可以混合路径与其他的OpenGL(3D)的东西呈现,作为全世界展示:

具有甚至更低(或彻头彻尾的无)新贵厂商的支持或学术浮华是NanoVG,这是目前开发和维护。 (https://github.com/memononen/nanovg)考虑到随着时间的推移,OpenGL上2D库的数量已经逐渐增加,你用一种不被主要供应商支持的东西大打赌,以我的愚见。