天天看點

14. Html5的局:WebGL的紋理格式緊接上文常見的紋理格式紋理的擴充格式總結下一回

webgl作為通用的标準,屏蔽了一些硬體廠商的進階特性,有舍就會有取,那麼在一些比較常用的功能上,如果硬體無法滿足通用,那麼就會通過cpu來彌補硬體的不足。

圖檔的紋理格式,就是其中的一個點。

14. Html5的局:WebGL的紋理格式緊接上文常見的紋理格式紋理的擴充格式總結下一回

這些在opengl平台都是支援的,但在webgl中做了裁剪。

14. Html5的局:WebGL的紋理格式緊接上文常見的紋理格式紋理的擴充格式總結下一回

這些格式在firefox中嚴格的不支援,但在webkit中,webkit雖然在代碼上支援了這些格式,最終是否支援,看各個平台的硬體特性了。

14. Html5的局:WebGL的紋理格式緊接上文常見的紋理格式紋理的擴充格式總結下一回

沒想到紋理還有浮點數格式。。

14. Html5的局:WebGL的紋理格式緊接上文常見的紋理格式紋理的擴充格式總結下一回

上圖列出的是主要支援的紋理格式和類型,其他類型也可能支援,最好不要使用。

在webgl的使用中,我們會經常使用以下三種紋理參數:

14. Html5的局:WebGL的紋理格式緊接上文常見的紋理格式紋理的擴充格式總結下一回

衆所周知,opengl的原點坐标在螢幕的左下角,x軸向右,y軸向上,z軸向外。

在os的世界中,坐标原點在螢幕左上角,x軸向右,y軸向下,z軸向外。

這樣導緻我們使用一張圖檔的時候,預設是從左上角為bitmap的起始點。這樣到了opengl的世界,就變成了上下颠倒的圖檔,本質就是y軸翻轉導緻。

為了提供opengl的性能,我們在cpu中提前把顔色的alpha乘以rgb,opengl在顯示時,無需每次實時技術rgb顔色通道,進一步提升gpu性能。

紋理像素的對齊參數,比如上圖中我們提到gl_rgb是3個位元組的長度,如果圖檔是3x3大小,那麼資料在記憶體中,以gl_unsigned_byte為機關存儲,大小為:9*9。

在opengles1.0的時代,紋理大小隻能是2的整數倍,這樣的圖檔在opengl中是無法識别的。就要做轉換:

gl_rgba:轉換後,每個像素成為4個位元組

gl_rgb:不轉換,圖檔的每行,我們增加一個byte。在增加一個空白行,成為10x10的圖檔

alignment:在opengl es2.0以後可以設定unpack_alignment,它表示像素對齊最小公因子,我們設定為1,告訴gpu隻要是1的整數倍即可。(這點會影響gpu的性能,因為gpu也像cpu一樣,喜歡位元組對齊的資料)

看完了webgl的紋理格式,就會發現,很多已經成熟的技術制作的3d模型,如果格式或者類型不比對,就會導緻webgl出現相容性問題,無法顯示圖檔,甚至會出現崩潰。

遇到問題的同學,請牢記以上資訊。

看完了這些,感覺很簡單的樣子。仔細看看:

unpack_flip_y_webgl

unpack_premultiply_alpha_webgl

是不是末尾都添加了webgl得标志?

對的,這些不是opengl的功能,是cpu幫忙我們實作的,如果同學們直接使用opengl開發,那麼就有可能在webgl上不相容。

另外,還記得上一節中我們提到的嗎:

internalformat和format到底存在什麼關系?如果他們真的必須保持一緻,那麼這個接口隻需要寫一個參數就好了,何必要預留兩個入參呢?難道程式員腦袋秀逗了?

想要弄清楚,請持續關注下一章,我們一起看看cpu是如何做格式轉換的。

繼續閱讀