如果做一個GIS渲染引擎,圖形API應當選擇OpenGL還是DirectX?

我對遊戲引擎的工作原理和渲染技術很感興趣,過去也僅僅停留在興趣的階段,現在我想做做這方面的事情,想實現一個gis渲染引擎,我想將從遊戲中學到的渲染技術應用到遊戲以外的領域。已經開始學習計算機圖形學和DirectX了,但後來發現幾本gis的書都是用的opengl,在wikipedia上查了查opengl和directx的比較,大致說來是現在directx和opengl的很多圖形api是重疊的,但在專業圖形領域(除遊戲領域以外的其他領域,像計算機輔助設計)幾乎都是採用的opengl,這似乎和opengl的支持的某些特性更適合這個領域有關。我現在如果說要著手開發這個gis渲染引擎,我應該選擇哪套圖形api呢?也許知友會說哪套圖形api不重要,重要的是掌握了原理,但我想從gis的性質來說,還有api的易用性來說,應該有個更合適的選擇。希望大家能給我一點兒指導,很希望能做好這個事情。


「OpenGL vs. DirectX」放到五年前是個蠢問題,但放到現在是個好問題。根源在於整個業界發現了以前忽略的問題:跨平台 APIs 並不是一個適合所有情景的方案。對於複雜度很高的場景,低層系統 APIs 跨平台反而不是一件好的事情。

第一、廠商之間的摩擦太多。

第二、開發者沒發從 APIs 中直接獲得好處——因為面對的問題和基於的 APIs 之間抽象差距太多,開發者仍然要寫很多中間層。從而稀釋了 APIs 本身跨平台的重要性。

蘋果最新推出的Metal圖形介面未來有沒有可能與微軟的DirectX抗衡? - 知乎

所以基於 committee 討論的所謂跨平台 grpahics APIs 前景不會很好。目前渲染方案的跨平台是在 Unreal 這種引擎層面。如果你真的想做一個有點用的引擎,引擎本身能支持多個 APIs 是個基本功能。


webgl就成,參見我的專欄

也歡迎來完善我的玩具


青年問禪師之是否應該學 Vulkan - 黑客與畫家 - 知乎專欄

opengl 已經過氣了?也不看看有多少公司依然在招 opengl 的程序員?


不請自來

  • 作為一個GIS專業,從事三維引擎研發,並且用過D3D9以及OpenGL,現在用WebGL,可以分享一點自己小小的心得,希望自己能拋個磚,後續能有更多的大牛出來分享經驗。自己目前主要從事三維球的研發工作,類似google earth。主要是因為自己比較喜歡圖形方面的東西,所以就開始自學了這方面的知識,當然目前還有很多需要提高的地方。
  • 好了,不說廢話,題主的問題是兩個api之間的選擇,我覺得根本沒必要糾結,你從其中任意一個開始都沒問題,當然GIS可能大部分都是用OpenGL作為底層渲染引擎,D3D9主要是遊戲開發用的比較多。不過,我居然遇到有個公司的三維平台完全用D3D9研發的,我接觸了大概三個月左右,也看了它的源碼,感覺產品也和其它的earth完全沒問題,而且有些特效甚至可以更好。但因為很少有GIS專業的學D3D,有的話,一般都選擇了遊戲公司。所以這家公司想升級架構和D3D11,一直無法實現,並且很多坑都沒法填(對了,這家公司好像買的源碼)。
  • 後面來到我現在的公司,這家公司準備完全基於OpenGL研發,不基於開源,現在很多earth都是基於開源(osg、osgearth、ogre)引擎。我感覺這是個很好的機會,讓我可以從最底層學習怎麼實現一個三維引擎,雖然我來的時候,以及完成一大半的了,最複雜的地形瓦片生成、DOM和DEM都基本完成,其實雖然是底層研發,但很多都會去借鑒開源,比如render模塊用的ogre,地形調度借鑒了osgearth等,算是把源碼當作好的東西拿過來,這叫站在巨人的肩膀上,所以得感謝開源。在整個研發過程中雖然沒有遊戲研發人員對圖形要求那麼高,但很多東西也是需要對圖形方面有一定的理解,比如地形的生成,其實基本都是GPU Gem那本書上的內容,包括大氣圈也是,基礎的紅寶書的內容那肯定要非常熟悉的。舉兩個近期解決的問題吧!
  • 貼地實現

