Преобразование 8-битного цвета в значение RGB
Я реализую глобальное освещение в своем игровом движке с помощью "отражающих теневых карт". RSM имеет цветную текстуру. Для экономии памяти. Я упаковываю 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's byte.
@ Edit3:
Хорошо, я нашел способ сделать это, я думаю. Скажи мне, если это не так.
@ edit4 Это неправильно...
int r = (packed >> 5) * 32;
int g = ((packed >> 2) << 3) * 32;
int b = (packed << 6) * 64;
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 = 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 = (Color >> 5) * 255 / 7
Green = ((Color >> 2) & 0x07) * 255 / 7
Blue = (Color & 0x03) * 255 / 3