Colors 将8位颜色转换为RGB值

Colors 将8位颜色转换为RGB值,colors,bit-manipulation,rgb,8-bit,Colors,Bit Manipulation,Rgb,8 Bit,我正在用“反射阴影贴图”在游戏引擎中实现全局照明。RSM具有i.a.颜色纹理。为了节省内存。我将24位值打包成8位值。好啊我知道怎么打包。但我如何打开它?我想用8位调色板创建一个1D纹理,有255种不同的颜色。我的8位颜色将是该纹理中像素的索引。 我不知道如何生成这种纹理。 有没有数学方法将8位值转换成rgb @编辑 颜色采用以下格式: RRR GGG BB @编辑2: 我把我的颜色包装成这样: int packed = (red / 32 << 5) + (green / 32 &

我正在用“反射阴影贴图”在游戏引擎中实现全局照明。RSM具有i.a.颜色纹理。为了节省内存。我将24位值打包成8位值。好啊我知道怎么打包。但我如何打开它?我想用8位调色板创建一个1D纹理,有255种不同的颜色。我的8位颜色将是该纹理中像素的索引。 我不知道如何生成这种纹理。 有没有数学方法将8位值转换成rgb

@编辑 颜色采用以下格式:
RRR GGG BB

@编辑2: 我把我的颜色包装成这样:

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

编码

encodedData = (Math.floor((red / 32)) << 5) + (Math.floor((green / 32)) << 2) + Math.floor((blue / 64));
解码时,我们使用AND门/运算符提取所需位并丢弃前导位。如果为绿色,则必须向右移位以丢弃右侧的位

编码Math.floor用于截断小数部分,如果四舍五入,将创建大于255的总值,使其成为9位数字

更新1
如果我们将颜色除以32或64,则无法提供准确的结果

RRRGGGBB

R/G=3位,二进制最大值为111,十进制最大值为7。 B=2位,二进制最大值为11,十进制最大值为3

我们应该将R/G除以等于或大于255/7的值,将B除以等于或大于255/3的值。
我们还应该注意,我们应该使用Math.floor来代替Math.round,因为舍入可以得到更精确的结果。

要将8位[0-255]值转换为3位[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 = (encodedData >> 5) * 32;
green = ((encodedData & 28) >> 2) * 32;
blue = (encodedData & 3) * 64;
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