Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: axker от Апрель 10, 2012, 10:09



Название: ускорить отрисовку текстур
Отправлено: axker от Апрель 10, 2012, 10:09
Изображение с нескольких камер накладывается на некоторые фигуры в пространстве (части цилиндра), задаваемые массивами индексов, вершин и текстурных координат

Код
C++ (Qt)
void Widget::paintGL()
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
   glCullFace(GL_BACK);
   glEnable(GL_CULL_FACE);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
 
   glPushMatrix();
       gluPerspective (30, 1, 1, 100);
       glTranslatef(0.0f, -0.75f, 0.0f);
       glRotatef(xRot1, 1.0f, 0.0f, 0.0f);
       glRotatef(yRot1, 0.0f, 1.0f, 0.0f);
       glRotatef(zRot1, 0.0f, 0.0f, 1.0f);
 
       glDeleteTextures(1, &textureID);
       textureID = bindTexture(QImage(camera1.getBuffer(), W, H, QImage::Format_ARGB32), GL_TEXTURE_2D);
       drawFigure();
 
       glDeleteTextures(1, &textureID2);
       textureID2 = bindTexture(QImage(camera2.getBuffer(), W, H, QImage::Format_ARGB32), GL_TEXTURE_2D);
       drawFigure2();
 
       glDeleteTextures(1, &textureID3);
       textureID3 = bindTexture(QImage(camera3.getBuffer(), W, H, QImage::Format_ARGB32), GL_TEXTURE_2D);
       drawFigure3();
   glPopMatrix();
 
   fps++;
   update();
}
 
void Widget::drawFigure()
{
  glVertexPointer(3, GL_FLOAT, 0, vecVertices.begin());
  glTexCoordPointer(2, GL_FLOAT, 0, vecTextures.begin());
  glDrawElements(GL_QUAD_STRIP, vecIndices.size(), GL_UNSIGNED_INT, vecIndices.begin());
}

Отрисовка трех кадров формата 1280х720 происходит со скоростью 20-25 кадров в секунду. Каким образом можно поднять производительность, доведя fps до 50 (камеры в отдельном потоке граббят с бОльшей частотой) ? Основная потеря времени происходит на bindTexture, можно ли как-то вынести обновление текстур в отдельный поток или оптимизировать сей процесс? Читал, что можно использовать wglShareLists, но мне нужно под Убунту. Заранее спасибо.


Название: Re: ускорить отрисовку текстур
Отправлено: alexis031182 от Апрель 10, 2012, 10:56
Может быть напрямую гнать данные текстуры в GL с использованием glTexImage2D(), двойной буферизацией и минуя QImage? Нет, не подходит в Вашем случае?


Название: Re: ускорить отрисовку текстур
Отправлено: axker от Апрель 10, 2012, 12:51
это вот так?

Код
C++ (Qt)
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, 3, WD, HD, 0, GL_RGBA, GL_UNSIGNED_BYTE, camera1.getBuffer());

выигрыша нет почти никакого


Название: Re: ускорить отрисовку текстур
Отправлено: V1KT0P от Апрель 10, 2012, 12:56
Отрисовка трех кадров формата 1280х720 происходит со скоростью 20-25 кадров в секунду. Каким образом можно поднять производительность, доведя fps до 50 (камеры в отдельном потоке граббят с бОльшей частотой) ? Основная потеря времени происходит на bindTexture, можно ли как-то вынести обновление текстур в отдельный поток или оптимизировать сей процесс? Читал, что можно использовать wglShareLists, но мне нужно под Убунту. Заранее спасибо.
Советую глянуть исходники VLC, там явно оптимальный способ используется.


Название: Re: ускорить отрисовку текстур
Отправлено: alexis031182 от Апрель 10, 2012, 13:04
это вот так?
...
выигрыша нет почти никакого
Да, так. Жаль. А переключать буферы пробовали (glXSwapBuffers) ? По идее, пока один заполняется, второй выводится. Должно помочь.


Название: Re: ускорить отрисовку текстур
Отправлено: alexis031182 от Апрель 10, 2012, 13:05
Советую глянуть исходники VLC, там явно оптимальный способ используется.
А в VLC разве не XVideo используется? Или и GL тоже?


Название: Re: ускорить отрисовку текстур
Отправлено: V1KT0P от Апрель 10, 2012, 13:19
Советую глянуть исходники VLC, там явно оптимальный способ используется.
А в VLC разве не XVideo используется? Или и GL тоже?
Там разные способы вывода(OpenGL, DirectX, Windows GDI, прямо в видеопамять и т.д.). Но гуй у него на Qt написан, так что не проблема.


Название: Re: ускорить отрисовку текстур
Отправлено: alexis031182 от Апрель 10, 2012, 13:58
Там разные способы вывода(OpenGL, DirectX, Windows GDI, прямо в видеопамять и т.д.). Но гуй у него на Qt написан, так что не проблема.
Глянул исходники ради интереса. На C написан. Гуя, видимо, как плагин или модуль реализована, а может вообще отдельно, т.к. в исходниках присутствует серверная часть.

По GL глянул. В общем-то, похоже, только glTexImage2D вызывается один раз сначала на некоторый пул кадров, а затем только glTexSubImage2D. Может быть здесь имеет смысл покопать.

И ещё... Автор темы писал, что изображения поступают с видеокамер, а формат рисуется, смотрю, RGBA. Производится конвертация? Просто OpenGL помимо RGB поддерживает и другие форматы, не столь объёмные. У некоторых из них даже и не заметить разницы по качеству с RGB. Это просто к слову, к вопросу о возможности ускорения и снижения нагрузки.