2010-11-09 422 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庫的數量已經逐漸增加,你用一種不被主要供應商支持的東西大打賭,以我的愚見。