Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: __Heaven__ от Январь 28, 2015, 18:07



Название: QOpenGLWidget vs QGLWidget
Отправлено: __Heaven__ от Январь 28, 2015, 18:07
Привет, друзья!
Хотел узнать, кто уже использует QOpenGLWidget в своих проектах, как полёт?
Судя по документации мне его методы показались скудными. К примеру, мне не хватает setAutoSwap(bool) и swapBuffers().
Стоит ли перелезать или этот класс ещё сыроват?


Название: Re: QOpenGLWidget vs QGLWidget
Отправлено: Igors от Январь 29, 2015, 07:37
Дружок, долбаюсь 3-ю неделю с этим  :'( По какой-то таинственной причине экран не обновляется даже если рисую строго из paintGL. Вызов makeCurrent почему-то блокирует рисование. Проблемы с ложными (ненужными) перерисовками. И.т.п.


Название: Re: QOpenGLWidget vs QGLWidget
Отправлено: __Heaven__ от Январь 29, 2015, 09:43
По какой-то таинственной причине экран не обновляется даже если рисую строго из paintGL.
Я получал такое же и на QGLWidget, хотел подписать оси координат. Но плюнул и сделал xyz трёхмерными.
А по идеи, какие преимущества я имею или должен иметь с этим новым классом?


Название: Re: QOpenGLWidget vs QGLWidget
Отправлено: Igors от Январь 29, 2015, 09:58
А по идеи, какие преимущества я имею или должен иметь с этим новым классом?
QGLWidget (и вообще все QGLxxx) объявлено "legacy" начиная с 5.4. Проблемы есть и в старом и в новом - поэтому есть смысл возиться с новым. Напр есть приятная возможность обойтись без стандартных хедеров OpenGL, отличный флажок чтобы сделать все контексты шаред и др. Но будет ли все это бычить со старым QGLxxx - жалко тратить время на проверку


Название: Re: QOpenGLWidget vs QGLWidget
Отправлено: __Heaven__ от Январь 29, 2015, 10:49
Я ещё так понимаю, что введение нового класса позволяет с меньшей болью портировать свои приложения на ES...
Что означает термин legacy?


Название: Re: QOpenGLWidget vs QGLWidget
Отправлено: Igors от Февраль 01, 2015, 11:12
Что означает термин legacy?
То и означает, "наследство", т.е. предыдущая реализация которая еще/пока поддерживается, но уже не развивается

Я получал такое же и на QGLWidget, хотел подписать оси координат. Но плюнул и сделал xyz трёхмерными.
Да, в QOpenGLWidget с текстом тоже проблемы, после вызовов OpenGL текст почему-то не рисуется. У меня были буквы в виде моно битмапов, рисовал через glCallList. Работало, но возможности бедные. Переделал на QPainter, сначала в QImage а потом drawImage


Название: Re: QOpenGLWidget vs QGLWidget
Отправлено: __Heaven__ от Февраль 04, 2015, 16:23
Как полёт? Есть изменения?


Название: Re: QOpenGLWidget vs QGLWidget
Отправлено: Igors от Февраль 04, 2015, 16:44
Как полёт? Есть изменения?
Да какой "полет" - стреляют, не было света  :'(


Название: Re: QOpenGLWidget vs QGLWidget
Отправлено: __Heaven__ от Февраль 04, 2015, 17:32
сочувствую...


Название: Re: QOpenGLWidget vs QGLWidget
Отправлено: mitrich от Февраль 09, 2015, 11:26
К примеру, мне не хватает setAutoSwap(bool) и swapBuffers().
Вызов makeCurrent почему-то блокирует рисование.
Существенное отличие от QGLWidget, как я понял в том, что QGLWidget создает собственное нативное окошко с контекстом OpenGL, а QOpenGLWidget вместо этого использует рендеринг в FBO. Соответственно, контроля setAutoSwap/swapBuffers не будет и makeCurrent будет работать по другому.


Название: Re: QOpenGLWidget vs QGLWidget
Отправлено: Igors от Февраль 09, 2015, 11:56
"Выталкивать" (рисовать асинхронно) кое-как сделал, но неприятная проблема "застревания" кадра при синхронном. Рисую в drawGL, но почему-то экран обновляется лишь при след перерисовке. Сделал собственный updateFlag - все равно необходим чтобы избежать ложных перерисовок.

Насколько понял по исходникам, схема такая. QOpenGLWidget рендерится в текстуру, а обычные виджеты - в QImage который хранит QBackingStore. При выводе все это собирается в OpеnGL и делается swapBuffers для всего окна. И все бы ничего но зачем дергать всякий раз QOpenGLWidget - хз. Также действия рисования могут затрагивать контекст окна. Напр рисую текстуру с какой-то альфой - а получаю blend всего окна. Сегодня буду разбираться с этим багом.


Название: Re: QOpenGLWidget vs QGLWidget
Отправлено: __Heaven__ от Февраль 15, 2015, 18:06
Есть новости? Удалось победить лишние перерисовки и др.?


Название: Re: QOpenGLWidget vs QGLWidget
Отправлено: Igors от Февраль 15, 2015, 18:15
Есть новости? Удалось победить лишние перерисовки и др.?
Я думал уже ответил в предыдущем посте :) С перерисовками - если свой updateFlag == false, то drawGL пропускаем. Др возможности (судя по исходникам 5.4) не нашел. Рисовать/выталкивать асинхронно можно, но для этого надо юзать context()->makeCurrent (а не this->makeCurrent). В общем с причудами, но работать можно


Название: Re: QOpenGLWidget vs QGLWidget
Отправлено: __Heaven__ от Февраль 15, 2015, 18:59
Я понял. Думал, мало ли обнаружилось чего без заглушек.