Название: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: Кусай от Ноябрь 30, 2010, 00:52 Если у меня есть QImage или QPixmap, содержащий изображение, то как нарисовать его через QPainter с измененной прозрачностью, то есть уменьшив альфа-канал одновременно у всех пикселей? Или, допустим, нужно вывести изображение на экран, "сдвинув" у каждого пикселя какую-то цветовую составляющую или например hue-saturation-value.
Имеется ввиду, что мне надо не менять содержимое QPixmap, а просто применить какой-то фильтр или преобразование при выводе. Как это сделать? И как сделать это без особых потерь в производительности? Ясное дело, изображение так и так по пикселю переносится на пейнт девайс, нельзя ли как бы вмешаться на этом этапе и корректировать при перерисовке? Цель - добиться плавного исчезновения изображения при покадровой анимации или плавного потемнения Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: ufna от Ноябрь 30, 2010, 08:33 Возможно поможет QPainter::setOpacity(..) для прозрачности
А для сдвигов и т.п. - не вижу другого пути кроме как в QImage обрабатывать попиксельно и только потом выводить (либо использовать заточенные под работу с изображениями библиотеки и интегрировать их с Qt), но для плавной анимации это будет работать только на мелких картинках. Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: ufna от Ноябрь 30, 2010, 09:20 Еще можно поиграться с Composition Modes, см. демку
Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: Кусай от Ноябрь 30, 2010, 19:56 За идею с composition modes спасибо, знал, но не додумался, что можно попробовать воспользоваться ими. Не уверен, что будет хорошо с точки зрения производительности, но все же.
Жаль, что решения базовыми средствами qt нет, восхищает "низкоуровневость" ихней графики. А не подскажете, есть ли что-нибудь специально для qt или хорошо совместимое, что выполняет такие функции? Хотелось бы чтобы было быстро и поддерживало все вышеупомянутое для спрайтов, как частицы в движке HGE)). Гугль не совсем меня понимает. Вообще говоря, есть желание реализовать систему частиц для 2d спецэффектов. Не уверен, что множественные перебросы через qpaintdevic'ы будут работать быстро... Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: Igors от Ноябрь 30, 2010, 20:23 Вообще говоря, есть желание реализовать систему частиц для 2d спецэффектов. Не уверен, что множественные перебросы через qpaintdevic'ы будут работать быстро... Это интересно. Как рисовать - ходы найдутся, а вот какая ф-циональность? Здесь трудно не свалиться в сотни опций, и в конце-концов пользователь говорит "слишком сложно". Мне нужна простенькая система, вернее я знаю куда ее применить. Хотите - обсудим.Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: Кусай от Ноябрь 30, 2010, 21:17 Это интересно. Как рисовать - ходы найдутся, а вот какая ф-циональность? Здесь трудно не свалиться в сотни опций, и в конце-концов пользователь говорит "слишком сложно". Мне нужна простенькая система, вернее я знаю куда ее применить. Хотите - обсудим. То, к чему стремлюсь, реализовано неплохо в Haaf Game Engine (на котором сделана немного известная игрушка Hammerfight). Классы: партикл, менеджер-спрей, вектор-сила. Что пытаюсь реализовать - упрощенная версия. Объект - частица. Рисуется спрайтом, имеет ограниченное время жизни, за которое линейно изменяет размеры (с этим-то у qt проблем нет), прозрачность и rgb в нужных пределах (там и яркость, и насыщенность, и все дела - не суть). Скорость и ускорение, никакого взаимодействия особо с чем-то, просто декорация. Объект - спрей. Генерирует частицы с заданным разбросом скоростей и направлений, и тд. Объект - сила. Банально для того, чтобы создавать иллюзию гравитации или ветра, в простейшей реализации действует на частицу независимо от направления. Можно грабить корованы... Над особой оптимизацией и тд не думал. В целом система простая. Но как можно увидеть у HGE, там так реализуется и огонь, и искры, и вспышки всякие, и свечение. Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: ufna от Ноябрь 30, 2010, 21:22 Ну смотри - обычно все-такие вещи с динамическим изменением картинки реализуются на уровне спрайтов, а динамически менять HSV сдвиги - прощай быстродействие (если конечно не групповой сдвиг, там повеселее будет, хотя скорее всего это тебе и нужно).
Есть ли линк на апи HGE по этому делу? Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: Igors от Ноябрь 30, 2010, 22:21 То, к чему стремлюсь, реализовано неплохо в Haaf Game Engine (на котором сделана немного известная игрушка Hammerfight). Классы: партикл, менеджер-спрей, вектор-сила. Этой игрушки я не знаю, а вот как реализовано в Wow - мне нравится (сам не играю, но хочу такую же :)). Ключевые моменты:Что пытаюсь реализовать - упрощенная версия. - откуда "исходят" партиклы? Из точки - возможно, но это неинтересно, нужна поверхность - какая техника расчета? Обновлять на каждом кадре - да, это везде, но это создает тяжелые проблемы на сетевом рендере - какие контролы для управления поведением во времени? Ну и по мелочам: - насчет "2D" Вы пошутили, имеется ввиду "billboard" - плоскость/квадрат 3D, всегда повернутый лицом к камере - ну вектор-сила размешивается - напр. Perlin'ом Верно ли я понимаю? Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: ufna от Ноябрь 30, 2010, 23:04 Igors, почему это насчет "2Д" пошутили? 3Д как таковое здесь не нужно, не нужно примешивать сущности без надобности.
WOW не видел, примеры покажете? Сейчас работаю над подобно Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: Кусай от Ноябрь 30, 2010, 23:06 Есть ли линк на апи HGE по этому делу? http://hge.relishgames.com/ - здесь и документация, и уроки, и отдельно программка для создания и демонстрации систем частиц (в общем архиве).- насчет "2D" Вы пошутили, имеется ввиду "billboard" - плоскость/квадрат 3D, всегда повернутый лицом к камере Нет, имеется ввиду именно 2D система частиц, то бишь в чистом виде opengl и 3d вообще не использую. Отрисовка спрайтов через QPainter на поверхности. По поводу сетевого рендера - рендерить такие штуки можно клиентом, если частицы чисто декоративные - то абсолютно необязательно, чтобы они совпадали у разных людей. если конечно не групповой сдвиг, там повеселее будет, хотя скорее всего это тебе и нужно В смысле групповой сдвиг? Изменения будут только вида "уменьшить красный канал у ВСЕХ пикселей спрайта на 1 (при отрисовке)". Есть способы сделать это без сильных затрат ресурсов?Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: Igors от Декабрь 01, 2010, 00:05 Igors, почему это насчет "2Д" пошутили? 3Д как таковое здесь не нужно, не нужно примешивать сущности без надобности. Не вижу "примешивания" - сущность та же самая, разница 2D/3D (здесь) в несложной технике, а применимость возрастает многократно. Да, с raytrace это корректно работать не будет, ничего, пользователь переживет. Зато дешево, удобно, практичноWOW не видел, примеры покажете? Attachment. Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: Кусай от Декабрь 04, 2010, 00:15 Вопросы все еще в силе.
Есть какой-нибудь костыль или полноценный метод однообразно изменять каналы изображения при выводе, не теряя скорости? Для прозрачности painter->setOpacity(...) не годится, производительность падает в разы. Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: Igors от Декабрь 04, 2010, 09:14 Есть какой-нибудь костыль или полноценный метод однообразно изменять каналы изображения при выводе, не теряя скорости? glBlendFunc - можно накрутить очень много (если не все)Для прозрачности painter->setOpacity(...) не годится, производительность падает в разы. Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: Кусай от Декабрь 05, 2010, 19:26 Не хотелось бы подключать openGL для такой простой вещи, да еще и смешивать с обычной графикой.
Название: Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? Отправлено: Igors от Декабрь 07, 2010, 15:21 Не хотелось бы подключать openGL для такой простой вещи, да еще и смешивать с обычной графикой. Понимаю, но в данном случае OGL весьма выгоден (типа "наливай и пей"). Задаете альфу и цвет фильтра с помощью glColor и просто выводите квадранглы с текстурой. Набор эффектов шире и приятнее, их можно задействовать одной строкой. Ну а если хотите без OGL - тоже не проблема. Ничего страшного в попиксельной обработке QImage нет т.к. по существу он массив точек true color. Просто надо делать аккуратно и в стиле "С" - взять адрес на буфер, не вызывать new в цикле обработки, не прыгать между цветовыми моделями и.т.п. - и все будет нормально. |