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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как применить шейдер к объекту painter  (Прочитано 4443 раз)
abdulgalimov
Гость
« : Октябрь 28, 2015, 13:29 »

Приветствую!

Подскажите новичку, как мне применить шейдер к объекту QPainter. Т.е. я что то там рисую в painter-е, и в какой то момент хочу наложить на это, нарисованное, новый шейдер, например чтобы сделать нарисованное черно белым. Я новичок в мире OpenGL, Qt и C++, поэтому не ругайте сильно если что не так Улыбающийся Если кто покажет полностью рабочий пример - буду премного благодарен.

Спасибо.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 28, 2015, 14:58 »

Слово "шейдер" лучше не упоминать без крайней на то необходимости Улыбающийся То что Вы хотите скорее "композитное рисование" или "фильтр". См QPainter::setCompositionMode. Правда не припомню там сделать нарисованное черно-белым, ну не беда, тогда просто рисуете сначала в QImage, потом парите своим фильтром и выводите на экран.
Записан
abdulgalimov
Гость
« Ответ #2 : Октябрь 28, 2015, 15:36 »

Слово "шейдер" лучше не упоминать без крайней на то необходимости Улыбающийся То что Вы хотите скорее "композитное рисование" или "фильтр". См QPainter::setCompositionMode. Правда не припомню там сделать нарисованное черно-белым, ну не беда, тогда просто рисуете сначала в QImage, потом парите своим фильтром и выводите на экран.

Возможно я не правильно выразился. Попробую уточнить: в стандартных примерах есть проект shadereffects:

Он написал на QML, можно ли что то подобное сделать на C++. Т.е. у меня есть QWidget, в нем я что то рисую, и хочу применить к этому виджету шейдерный(ой, я снова написал это страшное слово:) ) эффект.
Записан
abdulgalimov
Гость
« Ответ #3 : Октябрь 28, 2015, 15:59 »

Вот например у QPainter есть методы beginNativePainting и endNativePainting, между которыми можно рисовать используя OpenGL. Вот как написать и использовать шейдер, чтобы он(шейдер) на входе(texture?) получал то, что уже отрисовано на этом painter-е Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 29, 2015, 06:49 »

Вот например у QPainter есть методы beginNativePainting и endNativePainting, между которыми можно рисовать используя OpenGL.
begin(end)NativePainting здесь ни при чем.

Вот как написать и использовать шейдер, чтобы он(шейдер) на входе(texture?) получал то, что уже отрисовано на этом painter-е Улыбающийся
Код
C++ (Qt)
void MyClass::paintEvent( QPaintEvent * )
{
// рисуем оригинал в QImage
 QImage img(width, height, QImage::Format_ARGB32);
 if (1) {
  QPainter p(&img);
  p.drawText(20, 20, "Qt");
 }
 
// применяем наш фильтр
 MyFilter(img);
 
// выводим на экран
 QPainter p(this);
 o.drawImage(rect(), img);
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 29, 2015, 06:59 »

..к этому виджету шейдерный(ой, я снова написал это страшное слово:) ) эффект.
Вы можете назвать свинью коровой - но от этого она не станет давать молоко Улыбающийся

В лучшем случае шейдер получает на вход одну-единственную точку (которая даже не пиксель). А в худшем и про точки ничего не знает. Вот я Вам и намекаю что этот термин здесь неуместен  Улыбающийся 
Записан
abdulgalimov
Гость
« Ответ #6 : Октябрь 29, 2015, 11:54 »

Кажется до меня дошло. спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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