載入ETC1格式編碼的PVR壓縮檔案

2021-06-26 08:36:55 字數 926 閱讀 6752

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...