2012-09-09 322 views
4

我正在使用「反射陰影貼圖」在我的遊戲引擎中實現全局照明。 RSM有i.a.顏色紋理。爲了節省內存。我將24位值打包成8位值。好。我知道如何打包它。但是,我如何解開它?我有想法用8位調色板創建一維紋理,有255種不同的顏色。我的8位顏色將是該紋理中像素的索引。 我不知道如何生成這種紋理。 有沒有任何數學方法將8位值轉換爲rgb?將8位顏色轉換爲RGB值

@edit 顏色的格式如下:
RRR GGG BB

@ EDIT2: 而我的包裝我的顏色像這樣:

int packed = (red/32 << 5) + (green/32 << 2) + (blue/64); 
//the int is actually a byte, c# compiler is bitching if it's byte. 

@ EDIT3:
好的,我找到了一種方法來做到這一點,我認爲。告訴我,如果它是錯誤的。

@ edit4這是錯誤的...

int r = (packed >> 5) * 32;  
int g = ((packed >> 2) << 3) * 32;  
int b = (packed << 6) * 64; 

回答

3

在javascript中

編碼

encodedData = (Math.floor((red/32)) << 5) + (Math.floor((green/32)) << 2) + Math.floor((blue/64)); 

解碼

red = (encodedData >> 5) * 32; 
green = ((encodedData & 28) >> 2) * 32; 
blue = (encodedData & 3) * 64; 

解碼時,我們使用的是與門/操作員來提取所需位並丟棄前導位。隨着綠色,我們將不得不右移丟棄右邊的位。

雖然編碼Math.floor用於截斷小數部分,但如果四捨五入,則會產生大於255的總值,使其成爲9位數字。

UPDATE 1
如果我們通過32或64

RRRGGGBB劃分顏色

R/G = 3位,最大值它不提供準確的結果是二進制也就是7在111小數。 B = 2位,二進制中最大值爲11,十進制爲3。

我們應該用等於或大於255/7的值和等於或大於255/3的值來區分R/G。 我們還應該注意,代替Math.floor,我們應該使用Math.round,因爲舍入可以提供更準確的結果。

0

要將8bit [0 - 255]值轉換爲3bit [0,7],0不是問題,但記住255應該轉換爲7,因此公式應該是Red3 = Red8 * 7/255。

24位顏色轉換成8位,

8bit Color = (Red * 7/255) << 5 + (Green * 7/255) << 2 + (Blue * 3/255) 

要反轉,

Red = (Color >> 5) * 255/7 
Green = ((Color >> 2) & 0x07) * 255/7 
Blue = (Color & 0x03) * 255/3