SR2D: Разные вопросы

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

SR2D: Разные вопросы

Сообщение arthur2 » 01.07.2019 (Пн) 7:23

Mikle
Есть серая маска, символизирующая альфа-канал. Как её наложить на существующую картинку. И обратная операция - есть картинка с альфа-каналом - как выделить серую картинку, пиксели которой символизировали бы альфа-канал? Можно просто перебором, но мне кажется, что что-то подобное уже встроено?

И как лучше - все вопросы по SR2D складывать в одну тему или лучше для каждого вопроса создать свою?
Последний раз редактировалось arthur2 28.07.2019 (Вс) 9:18, всего редактировалось 1 раз.
Артур
 
   

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3920
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: SR2D: Как непрозрачной картинке добавить альфа-маску?

Сообщение Mikle » 01.07.2019 (Пн) 8:35

arthur2 писал(а):Есть серая маска, символизирующая альфа-канал. Как её наложить на существующую картинку.

То есть сделать, чтобы пиксели с заданным цветом стали прозрачными? Если я верно понял вопрос, то тебе нужен метод AddColorKey.
arthur2 писал(а):обратная операция - есть картинка с альфа-каналом - как выделить серую картинку, пиксели которой символизировали бы альфа-канал?

Тут лучше всего подойдёт MaskClearBuffer:
Код: Выделить всё
SprBack.MaskClearBuffer SprA, 0, 0, Color, ARGB(128, 0, 0, 0), NotMask

SprA - исходный спрайт с альфаканалом.
Color - цвет, которым закрашиваем.
Чтобы закрасить SprBack там, где в SprA непрозрачные участки, NotMask = False или вообще пропускаем. Чтобы прозрачные NotMask = True.
arthur2 писал(а):все вопросы по SR2D складывать в одну тему или лучше для каждого вопроса создать свою?

Если небольшие вопросы, типа этих, то можно всё спрашивать в одной (этой) теме.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: SR2D: Как непрозрачной картинке добавить альфа-маску?

Сообщение arthur2 » 01.07.2019 (Пн) 8:53

Не, я имею ввиду постепенное изменение прозрачности. Есть серая 8-битная картинка массивом байтов, каждый из которых символизирует А в АRGB.
Артур
 
   

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3920
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: SR2D: Как непрозрачной картинке добавить альфа-маску?

Сообщение Mikle » 01.07.2019 (Пн) 9:11

Можно любой цветовой канал перемещать между спрайтами:
Код: Выделить всё
Spr1.MoveByte Spr2, 0, 0, ChRed, ChAlpha

Красный канал спрайта Spr2 помещается в альфаканал спрайта Spr1.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: SR2D: Как непрозрачной картинке добавить альфа-маску?

Сообщение arthur2 » 01.07.2019 (Пн) 9:21

Круто!!!
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: SR2D: Как непрозрачной картинке добавить альфа-маску?

Сообщение arthur2 » 01.07.2019 (Пн) 9:25

А если у картинок разные размеры, это сработает? И если маска меньше картинки, какими тогда станут не перекрытые маской области?
Артур
 
   

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3920
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: SR2D: Как непрозрачной картинке добавить альфа-маску?

Сообщение Mikle » 01.07.2019 (Пн) 11:57

Картинки могут быть разных размеров, метод сработает только для перекрывающейся части с учётом входных параметров-координат, например, так:
Изображение
Это касается всех методов SR2D, оперирующих двумя или тремя спрайтами. Исключение, вполне понятное - SRCCol в DrawEBM.
Неперекрытые области не меняются.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: SR2D: Как непрозрачной картинке добавить альфа-маску?

Сообщение arthur2 » 01.07.2019 (Пн) 19:35

Огромное спасибо! И за объяснение, и особенно за саму библиотеку :)
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Есть ли возможность сделать серую картинку?

Сообщение arthur2 » 28.07.2019 (Вс) 9:23

Есть ли возможность сделать серую картинку?

Понятно, что можно сделать перебором пикселей (кстати, какой алгоритм предпочтительней - просто для каждого пикселя среднее арифметическое от R, G, и B?)

Вопрос, есть ли встроенный вариант?
Артур
 
   

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3920
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: SR2D: Разные вопросы

Сообщение Mikle » 28.07.2019 (Вс) 11:25

arthur2 писал(а):просто для каждого пикселя среднее арифметическое от R, G, и B

Более правильно так:
Код: Выделить всё
  Col = ((B * 28 + G * 150 + R * 77) \ 255) * &H10101

В SR2D нет специального способа, но можно сделать с небольшой потерей точности так:
Код: Выделить всё
  Spr.MulAddS2X Spr, 0, 0, ARGB(0, 64, 64, 64), ARGB(0, 192, 192, 192)
  Spr.DrawDPBM Spr, 0, 0, 77, 150, 28, 0.675

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: SR2D: Разные вопросы

Сообщение arthur2 » 28.07.2019 (Вс) 13:02

Mikle писал(а):Более правильно так
А в чем тут математический принцип, что именно делает формула?

Mikle писал(а):но можно сделать с небольшой потерей точности так
А как это работает?
С помощью метода MulAddS2X можно изменять яркость и контрастность. Значение из источника
умножается покомпонентно на параметр Mul, к произведению добавляется значение Add, далее из
него вычитается 128 (как будто Add - число со знаком) и полученная величина умножается на 2.
Здесь 64- это на сколько каждый из RGB становится ярче, а 192 - контрастней? Точнее, наверное, 64 - это -64, а 192 - это +64, так?
DrawDPBM - это мы картинку как бы освещаем?
Попробовал так (fn - это спрайт фона):
Код: Выделить всё
s.MulAddS2X s, 0, 0, ARGB(0, 64, 64, 64), ARGB(0, 192, 192, 192)
s.DrawDPBM s, 0, 0, 77, 150, 28, 0.675
fn.Draw s, 0, 0, OpAlphaBlend
fn.PaintToDevice hdc
Получил вроде черно-белую, но полупрозрачную картинку.
Попробовал так:
Код: Выделить всё
s.MulAddS2X s, 0, 0, ARGB(0, 64, 64, 64), ARGB(0, 192, 192, 192)
fn.DrawDPBM s, 0, 0, 77, 150, 28, 0.675
fn.PaintToDevice hdc
Да, картинка черно-белая. Но так не рисуется альфа-канал.
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: SR2D: Разные вопросы

