Ошибка создания контекста OpenGL

0

Я пытаюсь создать контекст OpenGL через API Win32 без оболочки, такой как 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

У меня есть Googled это уже, и один найденный человек с аналогичной проблемой, которая, похоже, возникла из 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() не работают.

Обратите внимание, что когда я не вызываю код установки, эти ошибки не возникают. Также эти два кажутся случайными, иногда, когда я закрываю приложение, но не другое. Они никогда не срабатывали одновременно.

  • 0
    Очевидный вопрос: вы уверены, что GetDC(this->windowHandle) возвращается с чем-то верным? (т.е. действительно ли дескриптор окна?). Мне интересно, есть ли в этом пункте даже действительная настройка контекста устройства? Мое мнение таково, что плохой ДЦ может вызвать это.
  • 0
    Хммм. Я только что проверил windowHandle, и он кажется недействительным. Я не уверен, как это возможно, потому что я только что проверил значение windowHandle в функции создания окна, и оно действительно! Вызов установки OpenGL происходит сразу после настройки окна.
Показать ещё 3 комментария
Теги:
opengl

1 ответ

0
Лучший ответ

Если посмотреть на код, я могу только предположить, что Контекст устройства и/или дескриптор окна недействительны. Все, что принимает недопустимый контекст устройства, может проявлять странное и неопределенное поведение, включая ошибки при завершении программы.

Убедитесь, что дескриптор окна действителен, и у вас есть действующий контекст устройства. И важно отметить: для каждого GetDC вы должны убедиться, что есть соответствующий ReleaseDC.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню