記載目錄
1.雜言雜語
2.紋理格式與文件格式的區別
3.常見的紋理格式和應用場合及硬件的特定要求
常見的壓縮紋理格式
硬件需求
4.壓縮紋理特殊處理
RGBA16 + Dithering 處理
ETC1的通道剝離
ETC1的shader
5.圖片大對比
質量比
內存比
6.參考文檔
雜言雜語
上一篇文章寫了Texture的設置屬性,卻沒有寫紋理格式是因爲紋理格式這一內容不僅長而且還得爲下一篇紋理格式的自動化處理做一個鋪墊。總之就是要獨立出來吧!
當初在學習紋理格式的時候也把自己搞的暈頭轉向的,而且還是在項目時間很緊的情況下學習的;現在回過來來看,其實際正真有用的內容並不多;
這裏得吐槽一下百度,當時卻花了好長的時間才把這部分的內容學習完,現在回過頭來看,正真學習的時間並不長,而大部分時間卻都花在百度上了(沒法翻牆),百度真是浪費人時間的工具。
不說其它的了,進入正題。
紋理格式與文件格式的區別
獻上兩幅圖片先
明明是兩張一樣的圖片爲什麼大小差別卻那麼大?
原因得從jpg,png和RGBA32以及原生圖片紋理的區別說起。
爲了容易區分我們引用三個名詞:
紋理格式———->代表 原生圖片紋理
文件格式———->代表 jpg,png
壓縮紋理格式—–>代表 RGBA32,等等我們在Untiy中可以看到的紋理
其實上述名詞本身就已經說明了真相了,這裏在解釋多一點
紋理格式
這種格式是圖片原生的紋理,圖片有多大它就是多大 且 能夠被GPU直接處理過的
常見的紋理格式是:R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8文件格式
所有儲存在硬盤中的JPG,PNG等圖片,其實都是跟zip,rar一樣的東西來的。
zip,rar是什麼東西,就是壓縮包;而JPG,PNG也是圖片特有的壓縮包,是爲了便於傳輸和縮小佔用壓縮空間所誕生的圖片特有的壓縮方法
但是這種JPG,PNG等壓縮算法是不能夠被GPU識別的,必須得解壓縮以後才能夠被GPU識別(解壓縮後就是紋理格式了)壓縮紋理格式
這個理解起來比較蛋疼,因爲已經有壓縮格式和紋理格式了,爲什麼還要增加一個壓縮紋理格式。首先壓縮格式是不能夠被GPU直接識別的,在渲染前都得先要解壓縮成紋理格式後才能夠被GPU識別,在移動平臺上的遊戲解壓縮時間太長了,而且每個遊戲都會大量使用圖片,所以在移動平臺上使用壓縮格式的圖片是不被接受的。
其次紋理格式中 R5G6B5,A4R4G4B4,A1R5G5B5每個像素佔用2個字節,R8G8B8每個像素佔用3個字節,A8R8G8B8每個像素佔用 4個字節。也就是說對於一張512*512的紋理的話,R5G6B5格式的文件需要佔用512KB的容量,A8R8G8B8格式的文件需要佔用1MB的容量;如果是 1024*1024的紋理,則各需要2M和4M的容量,這對於動輒需要幾十、幾百張甚至更多紋理的遊戲,上G容量的遊戲在移動平臺上是不被接受的。
那麼有沒有其他辦法,既能表現豐富的色彩和細節,又能是最小失真的情況下,達到更小的紋理容量呢,還能夠GPU識別和讀取的紋理。這就是: 壓縮紋理格式
常見的壓縮紋理格式和應用場合及硬件的特定要求
常見的壓縮紋理格式
移動平臺上常用的壓縮紋理格式有 : RGBA32,RGBA16,ETC1,ETC2,PV4
RGBA32:32bits 帶alpha通道的真色彩,理解成原圖就對了,圖片質量最高檔
RGBA16:16bits 帶alpha通道的16級色彩,圖片質量中檔。需要進行抖動處理。
ETC1:4bits 不帶alpha通道的, 圖片質量最低。且使用於android機型
ETC2:etc1 + alpha 的版本,需要Open gl 3.0 支持
PVRTC4 :4bits 帶alpha通道,圖片質量最低。且使用於iphone機型
硬件需求
RGBA32和RGBA16的壓縮紋理格式是通用的,基本上所有的機型都支持這兩種壓縮紋理格式
ETC1是在android平臺上Open gl 2.0就被支持的壓縮紋理格式,基本上適用於所有android機型,但是Iphone不支持
ETC1 缺點是不支持Alpha通道.
ETC2 解決了ETC1不支持Alpha的缺點,但卻帶來新的問題----ETC2是基於Open gl 3.0 的;現如今按照android給出分佈圖使用Open gl 2.0 的機型還佔據市場總機型的37%
PVRTC4 在iOS設備支持,只有少數的android機型支持PVRTC4壓縮紋理格式,所以在android使用PVRTC4是不會被考慮的。
(來源於:https://developer.android.com/about/dashboards/index.html#Screens)
壓縮紋理特殊處理
由於章節太長,不便閱讀,已經移到下篇,點擊查看詳情:http://blog.csdn.net/biospc/article/details/78076833
圖片大對比
質量比
- RGBA不剝離通道對比
- ETC1 對比 RGBA16
- RGBA32 跟 RGB24通道剝離對比
內存比
- RGBA不剝離通道的內存比
- ETC1 跟 RGBA16 的內存比
RGBA32 跟 RGB24通道剝離的內存比
- 想法:看到圖片就可以看得出alpha只有一種顏色,那能不能用單色設置alpha通道圖片呢?
改進:把alpha通道改成ETC/PV4版
答案:可行,且圖片質量不會變化。上圖
- 想法:看到圖片就可以看得出alpha只有一種顏色,那能不能用單色設置alpha通道圖片呢?
參考文檔
Unity遊戲開發圖片紋理壓縮方案:http://www.jianshu.com/p/f7c3741f22af
Android開發官網:https://developer.android.com/about/dashboards/index.html#Screens
NGUI分離RGBA通道: http://blog.csdn.net/asd237241291/article/details/52611487
RGBA16抖動處理:http://www.cnblogs.com/zsb517/p/6322773.html