在OpenGL中呈现矢量图形?

15

有没有一种方法可以加载矢量图形文件,然后使用OpenGL进行渲染?由于我不太了解矢量图形格式,这是一个含糊的问题。我知道SVG。

将其转换为光栅图并不真正有用,因为我想对对象进行实时缩放。


您的显示器是光栅显示器,因此它最终会被转换为光栅图像,问题在于是否可以在较晚的阶段进行光栅化以使您想要做的事情更加便捷。OpenGL没有特定的文件格式支持(除了可能是编写在着色器语言中的代码),所以一切都取决于您愿意编写什么。 - Jay Kominek
1
基本上,这个问题与https://dev59.com/hlHTa4cB1Zd3GeqPSIEt相同。 - Fizz
5个回答

12

我看到大多数答案都涉及Qt,尽管原始问题没有提到。以下是我关于OpenGL的答案(随着时间的推移,这也极大地受益于技术的进步,因为在2010年无法给出这个答案):

自2011年以来,最先进的技术是Mark Kilgard的"NV_path_rendering",目前仅作为供应商(Nvidia)扩展存在,正如你从名称中已经猜到的那样。关于此技术有很多资料:

当可用时,Google的Skia库现在在后台使用NV_path_rendering。(Nvidia在2013年底和2014年贡献了代码。)

当然,您可以加载SVG或其他https://www.youtube.com/watch?v=bCrohG6PJQE。它们还支持路径的PostScript语法。您也可以将路径渲染与其他OpenGL(3D)效果混合使用,如以下演示:

一个新兴的、没有得到更少(甚至根本没有)供应商支持或学术光环的库是NanoVG,目前正在开发和维护。(https://github.com/memononen/nanovg)在我看来,如果选择不受主要供应商支持的内容,那么您会冒着很大的风险。


10

1
链接已经失效(而且这本质上是一个仅包含链接的回答...) - chtz
1
即使是链接回答,它仍然很有用。 - Alexandre Borela

6
让我详细说明一下Greg的答案。
Qt确实有一个SVG渲染器类,QSvgRenderer。此外,您在Qt中进行的任何绘图都可以在任何“QPaintDevice”上完成,我们对以下“paint devices”感兴趣:
- 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不能考虑所有这些差异(也无法)。因此,例如,如果您的用户拥有廉价的集成Intel视频卡,则他的视频卡不支持OpenGL抗锯齿,这意味着如果您直接将其呈现到QGLWidget中,则您的SVG也会看起来像锯齿状(有棱角)。通过QImage避免此类问题。
在实时缩放时,您也可以使用QImage方法。这只取决于您需要多快。您可能需要仔细优化,例如重复使用相同的QImage,并为您的QPainter启用剪辑。

2
Qt具有使用OpenGL功能直接渲染SVG图像的良好支持(请参阅QSvgRenderer的文档)。
希望这能帮到您。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接