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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Рендер в текстуру  (Прочитано 2894 раз)
Torvald
Самовар
**
Offline Offline

Сообщений: 118


Просмотр профиля
« : Сентябрь 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();
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Сентябрь 10, 2013, 11:41 »

Не понял зачем нужно 3 раза рендерить. Отрендерили в буфер - ну и размывайте создавая 2 QImage. Да, и техника "по строкам и столцам" может применяться к любому фильтру (не только Гаусс)
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 118


Просмотр профиля
« Ответ #2 : Сентябрь 10, 2013, 13:05 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 11, 2013, 08:03 »

Размытие используется в игре, поэтому важна скорость. Все буферы должны находиться в памяти гпу. QImage в гпу запихивать незачем) да и не представляю как и для чего.
А толку если операция размытия все равно на CPU? Или Вы размываете аппаратно, но GPU - если так расскажите, мне об этом ничего не известно
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 118


Просмотр профиля
« Ответ #4 : Сентябрь 11, 2013, 08:50 »

на гпу конечно, с помощью glsl.
Но дело не в размытии, а в сокращении количесва вызовов opengl функций при смене буфера.
« Последнее редактирование: Сентябрь 11, 2013, 08:57 от Torvald » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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