2013-05-06 3 views
1

Можно ли скрыть окно OpenGL, и рендеринг все еще запущен? Я использую glutHideWindow, который никогда не будет вызывать функцию отображения.Скрыть окно GLUT

Если это невозможно, возможно ли в программе изменить фокус текущего окна? Я хочу запустить программу opengl, но мне не нужно это окно. Фактически, я хочу использовать фреймбуфер, который обновляет opengl в каждом кадре в другой программе. Но всегда бывает неприятно переключаться между двумя программами. (У них обоих есть окно)

+0

Итак, как реализовать? –

+0

@ BЈовић: Он не имеет ничего общего с обратным вызовом дисплея. И ни один из ОП не может быть наивным. – datenwolf

+0

@ datenwolf Хорошо, это зависит от оконной системы. Мой опыт в том, что если вы выдаете рендеринг окна, он может быть повторно отображен - независимо от того, включено ли окно. –

ответ

5

Можно ли скрыть окно OpenGL, и рендеринг все еще работает?

Да и Нет для обеих частей вопроса.

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

Что вам нужно, это заставка для вытягивания.

Современный вариант: Объекты Framebuffer (FBOs), которые можно создавать в обычном контексте OpenGL, что может даже работать в скрытом окне. FBOs берут некоторые доступные вложения (визуализировать буферы, текстуры) и позволяют OpenGL рисовать их вместо этого в окне.

Более старый метод - это PBuffers, также широко поддерживаемый, но не такой простой в использовании, как FBOs.

Обратите внимание, что если вы хотите выполнять внеэкранную визуализацию в Linux/X11, X-сервер должен быть активным, то есть владеть VT, чтобы GPU фактически обрабатывал команды. Таким образом, вы не можете просто запустить X-сервер «в фоновом режиме», но другой X-сервер использует устройство отображения.

+0

@ BЈовић: Два комментария с плохим советом от вас. Пожалуйста, прекратите делать контрпродуктивные предложения. OP требует FBO или PBuffer. Нет необходимости в общей памяти (разделяемая память - это метод межпроцессного процесса, но это не то, что требует OP). – datenwolf

+0

Ошибка проверки владельца пикселя - это лучший случай. Я также могу предположить, что сбой текущего контекста, и все ресурсы OpenGL, возможно, придется перезагрузить в новый контекст, когда окно снова станет видимым. –

+0

@BenVoigt: Этот сценарий не допускается. Как GLX, так и Win32 GDI позволяют связывать контекст с невидимым (скрытым/немаркированным/неактивным). Операции рисования на drawable не определены, но все операции OpenGL, происходящие не на drawable, будут работать. Для PBuffers GLX указывает «поврежденное» состояние, которое очень похоже на поврежденное состояние обычных окон, т. Е. Требует полного перерисовки, поскольку содержимое не определено.Также из-за того, что один контекст OpenGL не привязан к единственному возможному уничтожению выделенного объекта, не будет нарушать сам контекст. – datenwolf

0

После создания окна вы можете использовать glutHideWindow() для перехода на экран. Затем вы по-прежнему показываете как номинальный и используете glReadPixels для чтения и получения буфера для его использования позже.

+0

Спасибо @Ast Derek. Мой английский плохой :) В следующий раз я буду более осторожен – diennv