gpt4 book ai didi

colors - 将8位颜色转换为RGB值

转载 作者:行者123 更新时间:2023-12-02 07:03:28 25 4
gpt4 key购买 nike

我正在使用“反射阴影贴图”在我的游戏引擎中实现全局照明。 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.

@edit3:
好吧,我想我找到了一种方法来做到这一点。如果有错请告诉我。

@edit4 错了...

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

最佳答案

在 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 位数字。

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

RRRGGGBB

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

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

关于colors - 将8位颜色转换为RGB值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12338015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com