我开始尝试使用 QT 的 OpenGL 资源在非 GUI 线程上创建 OpenGL 渲染窗口,如该线程中所述:
https://forum.qt.io/topic/123151/qwindow-on-a-non-gui-thread
我尝试这样做的原因是因为我的 GUI 线程非常忙于处理大量事件和小部件,当我使用 QWindow 时这会导致卡顿和丢帧。
目前,我已经创建了一个用于创建QOpenGLContext的本机 WGL 上下文/窗口:这是该项目的 github 链接:https ://github.com/rtavakko/WinGL
void OpenGLNativeRenderWindow::showNative()
{
//Create native window and context
createNative();
//Allocate memory for the context object and prepare to create it
openGLContext = new QOpenGLContext(this);
QWGLNativeContext nativeContext(hglrc,hwnd);
openGLContext->setNativeHandle(QVariant::fromValue(nativeContext));
openGLContext->setFormat(openGLFormat);
if(sharedOpenGLContext)
openGLContext->setShareContext(sharedOpenGLContext);
//Make sure the context is created & is sharing resources with the shared context
bool contextCreated = openGLContext->create();
assert(contextCreated);
if(sharedOpenGLContext)
{
bool sharing = QOpenGLContext::areSharing(openGLContext,sharedOpenGLContext);
assert(sharing);
}
//Resize / show window
resize(renderSpecs.frameType.width,renderSpecs.frameType.height);
visible = !ShowWindow(hwnd,SW_SHOWNORMAL);
}
所有资源,包括本机窗口,都可以毫无问题地创建,并且我能够在单独的线程上使 QT 上下文成为当前的,并且 OpenGL 渲染也不会产生错误,但 Hello Triangle 不会在我的窗口上渲染。似乎原生 WGL 上下文和 QT 上下文仍然是独立的实体。
如果我进行直接 WGL 调用以使上下文成为当前/交换缓冲区,我似乎能够在本机窗口上进行 OpenGL 调用,但似乎我仍然无法访问 QT 上下文呈现的资源(例如 FBO 输出纹理)。
有什么想法可能是错的吗?
干杯!