Russian Qt Forum
Ноябрь 24, 2024, 17:13
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
2D и 3D графика
>
Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV? (Прочитано 7894 раз)
Кусай
Гость
Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
:
Ноябрь 30, 2010, 00:52 »
Если у меня есть QImage или QPixmap, содержащий изображение, то как нарисовать его через QPainter с измененной прозрачностью, то есть уменьшив альфа-канал одновременно у всех пикселей? Или, допустим, нужно вывести изображение на экран, "сдвинув" у каждого пикселя какую-то цветовую составляющую или например hue-saturation-value.
Имеется ввиду, что мне надо не менять содержимое QPixmap, а просто применить какой-то фильтр или преобразование при выводе.
Как это сделать? И как сделать это без особых потерь в производительности? Ясное дело, изображение так и так по пикселю переносится на пейнт девайс, нельзя ли как бы вмешаться на этом этапе и корректировать при перерисовке?
Цель - добиться плавного исчезновения изображения при покадровой анимации или плавного потемнения
Записан
ufna
Гость
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #1 :
Ноябрь 30, 2010, 08:33 »
Возможно поможет QPainter::setOpacity(..) для прозрачности
А для сдвигов и т.п. - не вижу другого пути кроме как в QImage обрабатывать попиксельно и только потом выводить (либо использовать заточенные под работу с изображениями библиотеки и интегрировать их с Qt), но для плавной анимации это будет работать только на мелких картинках.
Записан
ufna
Гость
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #2 :
Ноябрь 30, 2010, 09:20 »
Еще можно поиграться с Composition Modes, см. демку
Записан
Кусай
Гость
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #3 :
Ноябрь 30, 2010, 19:56 »
За идею с composition modes спасибо, знал, но не додумался, что можно попробовать воспользоваться ими. Не уверен, что будет хорошо с точки зрения производительности, но все же.
Жаль, что решения базовыми средствами qt нет, восхищает "низкоуровневость" ихней графики.
А не подскажете, есть ли что-нибудь специально для qt или хорошо совместимое, что выполняет такие функции? Хотелось бы чтобы было быстро и поддерживало все вышеупомянутое для спрайтов, как частицы в движке HGE)). Гугль не совсем меня понимает.
Вообще говоря, есть желание реализовать систему частиц для 2d спецэффектов. Не уверен, что множественные перебросы через qpaintdevic'ы будут работать быстро...
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #4 :
Ноябрь 30, 2010, 20:23 »
Цитата: Кусай от Ноябрь 30, 2010, 19:56
Вообще говоря, есть желание реализовать систему частиц для 2d спецэффектов. Не уверен, что множественные перебросы через qpaintdevic'ы будут работать быстро...
Это интересно. Как рисовать - ходы найдутся, а вот какая ф-циональность? Здесь трудно не свалиться в сотни опций, и в конце-концов пользователь говорит "слишком сложно". Мне нужна простенькая система, вернее я знаю куда ее применить. Хотите - обсудим.
Записан
Кусай
Гость
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #5 :
Ноябрь 30, 2010, 21:17 »
Цитата: Igors от Ноябрь 30, 2010, 20:23
Это интересно. Как рисовать - ходы найдутся, а вот какая ф-циональность? Здесь трудно не свалиться в сотни опций, и в конце-концов пользователь говорит "слишком сложно". Мне нужна простенькая система, вернее я знаю куда ее применить. Хотите - обсудим.
То, к чему стремлюсь, реализовано неплохо в Haaf Game Engine (на котором сделана немного известная игрушка Hammerfight). Классы: партикл, менеджер-спрей, вектор-сила.
Что пытаюсь реализовать - упрощенная версия.
Объект - частица. Рисуется спрайтом, имеет ограниченное время жизни, за которое линейно изменяет размеры (с этим-то у qt проблем нет), прозрачность и rgb в нужных пределах (там и яркость, и насыщенность, и все дела - не суть). Скорость и ускорение, никакого взаимодействия особо с чем-то, просто декорация.
Объект - спрей. Генерирует частицы с заданным разбросом скоростей и направлений, и тд.
Объект - сила. Банально для того, чтобы создавать иллюзию гравитации или ветра, в простейшей реализации действует на частицу независимо от направления.
Можно грабить корованы...
Над особой оптимизацией и тд не думал. В целом система простая. Но как можно увидеть у HGE, там так реализуется и огонь, и искры, и вспышки всякие, и свечение.
Записан
ufna
Гость
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #6 :
Ноябрь 30, 2010, 21:22 »
Ну смотри - обычно все-такие вещи с динамическим изменением картинки реализуются на уровне спрайтов, а динамически менять HSV сдвиги - прощай быстродействие (если конечно не групповой сдвиг, там повеселее будет, хотя скорее всего это тебе и нужно).
Есть ли линк на апи HGE по этому делу?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #7 :
Ноябрь 30, 2010, 22:21 »
Цитата: Кусай от Ноябрь 30, 2010, 21:17
То, к чему стремлюсь, реализовано неплохо в Haaf Game Engine (на котором сделана немного известная игрушка Hammerfight). Классы: партикл, менеджер-спрей, вектор-сила.
Что пытаюсь реализовать - упрощенная версия.
Этой игрушки я не знаю, а вот как реализовано в Wow - мне нравится (сам не играю, но хочу такую же
). Ключевые моменты:
- откуда "исходят" партиклы? Из точки - возможно, но это неинтересно, нужна поверхность
- какая техника расчета? Обновлять на каждом кадре - да, это везде, но это создает тяжелые проблемы на сетевом рендере
- какие контролы для управления поведением во времени?
Ну и по мелочам:
- насчет "2D" Вы пошутили, имеется ввиду "billboard" - плоскость/квадрат 3D, всегда повернутый лицом к камере
- ну вектор-сила размешивается - напр. Perlin'ом
Верно ли я понимаю?
«
Последнее редактирование: Ноябрь 30, 2010, 22:30 от Igors
»
Записан
ufna
Гость
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #8 :
Ноябрь 30, 2010, 23:04 »
Igors, почему это насчет "2Д" пошутили? 3Д как таковое здесь не нужно, не нужно примешивать сущности без надобности.
WOW не видел, примеры покажете?
Сейчас работаю над подобно
Записан
Кусай
Гость
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #9 :
Ноябрь 30, 2010, 23:06 »
Цитата: ufna от Ноябрь 30, 2010, 21:22
Есть ли линк на апи HGE по этому делу?
http://hge.relishgames.com/
- здесь и документация, и уроки, и отдельно программка для создания и демонстрации систем частиц (в общем архиве).
Цитата: Igors от Ноябрь 30, 2010, 22:21
- насчет "2D" Вы пошутили, имеется ввиду "billboard" - плоскость/квадрат 3D, всегда повернутый лицом к камере
Нет, имеется ввиду именно 2D система частиц, то бишь в чистом виде opengl и 3d вообще не использую. Отрисовка спрайтов через QPainter на поверхности.
По поводу сетевого рендера - рендерить такие штуки можно клиентом, если частицы чисто декоративные - то абсолютно необязательно, чтобы они совпадали у разных людей.
Цитата: ufna от Ноябрь 30, 2010, 21:22
если конечно не групповой сдвиг, там повеселее будет, хотя скорее всего это тебе и нужно
В смысле групповой сдвиг? Изменения будут только вида "уменьшить красный канал у ВСЕХ пикселей спрайта на 1 (при отрисовке)". Есть способы сделать это без сильных затрат ресурсов?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #10 :
Декабрь 01, 2010, 00:05 »
Цитата: ufna от Ноябрь 30, 2010, 23:04
Igors, почему это насчет "2Д" пошутили? 3Д как таковое здесь не нужно, не нужно примешивать сущности без надобности.
Не вижу "примешивания" - сущность та же самая, разница 2D/3D (здесь) в несложной технике, а применимость возрастает многократно. Да, с raytrace это корректно работать не будет, ничего, пользователь переживет. Зато дешево, удобно, практично
Цитата: ufna от Ноябрь 30, 2010, 23:04
WOW не видел, примеры покажете?
Attachment.
Записан
Кусай
Гость
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #11 :
Декабрь 04, 2010, 00:15 »
Вопросы все еще в силе.
Есть какой-нибудь костыль или полноценный метод однообразно изменять каналы изображения при выводе, не теряя скорости?
Для прозрачности painter->setOpacity(...) не годится, производительность падает в разы.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #12 :
Декабрь 04, 2010, 09:14 »
Цитата: Кусай от Декабрь 04, 2010, 00:15
Есть какой-нибудь костыль или полноценный метод однообразно изменять каналы изображения при выводе, не теряя скорости?
Для прозрачности painter->setOpacity(...) не годится, производительность падает в разы.
glBlendFunc - можно накрутить очень много (если не все)
Записан
Кусай
Гость
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #13 :
Декабрь 05, 2010, 19:26 »
Не хотелось бы подключать openGL для такой простой вещи, да еще и смешивать с обычной графикой.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как при рисовании изображения нарисовать его полупрозрачно или с измененным HSV?
«
Ответ #14 :
Декабрь 07, 2010, 15:21 »
Цитата: Кусай от Декабрь 05, 2010, 19:26
Не хотелось бы подключать openGL для такой простой вещи, да еще и смешивать с обычной графикой.
Понимаю, но в данном случае OGL весьма выгоден (типа "наливай и пей"). Задаете альфу и цвет фильтра с помощью glColor и просто выводите квадранглы с текстурой. Набор эффектов шире и приятнее, их можно задействовать одной строкой.
Ну а если хотите без OGL - тоже не проблема. Ничего страшного в попиксельной обработке QImage нет т.к. по существу он массив точек true color. Просто надо делать аккуратно и в стиле "С" - взять адрес на буфер, не вызывать new в цикле обработки, не прыгать между цветовыми моделями и.т.п. - и все будет нормально.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...