OpenGL上下文创建失败

OpenGL Context Creation Failure

本文关键字:失败 创建 上下文 OpenGL      更新时间:2023-10-16

我正在尝试通过Win32 API创建OpenGL上下文,而不使用GLUT之类的包装器。我以前做过很多次,但这次我犯了两个错误中的一个;有时,当您退出窗口时,应用程序不会结束,但几秒钟后,应用程序在调试窗口中以以下消息结束:

Palette watcher thread id 5100 possible deadlock with DLL unload, killing the palette watcher
Unable to open the palette watcher thread id 5100 for termination!

当窗口关闭时,有时会显示第二条消息:

PostMessage to hwnd: 00120266 failed with error: 00000578

我已经在谷歌上搜索过了,有人发现有人有类似的问题,似乎源于SetupPixelFormat。我不知道是什么原因造成的。除了OpenGL渲染上下文设置之外,我已经排除了所有其他代码的问题。

这是我的设置:

BOOL Win32Handler::CreateOpenGLContext(void)
{
int pixelFormat;
this->hdc = GetDC(this->windowHandle);
PIXELFORMATDESCRIPTOR PFD =
{
    sizeof(PIXELFORMATDESCRIPTOR),
    1,
    PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
    PFD_TYPE_RGBA,
    32,
    0,0,0,0,0,0,
    0,
    0,
    0,
    0,0,0,0,
    24,
    8,
    0,
    PFD_MAIN_PLANE,
    0,
    0,0,0
};
pixelFormat = ChoosePixelFormat(this->hdc,&PFD);
if(!SetPixelFormat(this->hdc,pixelFormat,&PFD)) return FALSE;
this->hglrc = wglCreateContext(this->hdc);
if(!this->hglrc) return FALSE;
if(!wglMakeCurrent(this->hdc,this->hglrc)) return FALSE;
glewExperimental = TRUE;
GLenum error = glewInit();
if(error != GLEW_OK) return FALSE;
return TRUE;

}

这个函数是在窗口创建后在我的主方法中调用的。

我知道OpenGL上下文也没有创建,因为SwapBuffers()glClearColor似乎不起作用。

请注意,当我不调用设置代码时,这些错误不会发生。此外,这两种情况似乎是随机发生的,有时当我关闭应用程序时,会发生一种情况,但不会发生另一种情况。它们从未同时触发过。

查看代码,我只能猜测设备上下文和/或窗口句柄无效。任何采用无效设备上下文的东西都可能表现出奇怪和未定义的行为,包括程序关闭时的错误。

请确保窗口句柄有效,并且您有一个有效的设备上下文。还有一个重要的注意事项:对于每个GetDC,你应该确保有一个相应的ReleaseDC。