這麼一個看似簡單的問題,前後用了三個星期,一開始想到的投影紋理,發現不行,投影的相機不好控制,後面改用陰影體的方式,算是實現了一個基本穩定的貼地效果,但後續還有模型貼地等等問題都需要謾慢解決。

  • google earth控制器的實現,模仿google earth的滑鼠操作,這個問題也花了2-3個星期,這個問題主要涉及到矩形變換方面的知識,尤其是google earth 的定點旋轉和縮放,花了很長時間去琢磨,可能自己開始對矩陣變換理解不深,所以進了很多坑,但解決這個問題後,讓我對矩陣變換有更深入的理解。
  • 舉這兩個例子其實就是想說,三維GIS方面的研發,可以很好的結合題主的興趣和知識,並且也幫助題主學習圖形方面的知識。樓上很多建議樓主搞WebGL,其實我這幾個月也是在開發公司的web版本的earth,現在web端也算是一個趨勢,可以去看下arcgis scene以及cesium,還有google earth。我們在研發的時候基本參照這幾個,也一直在研究cesium的源碼,cesium給我的感覺是圖形方面真的很專業,如果想從web開始,可以研究一下它的源碼,獲益匪淺。
  • 最後,給題主分享一個自己的學習過程:1,基礎知識學習,如果是OpenGL建議紅寶書,D3D建議龍書;2,從零開始寫一套自己的三維引擎,寫的過程中可以去借鑒大量的開源;3、一定要看《GPU Gems》以及《Fundamental of Graphic》。

目前我也是在2、3步,對沒錯,我也是個菜鳥,還在慢慢造輪子的過程中,所以各位大神有錯的地方還請指出,也千萬別見笑,寫的比較亂,後面再慢慢更新吧!隨著web端產品功能慢慢完善,直到上線,都可能會分享一些,也準備其中乾貨後期寫到博客上,下班咯!!!


你說,「幾乎都是採用的opengl,這似乎和opengl的支持的某些特性更適合這個領域有關。」

錯了,我發現很多程序員都從技術角度來評估的,其實很多時候公司的產品的選擇都是從商業角度來評估的。

採用opengl的原因是跨平台,為什麼要跨平台。跨平台是基於商業成本和利潤的考慮。

假如你是一個家商業GIS渲染引擎公司,你開發windows平台的產品是100萬,每年維護成本是50萬。那麼還有mac,android,ios平台。修改一個BUG的成本,需要到不同的版本內修改,需要高昂的成本。我就維護過一個加拿大公司的這樣一個產品,維護成本高昂到令人髮指。

如果使用opengl,可以發布到所有平台,發布到所有平台就意味著可能的利潤增加。簡單修改下就能在網頁平台WebGL和手機平台OpenGL ES上運行。後來在我主導下,那家加拿大公司把產品統一用C++和opengl進行重構,只需要一份代碼即維護所有平台的產品,維護成本大幅度下降,利潤也增加了。


不請自來。為題主推薦angle。gl like介面下面可以對接gl或者dx。


也可以考慮一下兩者都用,如果以後有跨平台需求的話(當然,單用 OpenGL 貌似也可以實現跨平台)。可以做一個 Graphics Abstraction Layer,為不同的圖形 API 封裝一套統一的介面。馮東大大曾在這個回答里提到了這種做法:Vulkan相比於OpenGL、DX12、Metal和Mantle有什麼優勢、劣勢? - 馮東的回答。

比如: @lbblscy 提到的 ANGLE 可以用於實現這個抽象層。

再比如,GitHub 上已經有 bgfx 這樣的庫:GitHub - bkaradzic/bgfx: Cross-platform,cankao 。cs API agnostic, "Bring Your Own Engine/Framework" style rendering library.。

本人對計算機圖形學所知甚少。思路僅供參考。


題主的話:「gis渲染引擎」,「我對遊戲引擎的工作原理和渲染技術很感興趣」

GIS軟體分桌面端、伺服器端、web、移動端,按照題主意思,我猜大概說的是3D GIS。我就來說說3D GIS引擎的一些事兒。

3D GIS,可以是表現小場景的GIS系統,也可以是基於數字地球為背景的系統。表現小場景的GIS,如ArcScene,以數字地球為背景的,如ArcGlobal、Google Earth、osgEarth、WorldWind、Skyline、Proland等。我猜題主可能想實現一個有數字地球的3D GIS引擎。

利益相關,自有3D GIS引擎開發。

