Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: developer-nsk от Октябрь 16, 2009, 17:19



Название: Включение аппаратного рендеринга OpenGL
Отправлено: developer-nsk от Октябрь 16, 2009, 17:19
Здравствуйте, уважаемые господа программисты! Суть проблемы - есть сцена-карта, которая содержит массу QGraphicsItem'ов, в том числе большие текстуры-картинки, которые отображаются с флагом QPainter::SmoothPixmapTransform (сглаженные, иначе говоря). Отображается данная сцена посредством QGraphicsView, с его же помощью, соответственно, происходит перемещение по карте, зум и поворот карты. Проблема заключается в тормозах, которые проявляются при осуществлении этих операций (перемещение, зум, поворот), причём тормоза эти - исключительно из-за изображений (фотографий местности). Посему появилась мысль, включить аппаратное ускорение этого дела посредством OpenGL... Каким образом лучше всего это осуществить? Заранее премного благодарен за помощь.


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: SABROG от Октябрь 16, 2009, 17:48
Посему появилась мысль, включить аппаратное ускорение этого дела посредством OpenGL...

На сколько я знаю аппаратное ускорение включено изначально везде где только можно, если это поддерживает видео-карта.
Особенно это хорошо видно на linux'е, когда изначально стоят дефолтные дрова.


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: developer-nsk от Октябрь 16, 2009, 17:56
На сколько я знаю аппаратное ускорение включено изначально везде где только можно, если это поддерживает видео-карта.
Особенно это хорошо видно на linux'е, когда изначально стоят дефолтные дрова.

Не совсем... Как я понимаю, по умолчанию вся обработка подобных вещей идёт без использования аппаратного ускорения. Взять хотя бы демки Affine Transformations или Gradients. При включении флажка OpenGL, эти демки начинают многократно шустрее шевелиться, особенно в полноэкранном режиме. Я пробовал разбирать код классов Arthur Widget, с помощью которых написаны эти демки, но повторить включение аппаратного ускорения в моём приложении как-то не получилось...


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: BRE от Октябрь 16, 2009, 18:03
Не совсем... Как я понимаю, по умолчанию вся обработка подобных вещей идёт без использования аппаратного ускорения. Взять хотя бы демки Affine Transformations или Gradients. При включении флажка OpenGL, эти демки начинают многократно шустрее шевелиться, особенно в полноэкранном режиме. Я пробовал разбирать код классов Arthur Widget, с помощью которых написаны эти демки, но повторить включение аппаратного ускорения в моём приложении как-то не получилось...
Из демки chip:
Код
C++ (Qt)
void View::toggleOpenGL()
{                        
#ifndef QT_NO_OPENGL    
   graphicsView->setViewport(openGlButton->isChecked() ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget);
#endif                                                                                                                
}                                                                                                                    
 


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: developer-nsk от Октябрь 16, 2009, 18:11

Из демки chip:
Код
C++ (Qt)
void View::toggleOpenGL()
{                        
#ifndef QT_NO_OPENGL    
   graphicsView->setViewport(openGlButton->isChecked() ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget);
#endif                                                                                                                
}                                                                                                                    
 

Спасибо за вариант, но я его уже тоже попробовал - бесполезно. Более того, в демке chip лично у меня на компе при выключенном флаге OpenGL всё работает ещё быстрее, чем при включенном. И я так подозреваю, что это не совсем то, т.к. уж очень сильно видна разница между включенном OpenGL в демках Gradients и Chips...


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: Sergey B. от Октябрь 16, 2009, 18:31
То? (http://labs.trolltech.com/blogs/2008/11/28/videos-get-pimped/)


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: developer-nsk от Октябрь 16, 2009, 18:43
То? (http://labs.trolltech.com/blogs/2008/11/28/videos-get-pimped/)

Попробовал... Честно говоря, не то :-) Но всё равно спасибо!


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: Igors от Октябрь 16, 2009, 18:49
Я лично не очень понимаю что должен ускорять OGL если нет полигонов, OGL примитивов, OGL текстур и.т.п.?
Хотя я в hardware не силен, все может быть :)


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: developer-nsk от Октябрь 16, 2009, 19:40
Я лично не очень понимаю что должен ускорять OGL если нет полигонов, OGL примитивов, OGL текстур и.т.п.?
Хотя я в hardware не силен, все может быть :)

Хммм... Я понимаю, что Вы имеете ввиду. И, честно говоря, не до конца понимаю механизм того, как это работает в Qt для двумерной графики, но ведь как-то же это реализовано в демках Affine Transformations и Gradients :-)


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: Igors от Октябрь 16, 2009, 19:59
Хммм... Я понимаю, что Вы имеете ввиду. И, честно говоря, не до конца понимаю механизм того, как это работает в Qt для двумерной графики, но ведь как-то же это реализовано в демках Affine Transformations и Gradients :-)
В этих демках есть полигоны которые OGL действительно ускорит. Если Вы сделаете свои GraphicsItem(s) из чего-то типа QPolygonF - Вы тоже можете рассчитывать на ускорение. А иначе - я не знаю как.


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: SABROG от Октябрь 16, 2009, 20:16
Если мне память не изменяет, то сама реализация OpenGL обычно идет вместе с драйверами видео-карты. Поэтому дрова используют не какой-то общий механизм ускорения, а аппаратные фичи той карты под которую был реализован этот OpenGL. Плохо то, что стандарт OpenGL идет впереди реализаций, в общем также как и в C++. Но все-таки общий механизм ускорения 2d включается при установке драйверов, а дополнительное ускорение, видимо, можно получить только при использовании библиотек типа DirectX и OpenGL.


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: _OLEGator_ от Октябрь 16, 2009, 22:33
Можно попробовать отрисовывать на чистом OpenGL, 3D сцену, на которой будет плоскость с набором картинок.
Потому что отрисовка QPainter'ом на QGLWidget'e никакого ускорения значительного не даст...

Либо сделать дискретный мастаб, когда для каждого масштаба будут подобраны картинки оптимального размера, аля Гугл мап


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: break от Октябрь 17, 2009, 00:43
В выпуске QtQuarterly --- Issue 26 · Q2 2008 --- Accelerate your Widgets with OpenGL · Example Code

Думаю вы это ищите - там как работа с QGraphicsView.


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: Racheengel от Октябрь 21, 2009, 17:25
Насколько я знаю, ускорение работает далеко не на всех видеокартах. И это правда, что на одних видюхах будет быстрее с ускорением, с другим - без. Я про это в Нокию писал еще летом. Это имхо баг.


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: Igors от Октябрь 21, 2009, 19:03
Можно попробовать отрисовывать на чистом OpenGL, 3D сцену, на которой будет плоскость с набором картинок.
Здравая идея - если перевести все QPixmap в полигоны с OGL текстурой (это не так сложно) - то ускорение будет


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: developer-nsk от Октябрь 23, 2009, 13:38
В этих демках есть полигоны которые OGL действительно ускорит. Если Вы сделаете свои GraphicsItem(s) из чего-то типа QPolygonF - Вы тоже можете рассчитывать на ускорение. А иначе - я не знаю как.

На самом деле ситуация обстоит следующим образом - у меня на сцене есть несколько GraphicsItems, которые представляют из себя QPixmap, причём некоторые из них очень большого размера. У них включен флаг QPainter::SmoothPixmapTransform (сглаженные, иначе говоря), который, как я понимаю, и тормозит всю сцену (а этот флаг нужен обязательно). Так вот, в Affine Transformations тоже вращается картинка, сглаженная таким же образом, но при этом нет ни намёка на тормоза, ибо юзается аппаратное ускорение сглаживания (даже вентилятор на видеокарте включается через несколько минут :-))... Разбирал код демки и так и не понял, как же там они это сделали... Может у кого-то более понятные семплы есть?


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: Igors от Октябрь 23, 2009, 16:18
Разбирал код демки и так и не понял, как же там они это сделали... Может у кого-то более понятные семплы есть?
Возьмите стандартный пример Composition. Там хорошо видно что все равно все сводится к стандартным OGL вещам:

glBindTexture
glBegin
glVertex2f
и.т.п.

Ну и наверное того Артура надо приспособить для обвязки OGL контекста  :)


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: break от Октябрь 24, 2009, 01:06
Цитировать
В выпуске QtQuarterly --- Issue 26 · Q2 2008 --- Accelerate your Widgets with OpenGL · Example Code

Думаю вы это ищите - там как работа с QGraphicsView.

Вы посмотрели эту статью?

http://doc.trolltech.com/qq/qq26-openglcanvas.html

неужели не оно?


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: Racheengel от Октябрь 25, 2009, 01:10
эта фича со встроенными виджетами прикольна конечно, но весьма бажно реализована... Т.е. нормально будет работать не со всеми и не везде. Особенно когда им назначить style sheet :(


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: developer-nsk от Октябрь 30, 2009, 13:55

Вы посмотрели эту статью?

http://doc.trolltech.com/qq/qq26-openglcanvas.html

неужели не оно?

Спасибо больше! Именно оно, то, что нужно! Всё получилось, всё заработало :-)
Но появилась теперь ещё одна проблема... Как я уже сказал, карта представляет собой QGraphicsScene с кучей QGraphicsItem'ов, а пользователь может управлять ей виджетами, которые наследуются от QGraphicsView, в котором всё отображается. Но после включение OpenGL простой командой "view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));" (именно так ларчик открывался, как выяснилось) все виджеты управления стали отображаться на чёрном фоне. Я понимаю, что у них тоже надо как-то изменить что-то типа Viewport, но как? Заранее благодарен за ответ!


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: Igors от Октябрь 30, 2009, 17:20
Как я уже сказал, карта представляет собой QGraphicsScene с кучей QGraphicsItem'ов, а пользователь может управлять ей виджетами, которые наследуются от QGraphicsView, в котором всё отображается. Но после включение OpenGL простой командой "view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));" (именно так ларчик открывался, как выяснилось)
То есть достаточно все поместить в QGLWidget - и все ускорится? Хорошо бы если так, но что-то не очень верится  :) Вероятно это только удобное создание OGL контекста.


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: developer-nsk от Октябрь 30, 2009, 18:22
Как я уже сказал, карта представляет собой QGraphicsScene с кучей QGraphicsItem'ов, а пользователь может управлять ей виджетами, которые наследуются от QGraphicsView, в котором всё отображается. Но после включение OpenGL простой командой "view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));" (именно так ларчик открывался, как выяснилось)
То есть достаточно все поместить в QGLWidget - и все ускорится? Хорошо бы если так, но что-то не очень верится  :) Вероятно это только удобное создание OGL контекста.

Вы знаете, это может показаться странным, но именно так! Достаточно было добавить эту команду, чтобы включилось аппаратное ускорение... Даже кулер на видеокарте включается через некоторое время работы! Но теперь проблема с виджетами... Поменяв viewport у view я не знаю, как поменять его у виджетов-наследников, посему у них не обновляется фон :-( Как это лечится - ума не приложу.


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: Геннадий Пастухов от Ноябрь 01, 2009, 17:45

Вы знаете, это может показаться странным, но именно так! Достаточно было добавить эту команду, чтобы включилось аппаратное ускорение... Даже кулер на видеокарте включается через некоторое время работы! Но теперь проблема с виджетами... Поменяв viewport у view я не знаю, как поменять его у виджетов-наследников, посему у них не обновляется фон :-( Как это лечится - ума не приложу.

У меня при добавлении этой команды на месте виджета появляется чёрный фон. Причём такое ощущение, что там что-то отображается, поскольку при вращении колеса мыши появляются полосы прокрутки и они меняются, но на месте виджета всё равно чёрный фон. Пытаюсь я там отобразить большой svg файл, размером примерно 8600х7900 точек. Что у меня может быть не так?


Название: Re: Включение аппаратного рендеринга OpenGL
Отправлено: Igors от Ноябрь 01, 2009, 17:55
У меня при добавлении этой команды на месте виджета появляется чёрный фон. Причём такое ощущение, что там что-то отображается, поскольку при вращении колеса мыши появляются полосы прокрутки и они меняются, но на месте виджета всё равно чёрный фон. Пытаюсь я там отобразить большой svg файл, размером примерно 8600х7900 точек. Что у меня может быть не так?
Не проверял (нет сейчас задач с OGL). Но стоит посмотреть это дела OGL или нет. В paint добавить
Код:
glClearColor(1.0f,  0.0f, 0.0f, 0.0f);              // red background
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);