Сообщение arthur2 » 28.07.2019 (Вс) 13:32

Послеs.MulAddS2X s, 0, 0, ARGB(0, 64, 64, 64), ARGB(0, 192, 192, 192) - альфа-канал, я так понимаю, обнуляется?
Артур
 
   

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3920
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: SR2D: Разные вопросы

Сообщение Mikle » 28.07.2019 (Вс) 13:37

arthur2 писал(а):DrawDPBM - это мы картинку как бы освещаем?

Да, но освещение, использующее нормали и вектор света, совпадает по формуле с нужной нам - сумма трёх произведений.
arthur2 писал(а):Здесь 64- это на сколько каждый из RGB становится ярче, а 192 - контрастней?

Вектора используют числа со знаком, а у нас - без знака. Мы просто упаковывает байт из диапазона 0..255 в диапазон 128..255, чтобы число подходило к DPBM, скалярному произведению векторов.
arthur2 писал(а):А в чем тут математический принцип, что именно делает формула?

Учитывает весовые коэффициенты компонентов. Синий полной яркости темнее, чем красный, и обе темнее, чем зелёный.
arthur2 писал(а):Но так не рисуется альфа-канал.

А нужно было?
Просто перекинь любой канал из RGB (они теперь одинаковые) в альфу с помощью MoveByte.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3920
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: SR2D: Разные вопросы

Сообщение Mikle » 28.07.2019 (Вс) 13:39

arthur2 писал(а):Послеs.MulAddS2X s, 0, 0, ARGB(0, 64, 64, 64), ARGB(0, 192, 192, 192) - альфа-канал, я так понимаю, обнуляется?

Да. Можно написать так, чтобы не изменился:
Код: Выделить всё
ARGB(128, 64, 64, 64), ARGB(128, 192, 192, 192)

Но перед DPBM это не имеет смысла.
Опиши полностью задачу.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: SR2D: Разные вопросы

Сообщение arthur2 » 28.07.2019 (Вс) 15:49

Mikle писал(а):Учитывает весовые коэффициенты компонентов.
Понял :)
Mikle писал(а):Да, но освещение, использующее нормали и вектор света, совпадает по формуле с нужной нам

Получается, что освещение работает по формуле Col = ((B * Lz+ G * Ly+ R * Lx) \ 255) * &H10101 ?

Mikle писал(а):Вектора используют числа со знаком
Ага, догадался, после того, как послал вопрос. И даже пост исправил. Но, кажется, понял не совсем :) Картинка становится менее яркой (-64), но более контрастной (+64)? Или наоборот?
Mikle писал(а):Просто перекинь любой канал из RGB (они теперь одинаковые) в альфу с помощью MoveByte
Это будет не оригинальный альфа-канал. Я, как догадался, что альфа обнуляется, сделал, сохранив изначальный альфа-канал во временный спрайт.
Mikle писал(а):Опиши полностью задачу.
Ну, полностью задача ещё не сформировалась :) Пока примеряюсь, как использовать то, до чего удаётся дотянуться пониманием.
Артур
 
   

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3920
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: SR2D: Разные вопросы

Сообщение Mikle » 28.07.2019 (Вс) 16:39

arthur2 писал(а):Картинка становится менее яркой (-64), но более контрастной (+64)? Или наоборот?

Наоборот.
arthur2 писал(а):Получается, что освещение работает по формуле Col = ((B * Lz+ G * Ly+ R * Lx) \ 255) * &H10101 ?

Скорее, так:
Код: Выделить всё
Brite = N.z * L.z+ N.y * L.y+ N.x * L.x

Где N иL - нормализованные вектора нормали и направления на источник света.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: SR2D: Разные вопросы

Сообщение arthur2 » 28.07.2019 (Вс) 22:31

Mikle писал(а):Где N иL - нормализованные вектора нормали и направления на источник света.
А где про это почитать? В других темах встретил:
Mikle писал(а):Я это более-менее подробно в книге описывал.
А что за книга? Где её можно посмотреть? По форуму не нашел
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: SR2D: Разные вопросы

Сообщение arthur2 » 28.07.2019 (Вс) 22:51

Со знаковым байтом я как-то вроде что-то напутал и недопонял.
H80=-128
Hff=-1
Так? Значит, моё
arthur2 писал(а):наверное, 64 - это -64, а 192 - это +64, так?
неправильно. А правильно, что 64 так +64и есть, а вот 192 как раз -64. Так?
Артур
 
   

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3920
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: SR2D: Разные вопросы

Сообщение Mikle » 29.07.2019 (Пн) 9:38

arthur2 писал(а):что за книга?

Первая тема в этом разделе.
arthur2 писал(а):где про это почитать?

Это стандартный Diffuse Light.
H80=-128
Hff=-1

Нет. В байтах обычно применяют другой принцип:
Код: Выделить всё
UnSigned:    0 127 128 255
Signed  : -128  -1   0 127

По крайней мере так кодируются вектора через цвет в D3D. Точнее, при переводе знакового байта в float ещё идёт деление на 128.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList