Минимальная инициализация контекста OpenGL без окон - PullRequest
6 голосов
/ 15 августа 2011

Как я могу инициализировать контекст OpenGL без окон с минимальным количеством кода?

Я прочитал здесь , что вы можете использовать wglCreateContextAttribsARB для создания контекста без окон, однако это не объясняет, как?

Ответы [ 3 ]

5 голосов
/ 15 августа 2011

По ссылке:

Создание контекста без окна, для закадрового рендеринга.Это может на самом деле не работать.

Это второе предложение важно.Из спецификации WGL_ARB_create_context :

4) Должен ли быть способ сделать контекст текущим без привязки его к оконной системе, которая может быть одновременно нарисована?

РАЗРЕШЕНО: Да, но только в OpenGL 3.0 и более поздних версиях.Это приводит к контексту с недопустимым кадровым буфером по умолчанию, значение которого определено в спецификации OpenGL 3.0.

ПРИМЕЧАНИЕ. Очевидно, в Windows opengl32.dll использует аргумент drawable для идентификации пространства имендрайвер, поэтому мы не сможем обойти его.

Спецификация не позволяет создавать контекст без окна, поскольку для него требуется формат пикселя, которыйВы устанавливаете в контекст устройства.Но вы теоретически можете передать NULL для HDC при создании контекста, что приводит к тому, что OpenGL не имеет кадровый буфер по умолчанию.

Но, как отмечалось выше, это может на самом деле не работать.Вы можете попробовать это, чтобы увидеть, что происходит, но я не оправдаю надежд.

2 голосов
/ 15 августа 2011

Обычный способ реализации закадрового рендеринга:

  1. Создание фиктивного окна + контекст OpenGL для получения доступа к расширениям
  2. Получить функции для создания PBuffer
  3. Создание PBuffer DC
  4. Создание контекста OpenGL на PBuffer
  5. Уничтожить пустышку

Другой вариант - использование объектов Framebuffer (FBO), с помощью которых вы создаете обычное окно OpenGL, но вместо рендеринга в основной фрейм-буфер вы рендеритесь в буферы объектов Framebuffer, при этом окно OpenGL становится невидимым.

0 голосов
/ 25 апреля 2017

другой материал:

HDC  hdc = CreateDC(L"DISPLAY",NULL,NULL,NULL);

Но ReleaseDC не работает с ним. Удаление DC делает.

...