Преобразование 8-битного цвета в значение RGB

Я использую глобальное освещение в своем игровом движке с "отражающими картами теней". RSM имеет i.a. цветная текстура. Чтобы сохранить память. Я упаковываю 24-битное значение в 8-битное значение. ОК. Я знаю, как его упаковать. Но как его распаковать? У меня возникла идея создать 1D-текстуру с 8-битной палитрой с 255 различными цветами. Мой 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 byte.

@Edit3:
Хорошо, я нашел способ сделать это, я думаю. Скажите мне, если это неправильно.

@edit4 Неправильно...

int r = (packed >> 5) * 32;    
int g = ((packed >> 2) << 3) * 32;    
int b = (packed << 6) * 64;
5
задан Piotr Joniec 09 сент. '12 в 12:37
источник поделиться
2 ответов

В 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 Gate/Operator для извлечения желаемых бит и отбрасываем ведущие биты. С зеленым мы должны были бы сдвинуться вправо, чтобы отбросить биты справа.

В то время как кодирование Math.floor используется для усечения десятичной части, если округлено, это создало бы общее значение больше 255, делая его 9-битным числом.

ОБНОВЛЕНИЕ 1
Он не дает точных результатов, если мы разделим цвет на 32 или 64.

RRRGGGBB

R/G = 3bit, максимальное значение равно 111 в двоичном формате, которое равно 7 в десятичном значении. B = 2 бит, максимальное значение равно 11 в двоичном формате, которое равно 3 в десятичной форме.

Мы должны разделить R/G на значение, равное или большее 255/7, а B - на значение, равное или превышающее 255/3. Следует также отметить, что вместо Math.floor мы должны использовать Math.round, потому что округление дает более точные результаты.

4
ответ дан Jai 12 авг. '14 в 10:15
источник поделиться

Чтобы преобразовать значение 8 бит [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
1
ответ дан Mingjie Li 17 июня '16 в 8:45
источник поделиться

Другие вопросы по меткам