Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: abdulgalimov от Октябрь 28, 2015, 13:29



Название: Как применить шейдер к объекту painter
Отправлено: abdulgalimov от Октябрь 28, 2015, 13:29
Приветствую!

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

Спасибо.


Название: Re: Как применить шейдер к объекту painter
Отправлено: Igors от Октябрь 28, 2015, 14:58
Слово "шейдер" лучше не упоминать без крайней на то необходимости :) То что Вы хотите скорее "композитное рисование" или "фильтр". См QPainter::setCompositionMode. Правда не припомню там сделать нарисованное черно-белым, ну не беда, тогда просто рисуете сначала в QImage, потом парите своим фильтром и выводите на экран.


Название: Re: Как применить шейдер к объекту painter
Отправлено: abdulgalimov от Октябрь 28, 2015, 15:36
Слово "шейдер" лучше не упоминать без крайней на то необходимости :) То что Вы хотите скорее "композитное рисование" или "фильтр". См QPainter::setCompositionMode. Правда не припомню там сделать нарисованное черно-белым, ну не беда, тогда просто рисуете сначала в QImage, потом парите своим фильтром и выводите на экран.

Возможно я не правильно выразился. Попробую уточнить: в стандартных примерах есть проект shadereffects:
(http://take.ms/4TgzO)
Он написал на QML, можно ли что то подобное сделать на C++. Т.е. у меня есть QWidget, в нем я что то рисую, и хочу применить к этому виджету шейдерный(ой, я снова написал это страшное слово:) ) эффект.


Название: Re: Как применить шейдер к объекту painter
Отправлено: abdulgalimov от Октябрь 28, 2015, 15:59
Вот например у QPainter есть методы beginNativePainting и endNativePainting, между которыми можно рисовать используя OpenGL. Вот как написать и использовать шейдер, чтобы он(шейдер) на входе(texture?) получал то, что уже отрисовано на этом painter-е :)


Название: Re: Как применить шейдер к объекту painter
Отправлено: Igors от Октябрь 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);
}


Название: Re: Как применить шейдер к объекту painter
Отправлено: Igors от Октябрь 29, 2015, 06:59
..к этому виджету шейдерный(ой, я снова написал это страшное слово:) ) эффект.
Вы можете назвать свинью коровой - но от этого она не станет давать молоко :)

В лучшем случае шейдер получает на вход одну-единственную точку (которая даже не пиксель). А в худшем и про точки ничего не знает. Вот я Вам и намекаю что этот термин здесь неуместен  :) 


Название: Re: Как применить шейдер к объекту painter
Отправлено: abdulgalimov от Октябрь 29, 2015, 11:54
Кажется до меня дошло. спасибо.