Как я могу получить скриншот из невидимого окна приложения, которое использует OpenGL под X? - PullRequest
0 голосов
/ 24 июня 2010

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

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

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

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

То же самое касается Xvfb, который также использует CPU для рендеринга 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.

1 Ответ

0 голосов
/ 23 июля 2010

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

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

...