Russian Qt Forum
Сентябрь 30, 2024, 20:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?  (Прочитано 7802 раз)
Кусай
Гость
« : Ноябрь 30, 2010, 00:52 »

Если у меня есть QImage или QPixmap, содержащий изображение, то как нарисовать его через QPainter с измененной прозрачностью, то есть уменьшив альфа-канал одновременно у всех пикселей? Или, допустим, нужно вывести изображение на экран, "сдвинув" у каждого пикселя какую-то цветовую составляющую или например hue-saturation-value.
Имеется ввиду, что мне надо не менять содержимое QPixmap, а просто применить какой-то фильтр или преобразование при выводе.

Как это сделать? И как сделать это без особых потерь в производительности? Ясное дело, изображение так и так по пикселю переносится на пейнт девайс, нельзя ли как бы вмешаться на этом этапе и корректировать при перерисовке?

Цель - добиться плавного исчезновения изображения при покадровой анимации или плавного потемнения
Записан
ufna
Гость
« Ответ #1 : Ноябрь 30, 2010, 08:33 »

Возможно поможет QPainter::setOpacity(..) для прозрачности

А для сдвигов и т.п. - не вижу другого пути кроме как в QImage обрабатывать попиксельно и только потом выводить (либо использовать заточенные под работу с изображениями библиотеки и интегрировать их с Qt), но для плавной анимации это будет работать только на мелких картинках.
Записан
ufna
Гость
« Ответ #2 : Ноябрь 30, 2010, 09:20 »

Еще можно поиграться с Composition Modes, см. демку
Записан
Кусай
Гость
« Ответ #3 : Ноябрь 30, 2010, 19:56 »

За идею с composition modes спасибо, знал, но не додумался, что можно попробовать воспользоваться ими. Не уверен, что будет хорошо с точки зрения производительности, но все же.
Жаль, что решения базовыми средствами qt нет, восхищает "низкоуровневость" ихней графики.

А не подскажете, есть ли что-нибудь специально для qt или хорошо совместимое, что выполняет такие функции? Хотелось бы чтобы было быстро и поддерживало все вышеупомянутое для спрайтов, как частицы в движке HGE)). Гугль не совсем меня понимает.

Вообще говоря, есть желание реализовать систему частиц для 2d спецэффектов. Не уверен, что множественные перебросы через qpaintdevic'ы будут работать быстро...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Ноябрь 30, 2010, 20:23 »

Вообще говоря, есть желание реализовать систему частиц для 2d спецэффектов. Не уверен, что множественные перебросы через qpaintdevic'ы будут работать быстро...
Это интересно. Как рисовать - ходы найдутся, а вот какая ф-циональность? Здесь трудно не свалиться в сотни опций, и в конце-концов пользователь говорит "слишком сложно". Мне нужна простенькая система, вернее я знаю куда ее применить. Хотите - обсудим.
Записан
Кусай
Гость
« Ответ #5 : Ноябрь 30, 2010, 21:17 »

Это интересно. Как рисовать - ходы найдутся, а вот какая ф-циональность? Здесь трудно не свалиться в сотни опций, и в конце-концов пользователь говорит "слишком сложно". Мне нужна простенькая система, вернее я знаю куда ее применить. Хотите - обсудим.

То, к чему стремлюсь, реализовано неплохо в Haaf Game Engine (на котором сделана немного известная игрушка Hammerfight). Классы: партикл, менеджер-спрей, вектор-сила.
Что пытаюсь реализовать - упрощенная версия.
Объект - частица. Рисуется спрайтом, имеет ограниченное время жизни, за которое линейно изменяет размеры (с этим-то у qt проблем нет), прозрачность и rgb в нужных пределах (там и яркость, и насыщенность, и все дела - не суть). Скорость и ускорение, никакого взаимодействия особо с чем-то, просто декорация.
Объект - спрей. Генерирует частицы с заданным разбросом скоростей и направлений, и тд.
Объект - сила. Банально для того, чтобы создавать иллюзию гравитации или ветра, в простейшей реализации действует на частицу независимо от направления.
Можно грабить корованы...

Над особой оптимизацией и тд не думал. В целом система простая. Но как можно увидеть у HGE, там так реализуется и огонь, и искры, и вспышки всякие, и свечение.
Записан
ufna
Гость
« Ответ #6 : Ноябрь 30, 2010, 21:22 »

Ну смотри - обычно все-такие вещи с динамическим изменением картинки реализуются на уровне спрайтов, а динамически менять HSV сдвиги - прощай быстродействие (если конечно не групповой сдвиг, там повеселее будет, хотя скорее всего это тебе и нужно).

