Минимальная инициализация контекста OpenGL без окон
Как я могу инициализировать контекст OpenGL без окон с минимальным количеством кода?
Я прочитал здесь, что вы можете использовать wglCreateContextAttribsARB
создать контекст без окон, однако это не объясняет, как?
3 ответа
По ссылке:
Создание контекста без окна для рендеринга за пределами экрана. Это может не сработать.
Это второе предложение важно. Из спецификации WGL_ARB_create_context:
4) Должен ли быть способ сделать контекст текущим без привязки его к оконной системе, которую можно рисовать одновременно?
РЕШЕНО: Да, но только в OpenGL 3.0 и более поздних версиях. Это приводит к контексту с недопустимым кадровым буфером по умолчанию, значение которого определено в спецификации OpenGL 3.0.
ПРИМЕЧАНИЕ. Очевидно, что в Windows opengl32.dll использует аргумент drawable для идентификации пространства имен драйвера, поэтому мы не сможем обойти его.
Спецификация не позволяет вам создавать контекст без окна, поскольку для него требуется формат пикселя, который вы задали в контексте устройства. Но теоретически вы можете передать NULL для HDC при создании текущего контекста, что приводит к тому, что OpenGL не имеет кадрового буфера по умолчанию.
Но, как отмечалось выше, это может не сработать. Вы можете попробовать это, чтобы увидеть, что происходит, но я не оправдаю своих надежд.
Обычный способ реализации закадрового рендеринга:
- Создать фиктивное окно + контекст OpenGL, чтобы получить доступ к расширениям
- Получить функции для создания PBuffer
- Создать PBuffer DC
- Создайте контекст OpenGL на PBuffer
- Уничтожь пустышку
Другой вариант - использование объектов Framebuffer (FBO), с помощью которых вы создаете обычное окно OpenGL, но вместо рендеринга в основной фрейм-буфер вы рендеритесь в буферы объектов Framebuffer, при этом окно OpenGL становится невидимым.
Другой материал:
HDC hdc = CreateDC(L"DISPLAY",NULL,NULL,NULL);
Но ReleaseDC
не работает с ним.