etc是紋理壓縮演算法,pkm是紋理打包格式。pkm裡面放的是往往是etc壓縮的紋理。
1. 標頭檔案:
(1) etc1的檔案頭大小為16:
(2)將etc1紋理存成pkm檔案時,加上這個檔案頭,便於讀取時獲知大小、格式,上傳壓縮紋理時把這個頭去掉。
(3) 檔案頭內容為:特徵符——編碼寬——編碼高——實際寬——實際高
(4) 儘管etc1
是固定的壓縮比,但考慮到畫素不對齊的情況,實際寬和實際高還是有必要儲存的。
2. 編碼構成:
(1)jpeg壓縮標準是把影象劃分為一系列8x8的畫素塊,然後每個畫素塊壓縮成變長編碼的。etc1
則是4x4的畫素塊壓縮成固 定的64位編碼(8位元組),由於固定,才有利於gpu內部實現並行解壓縮。因此,不考慮畫素非4對齊的情況,它的壓縮比 是固定的48/8=6,至於常用的把argb分別儲存為兩張etc1紋理的做法,壓縮比是64/16=4。
(1024*1024)/16 * 8 = 524288
3. 編碼過程:
(1) 將影象劃分為一系列 4x4 的子塊。
(2) 對每個子塊,嘗試所有的編碼可能性,取解碼後和原block畫素差值和最小的一種編碼。
(3) 是否flip,這個決定subblock如何劃分。
(4) 每個subblock用哪一行差值表。
(5) 每個畫素取哪一列的差值
注:決定好flip之後,顏色均值和是否能用diff方式已經確定,這個不用遍歷。
(6) 合併所有子塊編碼。
不難看出,編碼過程需要遍歷所有可能性,其複雜度遠大於解碼,每乙個 rgb 畫素變成了乙個精度較低的rgb均值和乙個2位差值號,因此產生壓縮。這種**式表述自然本身就存在偏差,壓縮損失亦來自於此。
ETC1壓縮紋理格式詳解
本來以為,etc1作為android 裝置的opengl標準,開源且最常用的的一種壓縮紋理格式,總會有人去翻譯一下khronos的文件,讀一下 給大家作個普及的,不料就是搜不到。沒辦法,儘管英文不好,還是硬啃了下文件,把 etc1壓縮紋理的實現原理弄清楚了。至於什麼是壓縮紋理,如何使用,可以參考 檔...
載入ETC1格式編碼的PVR壓縮檔案
1.通過pvrtextool將需要壓縮的轉換為etc1格式編碼的pvr檔案 2.解析pvr檔案,官網有pvr檔案的說明文件,pvr檔案由header format metadata format texture data三部分組成。如果是v3版本,可這樣定義pvr檔案頭部格式,記得指定位元組對齊的方...
1 安卓原始碼中編譯C程式
定義當前模組的相對路徑 local path call my dir 清除當前的環境變數 include clear vars 編譯該模組需要的原始檔 local src files call all subdir c files 變數設定標頭檔案的include目錄列表 local c inclu...