Russian Qt Forum
Ноябрь 22, 2024, 12:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание контекста  (Прочитано 4680 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Апрель 28, 2015, 14:59 »

Добрый день

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

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

Спасибо
 
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Апрель 28, 2015, 15:45 »

Под первым рисованием вы понимаете вызов paintGL()?
Как я понимаю, контекст создаётся прямо перед вызовом initializeGL()
В этой фунции можно пройтись  по текстурам, покомпилить шейдеры, заполнить буферы.

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

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Апрель 28, 2015, 16:43 »

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

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

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Апрель 28, 2015, 18:04 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Апрель 29, 2015, 06:39 »

Есть такое решение
Код
C++ (Qt)
doNotPaint = true;
this->update();
QEvent ee(QEvent::UpdateRequest);
this->event(&ee);
doNotPaint = false;
 
Ну и в paintEvent сразу выходить если стоит doNotPaint. Это заставляет создать контекст, но увы - в консоль отсыпаются безобразные варнинги  Плачущий  
« Последнее редактирование: Апрель 29, 2015, 06:56 от Igors » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Апрель 29, 2015, 10:00 »

Покопайте в сторону
Код
C++ (Qt)
context()->sharedContext()
Одновременно с созданием контекста для QOpenGLWidget создаётся некий общий контекст. Быть может его удастся как-то поиспользовать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Апрель 29, 2015, 10:54 »

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

Общий контекст создается если флажок AA_SharedOpenGLContext установлен, но контексты QOpenGLWindow автоматом не шарятся. Ну ладно, зашарить не проблема, главное их иметь (т.е. создать)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 23.