WebGL 和 OpenGL ES 有什麼區別?

除去運行環境不同,二者各有什麼優點、限制?


其實我對OpenGL ES沒有接觸。所以只能粗淺作答。

OpenGL ES最初是作為OpenGL的一個subset支持移動設備和嵌入式設備開發。就我猜想,可能最初兩者的兼容性和可移植性是一個目標,但是在發展過程中沒有作為一個優先考慮。所以OpenGL ES在API設計上丟掉了OpenGL的兼容性包袱,更清晰簡潔。而且功能的完整性不斷向OpenGL靠近。

我個人認為在OpenGL領域Apple一直是領跑者。但是由於近來對iOS的傾斜,所以iOS的對最新OpenGL ES標準的支持好於OS X對最新OpenGL標準的支持。以致在iOS上開發的效率可能更高。但我沒有實際的比較。

但是,因為二者沒有什麼直接競爭的領域,所以這種比較意義不大。目標平台才是選擇哪個API的充分條件。

關於WebGL,它的『基於』OpenGL ES我猜想是指API設計更靠近OpenGL ES的規範,而非實現基於OpenGL ES。WebGL實現應該和所在平台相關,在OS X上應該是OpenGL,在iOS上應該是OpenGL ES,而在Windows上,理論上甚至可以是基於DirectX實現的。


我認為最主要的區別還是在於運行環境和面向的語言上。OpenGL ES主要直接提供C api,各自平台根據習慣提供一層包裝(比如Android提供了Java的包裝,iOS提供了obj-c的包裝)。而WebGL,雖然我沒有接觸,但我認為直接提供javascript api的可能性應該是最大的吧,而面向native code(C/C++)提供介面的可能性我認為不大,面向.NET/Java這類託管/VM環境下運行語言的需求我覺得也不是非常緊迫。

WebGL 「基於」OpenGL ES 我的理解是函數命名、常量命名、常見的流程上應該和Open GL ES比較一致,也就是標準的制定上和OpenGL ES一致,而非其實現上基於OpenGL。事實上,OpenGL ES在PC各操作系統下的實現(官方提供了emulator sdk)依然是轉換到OpenGL 1.x/2.0標準下執行。不過 我認為WebGL的實現基於DirectX的可能性依然不大,更可能的是和OpenGL ES一致,通過OpenGL 1.x/2.0的介面實現。

補充一下,WebGL在IE核瀏覽器下的實現應該是基於(或相關於)ANGEL項目,這是一套底層基於DirectX,而對外公開OpenGL介面的庫。


WebGL 是基於 OpenGL ES 2.0 的 Javascript API。通過 HTML5 的 Canvas 來和 DOM 打交道。

因此也和 OpenGL ES 2.0 一樣,使用 GLSL 作為 Shading Language (一種 C-Like 頂點計算和著色的語言,緩存編譯到 GPU,由 GPU 來執行)。

因此對於 OpenGL ES 2.0 熟悉的程序員,掌握 WebGL 是完全沒有什麼障礙的;反過來,如果僅僅是 Web 前端技術熟悉的話,那麼至少要補上 OpenGL 和 GLSL 這兩課。


以下是具體技術細節的區別:

1) Buffer Object Binding

2) No Client Side Arrays

3) Buffer Offset and Stride Requirements

4) Enabled Vertex Attributes and Range Checking

5) Framebuffer Object Attachments

6) Pixel Storage Parameters

7) Reading Pixels Outside the Framebuffer

8) Stencil Separate Mask and Reference Value

9) Vertex Attribute Data Stride

10) Viewport Depth Range

11) Blending With Constant Color

12) Fixed point support

13) GLSL Constructs

14) Extension Queries

15) Implementation Color Read Format and Type

16) Compressed Texture Support

17) Maximum GLSL Identifier Name Limit

18) Characters Outside the GLSL Source Character Set

19) String Length Queries

針對感興趣的部分可以做深入了解。另外,估計隨著WebGL慢慢成熟,二者標準將逐漸趨於統一,對於跨平台的開發者可以獲得很大的便利,但這個過程會非常漫長。


最近也在研究,找到一個比較輕的解釋,參考文章:http://web.eecs.umich.edu/~sugih/courses/eecs487/common/notes/APITables.xml

opengl es是opengl的一個子集(但也有交叉不相等的地方),opengl是一系列的3d圖形API,而opengl es是實現在一些嵌入式系統主要是手機(安卓、蘋果)和瀏覽器的opengl標準。

在安卓里是用java實現的對c-api的封裝,蘋果里是objective-c實現的,而webgl就是javascript實現的opengl es

另外opengl還分1/2,opengl es海風1/2,所以細微的差別就不列舉了,(其實是不太懂。。。)


推薦閱讀:

WebGL 是否需要以 OpenGL 為學習基礎?
OpenGL ES 和 Unity3D 是什麼關係?
openGL與界面兼容?
為什麼ShaderToy選擇了GLSL?
計算機圖形學中,面的最小基本單位為什麼一般是三角形?

TAG:OpenGL | WebGL | OpenGLES |