1. 通過pvrtextool將需要壓縮的轉換為etc1格式編碼的pvr檔案
2. 解析pvr檔案,官網有pvr檔案的說明文件,pvr檔案由header format、metadata format、texture data三部分組成。
如果是v3版本,可這樣定義pvr檔案頭部格式,記得指定位元組對齊的方式,不然在計算紋理資料偏移的時候容易出錯(唉,我就掉進這個坑里了的)
typedef unsigned int uint32;
typedef unsigned long long uint64;
#pragma pack(push,1)
typedef struct _st_pvr_head_v3 st_pvr_head_v3;
#pragma pack(pop)
3. 讀取pvr檔案內容,獲取壓縮紋理的寬、高、紋理資料長度及紋理資料(texture data)起始位址。
由於自己程式中的壓縮紋理中mipmapcount的值都為1,因此解析過程就簡單得多了。
(1) 寬和高直接從檔案頭中的相應字段讀取
(2) 紋理資料長度 = 檔案總長度 - sizeof(st_pvr_head_v3) - sizeof(metadata), 其中metadata的長度也就是u32metadatasize這個欄位的值。
4. 通過使用glcompressedteximage2d()函式載入壓縮紋理,填充各欄位。
其中internalformat格式是:gl_etc1_rgb8_oes , 如下:
glcompressedteximage2d(gl_texture_2d, 0, gl_etc1_rgb8_oes, texture->width,
texture->height, 0, imgsize, imgdata);
ETC1壓縮紋理格式詳解
本來以為,etc1作為android 裝置的opengl標準,開源且最常用的的一種壓縮紋理格式,總會有人去翻譯一下khronos的文件,讀一下 給大家作個普及的,不料就是搜不到。沒辦法,儘管英文不好,還是硬啃了下文件,把 etc1壓縮紋理的實現原理弄清楚了。至於什麼是壓縮紋理,如何使用,可以參考 檔...
1 格式輸出
格式說明由 和格式字元組成,如 d f等。它的作用是將輸出的資料轉換為指定的格式輸出。格式說明總是由 字元開始的。不同型別的資料用不同的格式字元。格式字元有d,o,x,u,c,s,f,e,g等。如 d整型輸出,ld長整型輸出,o以八進位制數形式輸出整數,x以十六進製制數形式輸出整數,u以十進位制數輸...
c入門 1 格式
1!常量 d 稱為格式符 輸出有符號十進位制數 printf d d n 100,40 100 40 printf d d n 0144,040 100 32 printf d d n 0144,040 結果為d 32 printf d d n 0174,20 124 20 printf d d n...