Имеется несколько буферов для рендера в текстуру. Хочу реализовать размытие по гауссу (собственно реализовал), для этого нужно исходное изображение (первый фрейм буфер), буфер для размытия по горизонтали (второй) и буфер для размытия по вертикали (третий - результирующий).
На данный момент имеется такой код:
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();