Russian Qt Forum

Qt => OpenGL => Тема начата: Igors от Апрель 28, 2015, 14:59



Название: Создание контекста
Отправлено: Igors от Апрель 28, 2015, 14:59
Добрый день

Уже задавал этот вопрос, но все еще (очень) актуально. В доке упорно говорится что QOpenGLContext создается "при первом рисовании" (как для QOpenGLWidget так и для QOpenGLWindow). И, судя по исходникам, так и есть.

Но соблюдать это правило в реальном приложении никак не выходит. Перед показом хоть каких-то окон нужно пошарить по extensions, загрузить текстуры с диска и много чего еще, и все это требует чтобы контекст уже был создан. Как выкручиваться ?

Спасибо
 


Название: Re: Создание контекста
Отправлено: __Heaven__ от Апрель 28, 2015, 15:45
Под первым рисованием вы понимаете вызов paintGL()?
Как я понимаю, контекст создаётся прямо перед вызовом initializeGL()
В этой фунции можно пройтись  по текстурам, покомпилить шейдеры, заполнить буферы.

А ещё, наверное, можно создать общий контекст и в нём уже сделать необходимые манипуляции.


Название: Re: Создание контекста
Отправлено: Igors от Апрель 28, 2015, 16:43
Под первым рисованием вы понимаете вызов paintGL()?
Как я понимаю, контекст создаётся прямо перед вызовом initializeGL()
В этой фунции можно пройтись  по текстурам, покомпилить шейдеры, заполнить буферы.
Ответ в стиле "КО" :) Не выходит. Напр та же загрузка текстур может занимать минуты, нужен индикатор прогресса. Как я буду его показывать из initializeGL? По-хорошему надо сначала все загрузить а потом уж окна открывать.

А ещё, наверное, можно создать общий контекст и в нём уже сделать необходимые манипуляции.
Да, самостоятельно создать контекст можно, но он не шарится с теми что я получаю в initalize/paintGL - поэтому годится только для просмотра extensions


Название: Re: Создание контекста
Отправлено: __Heaven__ от Апрель 28, 2015, 18:04
Да, самостоятельно создать контекст можно, но он не шарится с теми что я получаю в initalize/paintGL - поэтому годится только для просмотра extensions
Ну да. Непонятка какая-то. Общий контекст можно создать только до create(), а при этом в конструкторе контекст = 0, а в инициализации он уже валидный... Зачем тогда вообще общие контексты в Qt?


Название: Re: Создание контекста
Отправлено: Igors от Апрель 29, 2015, 06:39
Есть такое решение
Код
C++ (Qt)
doNotPaint = true;
this->update();
QEvent ee(QEvent::UpdateRequest);
this->event(&ee);
doNotPaint = false;
 
Ну и в paintEvent сразу выходить если стоит doNotPaint. Это заставляет создать контекст, но увы - в консоль отсыпаются безобразные варнинги  :'(  


Название: Re: Создание контекста
Отправлено: __Heaven__ от Апрель 29, 2015, 10:00
Покопайте в сторону
Код
C++ (Qt)
context()->sharedContext()
Одновременно с созданием контекста для QOpenGLWidget создаётся некий общий контекст. Быть может его удастся как-то поиспользовать.


Название: Re: Создание контекста
Отправлено: Igors от Апрель 29, 2015, 10:54
Покопайте в сторону
Код
C++ (Qt)
context()->sharedContext()
Одновременно с созданием контекста для QOpenGLWidget создаётся некий общий контекст. Быть может его удастся как-то поиспользовать.
Можно вообще самому создать контекст и им рисовать в любом окне - но тогда надо как-то "избавляться" от тех что подаются в paintGL. Может и можно, но неудобно.

Общий контекст создается если флажок AA_SharedOpenGLContext установлен, но контексты QOpenGLWindow автоматом не шарятся. Ну ладно, зашарить не проблема, главное их иметь (т.е. создать)