我有一些來自舊電腦游戲的紋理。它們以簡單的行程編碼存盤在一個巨大的檔案中。我知道影像的寬度和高度,影像也有一些完全透明的部分。
一種紋理的結構如下:
-a color map:有 256 種顏色,每種顏色包含 4 個位元組。b,g,r 一個值和一個零值
-texel 資料:通常每個位元組對應于顏色圖中的一種顏色,但透明的 texel 資料使用一些運行長度編碼進行壓縮:
- 第一個值表示第一行以多少透明紋素開始
- 以下值指示有多少后續位元組對應于顏色圖中的紋素(位元組 5 表示您必須將接下來的 5 個位元組映射到顏色圖) 5 個位元組之后的值可能是另一個透明像素計數指示器,這將后跟另一個顏色像素數。
- 但如果值為 0xFE,則此行中沒有其他顏色的紋素。如果該行中的紋素少于影像寬度給定的紋素,則其余紋素是透明的。
- 如果值為 0xFF,則到達影像的末尾/最后一行。如果影像高度給出的行數較少,則其余的紋素是透明的。
例如,4x4 紋理可能如下所示:
02 01 99 FE (2個透明像素,顏色99,1個透明像素填充寬度)
?? 01 02 98 99 FE (1個透明像素,顏色98,顏色99,1個透明像素填充寬度)
?? 00 01 99 01 02 98 99 FE(99色,1個透明像素,98色,99色)
02 02 99 98 FF(2個透明像素,99色,98色)
所以我認為因為這是一個非常基本的壓縮,也許有人知道它是否被稱為特定名稱或什么?最重要的是,有沒有辦法將這個“壓縮”資料上傳到 openGL?我知道我必須為openGl中的資料指定一些編碼。
我已經撰寫了一個演算法來將此資料轉換為普通的 rgba 資料。但這需要比游戲實際指定的更多的圖形記憶體(每個影像的大約 30% 是透明的,可以改為運行長度編碼)。因此,如果游戲沒有將影像轉換為所有 rgba,我也想找到一種方法。
誰能給我一些幫助?
uj5u.com熱心網友回復:
這只是一個使用 RLE 編碼處理空白的調色板影像。沒有真正的名字。它就像 GIF 一樣,只是沒有那么好,但可能更容易解壓縮。
我已經撰寫了一個演算法來將此資料轉換為普通的 rgba 資料。
然后你就完成了。將其上傳到 OpenGL 紋理。
因此,如果游戲沒有將影像轉換為所有 rgba,我也想找到一種方法。
你不能。
雖然您可以通過使用兩個紋理或一個紋理和一個 UBO/SSBO 作為調色板在著色器中實作調色板,但您不能在著色器中實作游程編碼方案。
RLE 對資料存盤和批量解壓縮很好,但在隨機訪問時很糟糕。隨機訪問正是紋理的作業方式。沒有真正的方法可以將紋理坐標映射到包含相應紋素資料的記憶體地址。如果你不能這樣做,你就不能訪問紋素。
實際壓縮紋理格式的設計方式是,您可以直接從紋理坐標到包含該紋理的資料塊的確切記憶體地址。RLE 不是這樣的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/450088.html