![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как работать с альфой [Delphi, Windows]
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: пример просто супер. Судя по нему меня интересует Полноценный альфа-канал. Но про остальные тоже непроч прочесть.