Как я могу получить снимок экрана из невидимого окна приложения, которое использует OpenGL под X?

Я пытаюсь сделать снимок экрана невидимого окна под X.

Моя первая попытка заключалась в том, чтобы захватить окно с помощью xwd или import (из ImageMagick). К сожалению, когда окно находится под некоторыми другими окнами, скрытые части становятся черными. Что еще хуже, когда окно не на текущем рабочем столе, я получаю BadMatch ошибку.

Следующей мыслью было использовать Xnest, который создаст новый экземпляр X только для этого приложения, и он всегда будет наверху. И натыкаюсь на другую проблему. Xnest не поддерживает OpenGL.

Немного поискав в Google, я нахожу [Xephyr] [1], который поддерживает OpenGL ... но без аппаратного ускорения, поэтому он непригоден, так как убивает мой процессор.

То же самое и с Xvfb, который также использует ЦП для рендеринга OpenGL. Ниже приведена часть вывода glxinfo:

OpenGL vendor string: Mesa Project
OpenGL renderer string: Software Rasterizer
OpenGL version string: 2.1 Mesa 7.8.2
OpenGL shading language version string: 1.20

Единственное, что я могу придумать, - это каким-то образом использовать Xlib, чтобы заставить мой X-сервер отображать окно в pixbuf. К сожалению, я почти ничего не знаю о Xlib.

Итак, мой вопрос: как я могу получить снимок экрана из невидимого окна приложения, которое использует OpenGL под X?

На данный момент я могу сделать снимок экрана только с помощью [Python-Xlib] [2] и PIL < / а>. Также приемлемо любое другое решение с использованием Python или C.


person elmo    schedule 24.06.2010    source источник
comment
В чем проблема использования glReadPixels в приложении GL?   -  person Dr. Snoopy    schedule 24.06.2010
comment
У меня нет исходного кода.   -  person elmo    schedule 15.09.2010


Ответы (1)


Насколько я знаю, это невозможно. Проблема в том, что пикселей, которые вы пытаетесь сохранить, буквально не существует. X-сервер и видеодрайвер все равно избегают рендеринга невидимого материала.

Как упоминает Матиас, если вы можете управлять приложением GL, то, вероятно, вы могли бы делать что-то в GL. например Расширение объектов framebuffer позволяет отображать текстуры вне экрана.

person Havoc P    schedule 23.07.2010