天天看點

13. Html5的局:WebGL的模糊邊界緊接上文WebGL的标準的落地與否下回再見

webgl是一套跨平台的渲染技術,向上提供統一的标準api,向下屏蔽了硬體廠商的差異,最大化的降低opengl的移植成本,同時也失去了一些特色的進階gl功能。

先看看常用的紋理資料的變化。

就像javascript的e6标準不是所有浏覽器都支援一樣,webgl的很多标準在不同的平台不一定支援,比如texture的gl_bgr格式,在pc的webkit上是支援的,在移動端的webkit上就不一定支援,因為這一特性屬于opengl ,但不是opengl es2.0的标準。

檢視opengl的gl.h檔案,我們可以找到:

但在opengl es2.0的gl.h卻沒有這個屬性的定義,反而是在擴充檔案glext.h找到了不完整的定義:

不僅屬性名稱發生了變化,是否支援也成了硬體的可選條件。

bold 結論:

标準是擴平台的,硬體是有差異的,标準不一定會實作。

webgl隻是将opengl在不同硬體平台做了一套,基于opengl和opengl es2.0的統一的規範,opengl 與opengl es2.0在标準和用法上存在差異,而es2.0是gl的子集。那麼同一個api必然在某些場景下的用法,會存在差異。

比如,我們最常用的glteximage2d在opengl的定義為:

在gl中,internalformat和format參數可以不一緻;level可以是正整數;pixels可以為空;

但在opengl es2.0的規範中,api的定義可謂是完全相同:

可是真正使用起來,參數解釋就不同了,比如:在es2.0中,internalformat和format必須相同;level必須是0;pixels在某些平台為了安全不能為空。

bold 結論

因為gl是跨平台的标準,不可能隻采用es2.0的規範,每當遇到gl與es2.0的邊緣場景,事情就會變得複雜化,再加上不同的硬體的支援不完全一緻,這個時候,怎麼辦呢?

縱觀網絡的技術部落格,我們仍然以glteximage2d為例,關于internaformat與format參數是否一緻的情況,網上出現了兩種結論:

<a href="http://blog.csdn.net/csxiaoshui/article/details/27543615">http://blog.csdn.net/csxiaoshui/article/details/27543615</a>

提到:

<a href="https://msdn.microsoft.com/zh-cn/library/dn302435(v=vs.85).aspx">https://msdn.microsoft.com/zh-cn/library/dn302435(v=vs.85).aspx</a>

這其實是opengl與webgl的差異,也就是opengl的開發者轉到webgl開發,也是需要改變很多的,那麼各大浏覽器廠商在實作上,采用哪種說法呢?

對于internalformat與format,webkit是直接拿來使用,不做強制限制:

而firefox是嚴格的遵守webgl标準,做了嚴格的判斷:

總結:

webgl隻是h5領域的一個标準, 無法做到對opengles2.0完美的相容,甚至有些标準屬于web獨有的。熟悉webgl的标準對于前端開發是很有幫助的,同僚native與h5的代碼移植,技術挑戰很大。

webgl弱化了opengl與硬體的差異,形式上統一了gl在前端的用法。webgl的路上,既然有凸起,那麼一定有凹坑,webgl标準通過舍去一些進階特性達到統一的目的,那麼就會有彌補凹坑,把一些硬體不支援的特性補充完整。

下一回,我們談談如何使用cpu來彌補webgl的不足。

繼續閱讀