Как решить пустой экран OpenGl, если контекст становится актуальным перед основным? - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь использовать OpenGl на окнах в C ++. Я использую класс, который инкапсулирует контекст OpenGl. Все работает нормально, за исключением того, что если я создаю глобальный экземпляр, я получаю пустой экран в цикле рендеринга. Как будто ни один контекст не был привязан, но wglGetCurrentContext возвращает значение, а wglGetCurrentDC возвращает значение, соответствующее HDC окна, связанного с контекстом.

Конструктор класса I, определенный для контекста OpenGl:

context::context( HDC hDC ){
    m_handle = wglCreateContext( hDC );
    //error checking here

    wglMakeCurrent( hDC, m_handle )
    //more error checking here

    //set gl function pointers with wglGetProcAddress here (requires context to be current)
}

Что я пробовал:

Использование wglMakeCurrent (0,0), затем снова wglMakeCurrent в main () на дескрипторе глобального экземпляра, не меняет проблему, и wglGetCurrentContext / DC по-прежнему возвращаетсвязные ценности. Более того, использование другого локального контекста между ними все еще работает.

Использование локального экземпляра класса позволяет выполнять рендеринг очень хорошо, даже если все другие компоненты (окно, формат пикселей и т. Д.) Определены глобально и инициализированы до того, как элемент управления достигнет основного().

Глобальное определение всех компонентов, ВКЛЮЧАЯ экземпляр класса, возможно, если вместо этого конструктор класса определен следующим образом:

context::context( HDC hDC ){
    m_handle = wglCreateContext( hDC );
    //error checking here
}

Однако это будет означать весь контекстуказатели на функции никогда не инициализируются в конструкторе, но с помощью другого метода, позже в main (). Это проблема в случае, если любой вызов, включающий эти указатели, выполняется между ними, а также в целом не удовлетворяет необходимости инициализации в два этапа.

Этот последний тест заставляет меня также полагать, что проблема основана только на вызове wglMakeCurrentдескриптор контекста до достижения основного. Может быть, другой компонент, который я забыл или не могу найти, должен быть инициализирован перед вызовом.

Мой реальный вопрос (ы):

  1. Можно ли сделать функцию wglMakeCurrentправильно в случае, если я хочу иметь глобальный экземпляр с первым конструктором?
  2. Если это невозможно, есть ли способ сигнализировать об этом так или иначе, так как в настоящее время я не получаю никакой ошибки в любомКстати, все же я получаю пустой экран во время рендеринга?
  3. Если это все еще невозможно, есть ли способ просто запретить использование класса для создания глобального экземпляра?
...