Контекст openGL в консоли

Я хотел бы использовать некоторые функции openGL, но ничего не связанного с визуализацией контента. Есть ли способ создать его без ЛЮБЫХ зависимостей (ни для окон, ни для какого-либо пакета [SDL, SFML, GLUT])? Разрешены только библиотеки без внешних библиотек, как и GLEW, который я использую.


person Raven    schedule 24.09.2011    source источник
comment
Какие функции OpenGL были бы полезны без контекста? Это не имеет особого смысла.   -  person Axel Gneiting    schedule 24.09.2011
comment
вычисления с шейдерами, проекции, на самом деле многое.. Пожалуйста, не предлагайте мне использовать CUDA или программировать его самостоятельно, конечно, это возможно, но я хочу знать, можно ли это сделать (и чем меньше кода для этого, тем лучше   -  person Raven    schedule 24.09.2011
comment
Я не понимаю, как вы используете термин внешние библиотеки. GLEW не работает без функций WGL и GLX, которые являются такими же внешними, как Win32 или X11. Действительно, Win32 предоставляет функции WGL, точно так же, как X11 предоставляет функции GLX. Таким образом, та же логика, которая не позволяет вам использовать FreeGLUT или GLFW, также не позволит вам использовать GLEW.   -  person Nicol Bolas    schedule 24.09.2011
comment
Другими словами это вряд ли можно определить. Я имею в виду, что мне нужно что-то, что вы просто включите, и все. В случае glew вы просто включаете glew, и он позаботится обо всем, однако, например, при использовании SFML вам нужно иметь где-то внешнюю динамическую библиотеку.   -  person Raven    schedule 24.09.2011
comment
@Raven FreeGLUT и GLFW имеют статические сборки, если у вас аллергия на библиотеки DLL. Кроме того, это не объясняет, как возможна зависимость от Windows, учитывая, что Windows необходима для работы GLEW.   -  person Nicol Bolas    schedule 24.09.2011
comment
Вам понадобится контекст, когда вы захотите использовать шейдеры. Используйте для этого WGL_ARB_create_context/GLX_ARB_create_context.   -  person Axel Gneiting    schedule 24.09.2011
comment
@Nicolas Bolas Хорошо, тогда, наверное, более подходящий вопрос. Какая самая легкая кроссплатформенная библиотека, которая может статически связываться и может создавать контекст.   -  person Raven    schedule 24.09.2011


Ответы (2)


Какая самая легкая кроссплатформенная библиотека, которая может статически связываться и может создавать контекст.

Как вы определяете «самый легкий»?

Две кросс-платформенные библиотеки, которые делают меньше всего, кроме создания окон OpenGL, — это FreeGLUT и GLFW.

FreeGLUT имеет дистрибутив размером около 5,2 МБ (после распаковки), а GLFW имеет дистрибутив размером 2,6 МБ. Это делает его "легче"? Скомпилированная статическая библиотека FreeGLUT в режиме выпуска под VS2008 составляет около 500 КБ; для GLFW при аналогичной компиляции - 120 КБ. Это делает его "легче"?

person Nicol Bolas    schedule 24.09.2011
comment
Почему ты меня спрашиваешь? Я не знаю, делает ли размер библиотеку легче. Может так показаться, может быть и неправда... поэтому и спрашиваю здесь. Конечно, я мог бы просто использовать перенасыщение и быть в порядке, но я хотел спросить здесь, есть ли что-то, о чем я не знаю, а также ваше личное мнение, потому что вы можете быть намного опытнее меня. - person Raven; 24.09.2011
comment
@Raven Я спрашиваю вас, потому что слово «зажигалка» полностью субъективно. Не существует объективного стандарта того, что тяжело, а что легко. Мое личное мнение... мне все равно. Я бы заботился о легких или тяжелых библиотеках только в том случае, если то, что я пытаюсь сделать, явно требует небольшого исполняемого файла. Что мне важно, так это качество документации, простота использования и общая надежная функциональность. - person Nicol Bolas; 24.09.2011
comment
Вы правильно поняли, это очень субъективно и зависит от того, что я просто делаю. В итоге остановился на SFML, так как понял, что его функционал разбит на 5 библиотек и одна нужная мне - у окна всего 56 кб. Создание контекста — это также вопрос одной строки. Я знаю, что переполнение стека следует использовать для поиска ответа на конкретный вопрос, но я нахожу, что во многих случаях это лучше указывает мне правильное направление. - person Raven; 25.09.2011

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

В Windows самый простой способ — создать невидимое окно, просто окно, которое вы создаете с помощью CreateWindowEx, но не отображаете с помощью ShowWindow; для этого вам даже не нужен цикл обработки событий. В этом окне вы создаете контекст OpenGL, как обычно, но вместо рендеринга в буфер кадра окна вы выполняете рендеринг в объект буфера кадра.

В X11/GLX все еще проще: X11/GLX предлагает PBuffers без расширений (в Windows тоже есть PBuffers, но для их создания вам сначала нужен обычный контекст OpenGL). Итак, на X11 вы можете создать PBuffer без прокси-окна. Сам PBuffer может отображаться как внеэкранный буфер; Объект кадрового буфера также работает в PBuffer, если реализация их поддерживает. Использование невидимого окна с объектом кадрового буфера, как и в Windows, также работает. В любом случае, с текущими драйверами X11 должен быть активен и привязана консоль, поэтому вы не можете не запускать дополнительный X-сервер в фоновом режиме и выполнять там внеэкранный рендеринг, но это всего лишь ограничение драйверов, а не X11, GLX или OpenGL.

Разрешены только библиотеки без внешних библиотек, как и GLEW, который я использую.

Вы можете статически связать GLEW со своей программой. Если вы хардкорщик, вы можете загрузить расширение вручную, но зачем вам это?

person datenwolf    schedule 24.09.2011