QT的QWGLNativeContext類的使用

it_xiangqiang發表於2021-01-03

詳細說明
在帶有桌面OpenGL(opengl32.dll)的Windows上封裝WGL上下文的類。

注意:此類沒有二進位制相容性保證,這意味著使用該類的應用程式僅能與開發時所依據的Qt版本一起使用。
QWGLNativeContext是可以傳遞給QOpenGLContext :: setNativeHandle()的值類。使用本地控制程式碼集建立QOpenGLContext時,不會建立新的上下文。而是使用提供的控制程式碼,而無需取得所有權。這允許包裝由外部框架或渲染引擎建立的上下文。典型用法將類似於以下片段:

 #include <QtPlatformSupport/QWGLNativeContext>
  ...create and retrieve the WGL context and the corresponding window...
  QOpenGLContext *context = new QOpenGLContext;
  QWGLNativeContext nativeContext(hglrc, hwnd);
  context->setNativeHandle(QVariant::fromValue(nativeContext));
  context->create();
  ...

需要該視窗,因為將查詢其畫素格式。成功採用後,QOpenGLContext :: format()將返回描述此畫素格式的QSurfaceFormat。
建議限制使用以這種方式建立的QOpenGLContexts。各種特定於平臺的行為和問題可能會導致例如由於Qt畫素格式不匹配而使此類上下文與Qt建立的視窗(表面)保持最新。一個潛在的更安全的解決方案是使用包裝的上下文僅使用單獨的專用QOpenGLContext來設定共享並在螢幕外執行基於Qt的渲染。然後,在外部環境中也可以訪問生成的紋理。

...like above...
  QOpenGLContext *qtcontext = new QOpenGLContext;
  qtcontext->setShareContext(context);
  qtcontext->setFormat(context->format());
  qtcontext->create();
  ...use qtcontext for rendering with Qt...

除了與QOpenGLContext :: setNativeHandle()一起使用之外,此類還用於從QOpenGLContext檢索本地上下文控制程式碼,即HGLRC值。呼叫QOpenGLContext :: nativeHandle()返回一個QVariant,在Windows上至少帶有opengl32.dll的QVariant將包含QWGLNativeContext:

 QVariant nativeHandle = context->nativeHandle();
  if (!nativeHandle.isNull() && nativeHandle.canConvert<QWGLNativeContext>()) {
      QWGLNativeContext nativeContext = nativeHandle.value<QWGLNativeContext>();
      HGLRC hglrc = nativeContext.context();
      ...
  }

相關文章