7

「反射シャドウ マップ」を使用して、ゲーム エンジンにグローバル イルミネーションを実装しています。RSM には色テクスチャがあります。メモリを節約します。24 ビット値を 8 ビット値にパックしています。Ok。私はそれを詰める方法を知っています。しかし、どうやって開梱するのですか?私は、255 色の 8 ビット パレットで 1D テクスチャを作成することを考えていました。私の8ビットカラーは、そのテクスチャのピクセルのインデックスになります。この種のテクスチャを生成する方法がわかりません。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;
4

2 に答える 2

8

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;

デコード中に、AND ゲート/演算子を使用して目的のビットを抽出し、先頭のビットを破棄します。緑の場合、右にシフトして右のビットを破棄する必要があります。

Math.floor のエンコードは小数部分を切り捨てるために使用されますが、四捨五入すると合計値が 255 を超えて 9 ビットの数値になります。

更新 1
色を 32 または 64 で割ると、正確な結果が得られません。

うーん

R/G = 3 ビット、最大値は 2 進数で 111、10 進数で 7 です。B = 2 ビット、最大値は 2 進数で 11、10 進数で 3 です。

R/G を 255/7 以上の値で割り、B を 255/3 以上の値で割ります。また、四捨五入するとより正確な結果が得られるため、Math.floor の代わりに Math.round を使用する必要があることにも注意してください。

于 2014-08-12T07:15:13.247 に答える
4

8 ビット [0 - 255] の値を 3 ビット [0, 7] に変換するには、0 は問題ありませんが、255 は 7 に変換する必要があるため、式は Red3 = Red8 * 7 / 255 になる必要があります。

24bitカラーを8bitカラーに変換するには、

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
于 2016-06-17T05:45:52.793 に答える