Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как работать с альфой [Delphi, Windows]


Страницы:   1 2

Cash ©   (2003-11-30 10:42:00) 

В одном из сырцов, скачаных с этого сайта, я увидел хороший, на мой взгляд, эффект (в сырцах его нет, компилированное мной приложение оным не обладает): пламя не выгледит нарисованным, в центре почти не прозрачное, по краям оно ели заметно (самого спрайта). В ImageList-е посмотрел: картинка и картинка. Вопрос. Как это реализовывается. Ожидаю код или ссылку.


cyborg   (2004-02-20 21:27:00) [1]

Похоже я ошибся, в инете упоминается на семь тактов только освещение :(.


cyborg   (2004-02-20 21:12:00) [2]

[26] miek ©   (20.02.04 19:31)
К сожалению ту страничку я не нашёл, нашёл в архиве только это:


4. Канал прозрачности (alpha blending) [далее ab] – одно изображение плавно появляется или растворяется поверх другого (также очень часто применяется при работе с видео).

Формула ab:a = b + (a - b) * alpha

Где: a – основное изображение
b – изображение которое накладывается
alpha – количество градаций(позиций) ab - обычно хватает 0...255.

переведем это все в MMX-команды:

a) инициализация регистров

биты31...2423...1615...8 7...0
eax = alpha alpha alpha alpha

movd mm4,eax; переносим данных из eax в mm4
punpcklwd mm4,mm4 ; создаем четыре cлова alpha-канала
psrlw mm4,8 ; переносим старшую часть слов в младшую
pxor mm7,mm7 ; обнуляем mm7

б) основная процедура

movd mm0,[esi] ; загрузить в mm1 четыре байта накладываемого изображения
movd mm1,[edx] ; загрузить в mm0 четыре байта основного изображения
punpcklbw mm0,mm7
punpcklbw mm1,mm7
psubw mm0,mm1 ; вычитаем из накладываемого, основное изображение
psllw mm1,8 ; переносим младшую часть слов регистра mm1 в cтаршую
pmullw mm0,mm4 ; умножаем накладываемое изображение на alpha-кана
paddw mm1,mm0 ; складываем его с основным
psrlw mm1,8 ; переносим результат из старшей части слова в младшую
packuswb mm1,mm1 ; и переводим его в 32 бита
movd [edi],mm1 ; кладем полученное изображение на экран (в видеобуфер)
add esi,4
add edx,4
add edi,4

В данном примере используется быстрое 16-битное MMX-умножение, которое и дает максимальное ускорение нашей процедуре. Плюс - уже ставшая традицией – обработка сразу четырех байт...


miek   (2004-02-20 19:31:00) [3]

2Сyborg: ты не мог бы посмотреть в своих архивах эту статью? Я сейчас ее там не вижу. 7 тактов на пиксел было бы неплохо.


Cash   (2004-02-20 18:35:00) [4]

Своими десятью нащупал такую проц-у:
DxImageList.Items.Find('Pic').DrawAlpha();
Шо ето интересное такое? И ни то ли я ищу... вНаТури?
А када ее вызывать? Ну вобщем и т.д.


cyborg   (2004-02-16 10:34:00) [5]

[13] miek ©
на gamedev.ru я читал статью (давно) прозрачность с использованием ММХ, вроде пискел за семь тактов обрабатывался, поищи, сам я не помню где читал, может полезно будет.


Vertex   (2004-02-16 03:23:00) [6]

Ну тогда респект
Извиняй за сомнения


miek   (2004-02-14 23:10:00) [7]

Это ты кому, кстати? Не забывай уточнять.
SpriteUtils - моя нетленка, там и копирайт стоит.


Vertex   (2004-02-14 22:59:00) [8]

spriteutils?)
это твоя весчь или ты ее присвоил?


Cash   (2004-02-14 16:41:00) [9]

miek: есесьвенно хорошо!


miek   (2003-12-24 16:30:00) [10]

Это значит "хорошо" или "плохо"?


Cash   (2003-12-19 21:56:00) [11]

Блин. Чеб мы, начинающие, без таких, как ты miekделали. :)


miek   (2003-12-19 15:46:00) [12]

ОК, качаем с www.miek.narod.ru/spriteutils2.zip
Около 400 КБ.


Cash   (2003-12-19 11:42:00) [13]

miekдавай. В демках понятнне(вроде)будет, если с коментариеми :).


miek   (2003-12-18 20:06:00) [14]

Могу выложить и сам модуль, только к нему хелпа нет. Есть демки.


Cash   (2003-12-18 18:35:00) [15]

Незнал, что на асме. Круто! miekСпасибо!


miek   (2003-12-17 18:57:00) [16]

Вот так я делаю альфа-блендинг без MMX.
(Здесь обрабатывается только 1 пиксел. Kак сделать из этого цикл, сами знаете)

//  ESI - указатель на пиксель источника
//  EDI - указатель на пиксель приемника
//  Формат пикселей - ARGB 8-8-8-8

   mov   bl, byte ptr [esi+3]
   mov   bh, byte ptr [esi+3]
   and   bl, bl
   je    @skiptransparent

   mov   al, [esi]
   not   bh

   mul   al, bl
   mov   dl, ah
   mov   al, [edi]
   mul   al, bh
   add   dl, ah
   mov   [edi], dl

   mov   al, [esi+1]
   mul   al, bl
   mov   dl, ah
   mov   al, [edi+1]
   mul   al, bh
   add   dl, ah
   mov   [edi+1], dl

   mov   al, [esi+2]
   mul   al, bl
   mov   dl, ah
   mov   al, [edi+2]
   mul   al, bh
   add   dl, ah
   mov   [edi+2], dl

 @skiptransparent:
   add   esi, 4
   add   edi, 4


Cash   (2003-12-17 12:48:00) [17]

miekв большей степени исходники, мне нужен код (а еще понять как он работает :)).


SiJack   (2003-12-17 09:43:00) [18]

И мне охота, и того и другого если можно без хлеба :))


miek   (2003-12-17 00:20:00) [19]

Не понял - исходники интересуют или сам принцип?


Cash   (2003-12-16 22:19:00) [20]

miek: пример просто супер. Судя по нему меня интересует Полноценный альфа-канал. Но про остальные тоже непроч прочесть.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо