Получить контекст OpenGL (WGL) из QOpenGLContext

Я пытаюсь получить контекст OpenGL (HGLRC) из окна QQuickView. Мне нужно передать его в библиотеку, отличную от Qt. Я могу достаточно легко получить QOpenGLContext:

m_qtContext = QOpenGLContext::currentContext();

Как получить контекст OpenGL из класса Qt? (QOpenGLContext)


person Jay    schedule 12.09.2013    source источник


Ответы (2)


Насколько мне известно, для этого не существует общедоступного API. Обратите внимание, что Qt 5 удалил большинство собственных дескрипторов из API. Это должно помочь:

QPlatformNativeInterface *iface = QGuiApplication::platformNativeInterface();
HGLRC ctx = (HGLRC)iface->nativeResourceForContext("renderingContext", context);

(не уверен насчет последнего приведения, но выглядит правильно согласно соответствующему источнику).

person peppe    schedule 12.09.2013

Вы можете получить текущий контекст OpenGL из WGL в любом фреймворке, если вызовете wglGetCurrentContext (...), когда ваш поток связан с контекстом. Имейте в виду, что фреймворки обычно изменяют текущий контекст всякий раз, когда вызывают обработчик обратного вызова/события отрисовки окна, и могут даже установить его в NULL после завершения обратного вызова.

WGL имеет строгое взаимно-однозначное сопоставление для контекстов и потоков, поэтому в однопоточном приложении, которое отображает несколько окон, вам, вероятно, придется вызывать эту функцию в обработчике обратного вызова/события отрисовки окна, чтобы получить правильный дескриптор.

Проще говоря, каждый раз, когда у вас есть допустимый контекст для выполнения команд GL под Win32, вы можете получить дескриптор этого конкретного контекста, вызвав wglGetCurrentContext (...).


Если в вашем фреймворке есть портативный способ получения собственного дескриптора, обязательно используйте его. Но это определенно не единственный вариант для Microsoft Windows.

person Andon M. Coleman    schedule 12.09.2013
comment
Отличная помощь. Я задавался вопросом об этом, но недостаточно хорошо знал OpenGl, чтобы знать, будет ли он работать. - person Jay; 13.09.2013
comment
WGL имеет строгое взаимно-однозначное сопоставление для контекстов и потоков, которое на самом деле верно во всех реализациях GL. Единственная проблема в том, что текущий контекст может быть не вашим QOpenGLContext, поэтому я не предлагал этот путь... - person peppe; 13.09.2013
comment
@peppe: Действительно, именно поэтому я упомянул, что это нужно делать из обработчика событий рисования окна. Я упомянул WGL по имени, потому что этот вопрос касается WGL, определенно верно, что все существующие реализации оконных систем имеют эту проблему. - person Andon M. Coleman; 13.09.2013
comment
Это кажется менее зависимым от версии, чем решение peppe. Если я могу убедиться, что я вызываю это в правильном событии. Возможно QQuickItem::updatePaintNode(). Я буду держать после него. Еще раз спасибо - person Jay; 13.09.2013