常用圖形渲染API簡介

語言: CN / TW / HK

theme: juejin

「這是我參與11月更文挑戰的第1天,活動詳情檢視:2021最後一次更文挑戰

目前比較常用的圖形渲染API有如下幾種:

  • Direct3D
  • OpenGL
  • Vulkan
  • Metal

下面會詳細的介紹各種API的特點

Direct3D

DirectX.png Direct3D(簡稱:D3D)是微軟公司在Microsoft Windows作業系統上所開發的一套3D繪圖程式設計介面,是DirectX的一部分,目前廣為各家顯示卡所支援。與OpenGL同為電腦繪圖軟體和電腦遊戲最常使用的兩套繪圖程式設計介面之一,目前只在Windows平臺上可用。

OpenGL(Open Graphics Library)

OpenGL_500px_June16.png OpenGL(開放圖形庫或者“開放式圖形庫”)是用於渲染2D、3D向量圖形的跨語言、跨平臺的應用程式程式設計介面(API)。這個介面由近350個不同的函式呼叫組成,用來從簡單的圖形位元繪製複雜的三維景象。OpenGL常用於CAD、虛擬實境、科學視覺化程式和電子遊戲開發。

OpenGL的高效實現(利用了圖形加速硬體)存在於Windows,部分UNIX平臺和Mac OS。這些實現一般由顯示裝置廠商提供,而且非常依賴於該廠商提供的硬體。

OpenGL規範由1992年成立的OpenGL架構評審委員會(ARB)維護。ARB由一些對建立一個統一的、普遍可用的API特別感興趣的公司組成。根據OpenGL官方網站,2002年6月的ARB投票成員包括3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland、Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI和Sun Microsystems,Microsoft曾是創立成員之一,但已於2003年3月退出。

OpenGL ES(OpenGL for Embedded Systems)

OpenGL-ES_500px_Nov19.png OpenGL ES是 OpenGL 三維圖形 API 的子集,針對手機、PDA和遊戲主機等嵌入式裝置而設計。現在主要有兩個版本,OpenGLES1.x提供固定管道渲染,OpenGLES2.x及以上提供可程式設計管道渲染。目前的手機大多支援OpenGLES2.0及其以上版本。OpenGL ES相對OpenGL刪減了一切低效能的操作方式,有高效能的決不留低效能的,即只求效能不求相容性。

OpenGL- ES 是免授權費的,跨平臺的,功能完善的2D和3D圖形應用程式介面API,主要針對多種嵌入式系統專門設計 - 包括控制檯、行動電話、手持裝置、家電裝置和汽車。它由精心定義的桌面OpenGL子集組成,創造了軟體與圖形加速間靈活強大的底層互動介面。OpenGL ES 包含浮點運算和定點運算系統描述以及 EGL針對便攜裝置的本地視窗系統規範。OpenGL ES 1.X 面向功能固定的硬體所設計並提供加速支援、圖形質量及效能標準。OpenGL ES 2.X 則提供包括遮蓋器技術在內的全可程式設計3D圖形演算法。OpenGL ES-SC 專為有高安全性需求的特殊市場精心打造。

WebGL(Web Graphics Library)

WebGL_500px_June16.png WebGL(全寫Web Graphics Library)是一種3D繪圖協議,這種繪圖技術標準允許把JavaScript和OpenGL ES 2.0結合在一起,通過增加OpenGL ES 2.0的一個JavaScript繫結,WebGL可以為HTML5 Canvas提供硬體3D加速渲染,這樣Web開發人員就可以藉助系統顯示卡來在瀏覽器裡更流暢地展示3D場景和模型了,還能建立複雜的導航和資料視覺化。顯然,WebGL技術標準免去了開發網頁專用渲染外掛的麻煩,可被用於建立具有複雜3D結構的網站頁面,甚至可以用來設計3D網頁遊戲等等。

WebGL 是以 OpenGL ES 2.0 為藍本設計的,而不是純的OpenGL ES。WebGL通過 HTML5 的 Canvas 來和 DOM 打交道。因此也和 OpenGL ES 2.0 一樣,使用 GLSL 作為 Shading Language (一種 C-Like 頂點計算和著色的語言,快取編譯到 GPU,由 GPU 來執行)。WebGL 2.0基於OpenGL ES 3.0,確保了提供許多選擇性的WebGL 1.0擴充套件,並引入新的API。

WebGL、OpenGL和OpenGL ES三者的關係

通過上述分析,可以得出如下關係:

17806975-8fb75da2f4541d73.png

Vulkan

Vulkan_500px_Dec16.png

Vulkan是一個跨平臺的2D和3D繪圖應用程式介面(API),最早由科納斯組織(Khronos Group) 在2015年遊戲開發者大會(GDC)上發表。

科納斯最先把VulkanAPI稱為“下一代OpenGL行動”(next generation OpenGL initiative)或“glNext”,但在正式宣佈Vulkan之後這些名字就沒有再使用了。就像OpenGL,Vulkan針對實時3D程式(如電子遊戲)設計,Vulkan並計劃提供高效能和低CPU管理負擔(overhead),這也是Direct3D12和AMD的Mantle的目標。Vulkan相容Mantle的一個分支,並使用了Mantle的一些元件。

Vulkan旨在提供更低的CPU開銷與更直接的GPU控制,其理念大致與Direct3D 12和Mantle類似。Vulkan不再使用OpenGL的狀態機設計,內部也不儲存全域性狀態變數。顯示資源全然由應用層負責管理。包括記憶體管理、執行緒管理、多執行緒繪製命令產生、渲染佇列提交等。應用程式能夠充分利用CPU的多核多執行緒的計算資源,降低CPU等待,降低延遲。帶來的問題是。執行緒間的同步問題也由應用程式負責,從而對開發人員的要求也更高。

Metal

Metal.jpeg

在 WWDC 2014 上,Apple為遊戲開發者推出了新的平臺技術 Metal,該技術能夠為 3D 影象提高 10 倍的渲染效能,並支援大家熟悉的遊戲引擎及公司。

Metal 是一項全新的技術,專為開發高臨場感主機遊戲的開發者打造,可讓開發者全力發揮 A7 和 A8 晶片的效能。該技術經過優化,使處理器和圖形處理器能夠協同工作來實現最優效能。它專為多執行緒而設計,並提供各種出色工具將所有素材整合在Xcode中。

總結

常用的一些渲染引擎,比如Unity、Cocos2d-x、OpenSceneGraph、Skia等都是基於上述圖形API來實現的。圖形渲染說到底最後都是通過操作GPU來實現,只是不同平臺有相對應的圖形渲染庫而已,OpenGL則可以說是跨平臺之王。

下圖表格是常用圖形渲染API的比較:

圖形API總結.png