Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Torvald от Сентябрь 10, 2013, 08:56



Название: Рендер в текстуру
Отправлено: Torvald от Сентябрь 10, 2013, 08:56
Имеется несколько буферов для рендера в текстуру. Хочу реализовать размытие по гауссу (собственно реализовал), для этого нужно исходное изображение (первый фрейм буфер), буфер для размытия по горизонтали (второй) и буфер для размытия по вертикали (третий - результирующий).
 На данный момент имеется такой код:
 QGLFramebufferObject - класс который использую для рендера в текстуру
 blurLightMapV, blurLightMapH - беферы для верт./гор. размытия
Код
C++ (Qt)
void Map::blurLightMap(int pass){
   QGLFramebufferObject *obj;
   if (pass)
       obj = blurLightMapV;
   else
       obj = blurLightMapH;
 
   obj->bind();
   glPushAttrib(GL_ALL_ATTRIB_BITS);
   glViewport(0, 0, width*lightMapBlurSize, height*lightMapBlurSize);
   glClearColor(0, 0, 0, 0);
   glDisable(GL_BLEND);
   glMatrixMode(GL_PROJECTION);
   glPushMatrix();
 
   glLoadIdentity();
   glOrtho(0, width, 0, height, 1, -1);
   glMatrixMode(GL_MODELVIEW);
   glPushMatrix();
   glLoadIdentity();
 
   glClear(GL_COLOR_BUFFER_BIT);
   glBegin(GL_QUADS);
   glTexCoord2f(0, 1); glVertex2f(0, height);
   glTexCoord2f(1, 1); glVertex2f(width, height);
   glTexCoord2f(1, 0); glVertex2f(width, 0);
   glTexCoord2f(0, 0); glVertex2f(0, 0);
   glEnd();
 
   glMatrixMode(GL_MODELVIEW);
   glPopMatrix();
   glMatrixMode(GL_PROJECTION);
   glPopMatrix();
   glPopAttrib();
   obj->release();
}
Проблема:
 Как видно каждый бинд сопровождается множественными вызовами настройки вида/отображения. Все эти вызовы очень сильно снижают фпс.
 Вопрос: как то можно все это сократить? типа настроить заранее, а дальше просто вызывать
 bind();
 //отрисовка
 release();


Название: Re: Рендер в текстуру
Отправлено: Igors от Сентябрь 10, 2013, 11:41
Не понял зачем нужно 3 раза рендерить. Отрендерили в буфер - ну и размывайте создавая 2 QImage. Да, и техника "по строкам и столцам" может применяться к любому фильтру (не только Гаусс)


Название: Re: Рендер в текстуру
Отправлено: Torvald от Сентябрь 10, 2013, 13:05
Не понял зачем нужно 3 раза рендерить. Отрендерили в буфер - ну и размывайте создавая 2 QImage. Да, и техника "по строкам и столцам" может применяться к любому фильтру (не только Гаусс)
"Отрендерили в буфер" - первый буфер, "ну и размывайте создавая 2 QImage" - еще два.
Зачем 2 QImage?
Размытие используется в игре, поэтому важна скорость. Все буферы должны находиться в памяти гпу. QImage в гпу запихивать незачем) да и не представляю как и для чего.
Мне нужно сократить вызовы opengl с цпу. Кажется нашел способ через дисплейные списки - вместо 27 вызовов получается один, правда пока еще не тестил.


Название: Re: Рендер в текстуру
Отправлено: Igors от Сентябрь 11, 2013, 08:03
Размытие используется в игре, поэтому важна скорость. Все буферы должны находиться в памяти гпу. QImage в гпу запихивать незачем) да и не представляю как и для чего.
А толку если операция размытия все равно на CPU? Или Вы размываете аппаратно, но GPU - если так расскажите, мне об этом ничего не известно


Название: Re: Рендер в текстуру
Отправлено: Torvald от Сентябрь 11, 2013, 08:50
на гпу конечно, с помощью glsl.
Но дело не в размытии, а в сокращении количесва вызовов opengl функций при смене буфера.