![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как преобразовать 8-битеый цвет в 4-байтный TColor? [D7, WinXP]
andreil © (2008-04-24 12:57:00)на входе - байт, представляющий собой цвет в системе RGB (по два байта на цвет + 2 свободно(наверное)).
Вопрос: как собственно преобразовать такой цвет в нормальный TColor?
Пробовал преобразовывать байт в строку бинарного вида, а затем из битов составлял HEX-строку, представляющую собой строковое отображение цвета TColor. Проблема в том, что данная методика не помогает, цвета искажаются :(
andreil (2008-04-26 13:18:00) [1]
> МистерТ
Сами по себе эти исходники неполны, но таблицу преобразований вместе с ее загрузкой я выкопал. Текстуры грузятся на ОК, но местами вс-таки имеются нарушения цветопередачи, но это - недостатки таблицы, придется исправлять вручную :(
А так - тема закрыта.
andreil (2008-04-25 18:42:00) [2]
> МистерТ
Спасибо за помощь! А то уже до рендера дошел, а вот с текстурами голяк :)
МистерТ (2008-04-25 09:26:00) [3]Ты уверен, что цвет идет без палитры ?
Что мешает использовать палитру основного изображения для мип-уровней ?
> Я вообщето уже третий день мучаюсь, такчто проблему изучить
> успел ;)
Что-то долго...
За 10 минут гуглом были найдены исходники всех трех квак (можно было и сразу на сайт ID зайти, но это не спортивно) и конверсия второй кваки на делфи.
Смотрю исходники и вижу:
1) в файле gl_image.pas
d_8to24table: array[0..256 - 1] of Cardinal;- массив из 256 элементов для перевода 8-битных значений в 24-битные.
2) в файле gl_draw.pas
procedure Draw_Fill(x, y, w, h, c: Integer);
type
Tcolor = record
case boolean of
true: (c: Cardinal);
false: (v: array[0..3] of Byte);
end;
var
color: Tcolor;
begin
if (Cardinal(c) > 255) then
ri.Sys_Error(ERR_FATAL, 'Draw_Fill: bad color');
qglDisable(GL_TEXTURE_2D);
color.c := d_8to24table[c];
...
3) в том же файле
qglTexImage2D( GL_TEXTURE_2D,
0,
GL_COLOR_INDEX8_EXT,
256, 256,
0,
GL_COLOR_INDEX,
GL_UNSIGNED_BYTE,
image8 );
и что-то мне смутно подсказывает, что этот самый GL_COLOR_INDEX8_EXT - это 8-битная индексация.
Если что - http://sourceforge.net/project/showfiles.php?group_id=55303
конверсия Q2 на делфи, если не находил - посмотри как там реализована загрузка мип-уровней.
andreil (2008-04-24 20:07:00) [4]
> Не знаю как в Q1, но чаще всего 8-битные картинки имеют
> совершенно другой формат:
Я вообщето уже третий день мучаюсь, такчто проблему изучить успел ;)
Мной было замечено, что в текстурах Ку1 кроме основной текстуры хранятся еще и мипмапы.
А цвет там идет так, как я говорил, те без палитры, это просто необходимо преобразовать в БМП, тк ОпенГл не понимает (вроде как) голый массив пикселей.
han_malign (2008-04-24 15:06:00) [5]
> тк нарушены цвета
> Смещения проверь сам , мне влом.
а правильнее всего, и по скорости, и по гибкости
const palette6bit = array[0..63] of TColor = (0, ...);
МистерТ (2008-04-24 15:00:00) [6]Не знаю как в Q1, но чаще всего 8-битные картинки имеют совершенно другой формат:
Имеется палитра (таблица цветов) вида
индекс : цвет в формате RGB (или ARGB, или RGBA)
обычно содержится в заголовке файла или отдельным файлом если несколько имеют одинаковую палитру.
А далее массив из 8-битных индексов по которым в палитре и находится конкретный цвет.
andreil (2008-04-24 13:57:00) [7]Сделал так:
for i:=tmp.miptex_t.width-1 downto 0 do
for n:=tmp.miptex_t.height-1 downto 0 do
begin
R := tmp.buf[i+n*tmp.miptex_t.Width] and 3;
G := tmp.buf[i+n*tmp.miptex_t.Width] and (3 shl 2);
B := tmp.buf[i+n*tmp.miptex_t.Width] and (3 shl 4);
r:=r*$55;
g:=g*$55;
b:=b*$55;
Color := (B shl 16) or (G shl 8) or R;
tmp.Mip1.Pixels[i,n]:=color;
end;
Итог можете найти по ссылке: http://www.rapidshare.ru/656679
lava1.bmp - то, что должно быть (полученно стонней программой Wally)
lava1.mip1.bmp - то, что получилось с приведенным выше алгоритмом
lava1.mip - текстура в вормате Ку1, которую и пытаюсь прочитать :)
Получается более-менее читаемая картинка, но все-равно, не то, тк нарушены цвета (хоть и не так сильно).
Юрий Иванов (2008-04-24 13:39:00) [8]В [1] похоже все правильно, кроме того, что цвета надо масштабировать. В двухбитном цвете только 4 градации. В восьмибитном цвете надо чтобы из $3 получился $FF, а из $0 - $00
Восхищенный (2008-04-24 13:30:00) [9]> tesseract © (24.04.08 13:12) [2]
Там всего один байт. См. сабж.
> andreil © (24.04.08 13:24) [3]
Значит, вот это неверно: по два битана цвет + 2 свободно (или ты что-то другое имел в виду?)
andreil (2008-04-24 13:24:00) [10]
> Смещения проверь сам, мне влом.
Красный - норм, а вот зеленый и синий не в порядке. А так - преобразует, но тоже с нарушением цвета :(
tesseract (2008-04-24 13:12:00) [11]Насколько я помню там первый байт - прозрачность, а все остальный и есть ,байты RGB.
Восхищенный (2008-04-24 13:10:00) [12]Если все так, как ты сказал ( в чем есть сомнения), то:
R := ColorByte and 3;
G := ColorByte and (3 shl 2);
B := ColorByte and (3 shl 4);
Color := (B shl 16) or (G shl 8) or R;
Смещения проверь сам, мне влом.