有數字地球的3D GIS引擎,相比較遊戲引擎而言,從渲染角度來說,並不需要遊戲渲染引擎那麼強的渲染技術,例如可能不需要全局光照系統,不需要基於物理的渲染。如果要實現跨平台,windows、Linux上使用OpenGL、移動端使用OpenGL ES。如果要在Windows上實現多圖形API支持,那麼3D GIS引擎,就要抽象出圖形API無關的渲染層,引擎上層調用渲染層介面。可以以D3D9、D3D11或OpenGL為藍本來設計渲染層,如以D3D11為藍本設計渲染層,可參照D3D11的介面設計,對渲染設備、渲染狀態(光柵化狀態、深度模板緩衝狀態、混合狀態等)、紋理、光源、輸入布局、幀緩衝等進行抽象,分別用不同的圖形API進行實現。

3D GIS引擎,除了繪製本身,場景管理、資源調度、空間分析這些都需要花費相當的精力。以場景管理為例,GIS渲染對象,怎樣能夠做到巨量的GIS渲染對象的場景管理工作:場景裁剪、場景對象排序、為提高渲染效率剔除渲染對象策略;

以數字地球為背景管理GIS對象,以測繪坐標的角度應該是雙精度的(地理坐標系統、投影坐標系統),但傳到圖形API渲染管線的又是單精度的,相機觀察地球的位置是不確定的,所以世界空間的原點就不能設置為地球上的某一點,而應該是變化的,隨相機的位置變化而有策略的改變,以減小雙精度到單精度轉換時的精度損失;

資源調度問題,數字地球表面是要覆蓋衛星影像或者高清航片和數字高程模型的,這些數據一般以影像金字塔的形式進行組織,隨著相機位置的不同,而需要調度相應資源的加卸載。如果同時,地球表面要表現大量的房子、樹木、其他人造設施、設備,這就需要大量模型數據的載入、繪製,如果數量特別巨大,完全載入可能會超過物理內存、顯存限制,也需要相應的動態加卸載機制。

空間分析是GIS的根本,這裡面有大量的演算法,就不展開說了。

泛泛而談,比較亂,希望對題主有幫助。


Windows / Windows Phone -&> DirectX

Android -&> Vulkan

osx / ios -&> metal

Linux -&> go die

OpenGL已經過氣了


可以參考下Bender建模工具,功能很完善的開源軟體,非常優秀。人家也是跨平台的,用OpenGL妥妥的!http://www.blender.org


當然是OpenGL。底層的庫更新換代沒那麼快,Vulkan代替OpenGL成為主流估計還需要一段時間。


給你推薦本書《3D Engine Design For Virtual Globes》,全是虛擬地球,gis渲染系統比較基礎入門書籍了,就是沒中文,英文版也很好理解了。


只要MS還支持DX,那你windows平台產品線肯定優先必須要用DirectX。剩下的就是你的產品定位和目標平台以及自己的維護能力了。。。不過大家還是應該多支持非DX,為什麼?因為他太封閉,搞的我只能去翻vulkan的spec去理解MS給hardware vendor會怎麼給Dx的spec.這都是(敏感詞~~~滴)出來....


別忘了,OpenGL只是一個開放的標準,並沒有規定底層是如何實現的,完全可以使用DirectX去實現OpenGL!對的,俺就這樣干過!所以不要糾結嘍!


能否給我介紹一下


OpenGL有很多代碼可以參考,開發速度directx要快些,我在做一個類似gis的應用,用的是directx


無所謂啊

你先做一做試試再問不好嘛。。?


恰好做過一段時間GIS,GIS本身對圖形api要求不高。如果題主是初學,強烈推薦WebGL,並且可以參考cesium引擎來進行開發。當然如果題主排斥用HTML5,就聽輪子哥的吧_@vczh


考慮跨平台的話,現階段OpenGL ES是王道,看看angle這個項目。

The goal of ANGLE is to allow users of multiple operating systems to seamlessly run WebGL and other OpenGL ES content by translating OpenGL ES API calls to one of the hardware-supported APIs available for that platform. ANGLE currently provides translation from OpenGL ES 2.0 and 3.0 to desktop OpenGL, OpenGL ES, Direct3D 9, and Direct3D 11. Support for translation from OpenGL ES to Vulkan is underway, and future plans include compute shader support (ES 3.1) and MacOS support.

@vczh 微軟自己維護了一個專門針對Windows Store的分支。


推薦閱讀:

有哪些優秀的 C++ OpenGL 開源遊戲引擎?
為什麼 NVIDIA 的示例總是一條龍?

TAG:GIS地理信息系統 | OpenGL | 計算機圖形學 | DirectX |