Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: RomanKravchenko от Сентябрь 20, 2012, 15:56



Название: Как одну текстуру обработать 2 шейдерами?
Отправлено: RomanKravchenko от Сентябрь 20, 2012, 15:56
Стоит задача: есть два фрагментных шейдера, которые создают два разных эффекта для текстуры. Как в программе применить эти оба шейдера к одной текстуре?


Название: Re: Как одну текстуру обработать 2 шейдерами?
Отправлено: mitrich от Сентябрь 20, 2012, 17:27
Отрисовать сначала с первым шейдером, затем со вторым, включив смешивание.
См. glEnable(GL_BLEND), glBlendFunc (http://www.opengl.org/sdk/docs/man/xhtml/glBlendFunc.xml).


Название: Re: Как одну текстуру обработать 2 шейдерами?
Отправлено: Igors от Сентябрь 20, 2012, 17:54
Или сделать из двух шейдеров один (сложнее но возможностей больше)


Название: Re: Как одну текстуру обработать 2 шейдерами?
Отправлено: RomanKravchenko от Сентябрь 20, 2012, 21:11
Или сделать из двух шейдеров один (сложнее но возможностей больше)

Я уже так думал - не вариант. Нужно вторым шейдером проходить по новых значениях пикселей. Как вариант пробую с QGlFramebufferObject: прохожу первым шейдером по начальной текстуре и отрисовую её в буфер, а потом отключаю этот шейдер, включаю второй и прохожу уже по текстуре с буфера и её рисую. Идея хорошая, но почему-то в PaintGl(), когда делаю два раза bind() к шейдерам или release(), появляется баг и ничего не рисуется(черный экран).


Название: Re: Как одну текстуру обработать 2 шейдерами?
Отправлено: Igors от Сентябрь 21, 2012, 00:26
Я уже так думал - не вариант. Нужно вторым шейдером проходить по новых значениях пикселей.
Не знаю, у меня "вариант" (до 8 текстур).
Код
glSlang
color0 = texture2D(texture0, gl_TexCoord[0].xy);
...
color1 = texture2D(texture1, gl_TexCoord[1].xy);
 


Название: Re: Как одну текстуру обработать 2 шейдерами?
Отправлено: RomanKravchenko от Сентябрь 21, 2012, 12:41
Да Вы правы, так можно сделать. Я просто ещё не очень хорошо разбираюсь в шейдерах. Но с другой стороны, считаю это не очень хорошим стилем - все забрасывать в один файл.


Название: Re: Как одну текстуру обработать 2 шейдерами?
Отправлено: Igors от Сентябрь 21, 2012, 12:47
Но с другой стороны, считаю это не очень хорошим стилем - все забрасывать в один файл.
Это и намного труднее. Но с буфером - как Вы узнаете откуда взялся цвет пыкселя, т.е. был ли он действительно создан предыдущей текстурой?


Название: Re: Как одну текстуру обработать 2 шейдерами?
Отправлено: RomanKravchenko от Сентябрь 21, 2012, 16:43
Но с буфером - как Вы узнаете откуда взялся цвет пыкселя, т.е. был ли он действительно создан предыдущей текстурой?
Создаю экземпляр QGlFramebufferObject, в него рисую как в буфер, а потом с него достаю текстуру. А действительно ли - будет видно на экране, я же знаю какой результат мне нужен