Есть ли линк на апи HGE по этому делу?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Ноябрь 30, 2010, 22:21 »

То, к чему стремлюсь, реализовано неплохо в Haaf Game Engine (на котором сделана немного известная игрушка Hammerfight). Классы: партикл, менеджер-спрей, вектор-сила.
Что пытаюсь реализовать - упрощенная версия.
Этой игрушки я не знаю, а вот как реализовано в Wow - мне нравится (сам не играю, но хочу такую же  Улыбающийся). Ключевые моменты:

- откуда "исходят" партиклы? Из точки - возможно, но это неинтересно, нужна поверхность
- какая техника расчета? Обновлять на каждом кадре - да, это везде, но это создает тяжелые проблемы на сетевом рендере
- какие контролы для управления поведением во времени?

Ну и по мелочам:

- насчет "2D" Вы пошутили, имеется ввиду "billboard" - плоскость/квадрат 3D, всегда повернутый лицом к камере
- ну вектор-сила размешивается - напр. Perlin'ом

Верно ли я понимаю?
« Последнее редактирование: Ноябрь 30, 2010, 22:30 от Igors » Записан
ufna
Гость
« Ответ #8 : Ноябрь 30, 2010, 23:04 »

Igors, почему это насчет "2Д" пошутили? 3Д как таковое здесь не нужно, не нужно примешивать сущности без надобности.

WOW не видел, примеры покажете?

Сейчас работаю над подобно
Записан
Кусай
Гость
« Ответ #9 : Ноябрь 30, 2010, 23:06 »

Есть ли линк на апи HGE по этому делу?
http://hge.relishgames.com/ - здесь и документация, и уроки, и отдельно программка для создания и демонстрации систем частиц (в общем архиве).

- насчет "2D" Вы пошутили, имеется ввиду "billboard" - плоскость/квадрат 3D, всегда повернутый лицом к камере

Нет, имеется ввиду именно 2D система частиц, то бишь в чистом виде opengl и 3d вообще не использую. Отрисовка спрайтов через QPainter на поверхности.
По поводу сетевого рендера - рендерить такие штуки можно клиентом, если частицы чисто декоративные - то абсолютно необязательно, чтобы они совпадали у разных людей.

если конечно не групповой сдвиг, там повеселее будет, хотя скорее всего это тебе и нужно
В смысле групповой сдвиг? Изменения будут только вида "уменьшить красный канал у ВСЕХ пикселей спрайта на 1 (при отрисовке)". Есть способы сделать это без сильных затрат ресурсов?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Декабрь 01, 2010, 00:05 »

Igors, почему это насчет "2Д" пошутили? 3Д как таковое здесь не нужно, не нужно примешивать сущности без надобности.
Не вижу "примешивания" - сущность та же самая, разница 2D/3D (здесь) в несложной технике, а применимость возрастает многократно. Да, с raytrace это корректно работать не будет, ничего, пользователь переживет. Зато дешево, удобно, практично

WOW не видел, примеры покажете?
Attachment.
Записан
Кусай
Гость
« Ответ #11 : Декабрь 04, 2010, 00:15 »

Вопросы все еще в силе.
Есть какой-нибудь костыль или полноценный метод однообразно изменять каналы изображения при выводе, не теряя скорости?
Для прозрачности painter->setOpacity(...) не годится, производительность падает в разы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Декабрь 04, 2010, 09:14 »

Есть какой-нибудь костыль или полноценный метод однообразно изменять каналы изображения при выводе, не теряя скорости?
Для прозрачности painter->setOpacity(...) не годится, производительность падает в разы.
glBlendFunc - можно накрутить очень много (если не все)
Записан
Кусай
Гость
« Ответ #13 : Декабрь 05, 2010, 19:26 »

Не хотелось бы подключать openGL для такой простой вещи, да еще и смешивать с обычной графикой.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Декабрь 07, 2010, 15:21 »

Не хотелось бы подключать openGL для такой простой вещи, да еще и смешивать с обычной графикой.
Понимаю, но в данном случае OGL весьма выгоден (типа "наливай и пей"). Задаете альфу и цвет фильтра с помощью glColor и просто выводите квадранглы с текстурой. Набор эффектов шире и приятнее, их можно задействовать одной строкой.

Ну а если хотите без OGL - тоже не проблема. Ничего страшного в попиксельной обработке QImage нет т.к. по существу он массив точек true color. Просто надо делать аккуратно и в стиле "С" - взять адрес на буфер, не вызывать new в цикле обработки, не прыгать между цветовыми моделями и.т.п. - и все будет нормально. 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.111 секунд. Запросов: 22.