программная эмуляция наложения с использованием альфа канала
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



программная эмуляция наложения с... Expand / Collapse
Автор
Сообщение
22.05.2006 20:15


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 14.05.2008 23:42
Сообщ.: 121, Visits: 2 333
Привет.

Делаю программное альфа наложение в DDRAW1 (аппаратное недоступно). Пытаюсь оптимизировать алгоритм наложения двух изображений глубиной 32 бита (24-битный цвет, 4 байт - альфа канал).

Вроде бы с изначально заготовленной таблицей значений цветов:
BYTE Tab[256][256][256];//what a huge table!
for(int a=0; a<256; ++a)
  for(int d=0; d<256; ++d)
    for(int s=0; s<256; ++s)
      Tab[a][d][s] = (BYTE)(s*a/255.+d*(255-a)/255.);
работает быстрее, чем с реальным просчетом:
DestCol = DestCol*Alpha/255 + SourceCol*(255-Alpha)/255
Формулу, конечно, можно оптимизировать:
DestCol = (DestCol*Alpha + SourceCol*(~Alpha))/255,
но, все равно, считать дольше, чем адресовать цвет из таблицы.

Вроде бы оптимизировал адресацию с помощью ассемблерных вставок. Но работает не намного быстрее C++-эквивалента.
Куда еще больше оптимизировать, незнаю. Может быть кто-то делал такое, или, может быть, не стоит пытаться - все равно тормоза жесткие будут?

Сообщ. #897300
22.05.2006 21:26


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 14.05.2008 23:42
Сообщ.: 121, Visits: 2 333
точнее, даже так
DestCol = (DestCol*Alpha + SourceCol*((BYTE)~Alpha))>>8

тормозит :(

Сообщ. #897304
28.08.2006 13:45
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 28.08.2006 19:27
Сообщ.: 8, Visits: 12
John Paramol (22.05.2006)
Привет.

Делаю программное альфа наложение в DDRAW1 (аппаратное недоступно). Пытаюсь оптимизировать алгоритм наложения двух изображений глубиной 32 бита (24-битный цвет, 4 байт - альфа канал).

Вроде бы с изначально заготовленной таблицей значений цветов:
BYTE Tab[256][256][256];//what a huge table!
for(int a=0; a<256; ++a)
for(int d=0; d<256; ++d)
for(int s=0; s<256; ++s)
Tab[a][d][s] = (BYTE)(s*a/255.+d*(255-a)/255.);
работает быстрее, чем с реальным просчетом:
DestCol = DestCol*Alpha/255 + SourceCol*(255-Alpha)/255
Формулу, конечно, можно оптимизировать:
DestCol = (DestCol*Alpha + SourceCol*(~Alpha))/255,
но, все равно, считать дольше, чем адресовать цвет из таблицы.

Вроде бы оптимизировал адресацию с помощью ассемблерных вставок. Но работает не намного быстрее C++-эквивалента.
Куда еще больше оптимизировать, незнаю. Может быть кто-то делал такое, или, может быть, не стоит пытаться - все равно тормоза жесткие будут?



Офигеть...
Сообщ. #903431
31.08.2006 20:28


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 14.05.2008 23:42
Сообщ.: 121, Visits: 2 333
Миша, пока ты офигевал, я давно уже решил проблему
Сообщ. #903716
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 2:55