получение полного скриншота рабочего стола из GPU - PullRequest
11 голосов
/ 29 июня 2011

Я использовал функцию Windows 100 BitBlt для выполнения захвата экрана.

Однако есть много недостатков:

  1. DWM и Aero вызывают значительное замедление (3 мс -> 35 мс просто для вызова BitBlt) - чтобы обойти это, потребуется отключить Aero, чего я просто не хотел бы делать. Экран мерцает и все вокруг меняется.
  2. Данные должны быть повторно перенесены в графический процессор для загрузки данных в виде текстуры
  3. Многослойные окна не могут быть захвачены без флага CAPTUREBLT. Когда включено, курсор мыши мигает при захвате. Это может показаться незначительной проблемой, но это очень раздражает, когда приложение без ошибок. В качестве обходного пути для этого я намерен визуализировать многослойное окно в качестве дополнительного курсора.

Я уже использую OpenGL для отображения и управления захваченными данными экрана. BitBlt дает мне данные о пикселях, и их относительно легко загрузить в текстуру. Однако это немного абсурдно, потому что я вручную повторно отправляю данные обратно в GPU, когда они должны быть доступны на GPU для начала. Данные наверняка есть, но попытка получить к ним другое дело.

Я предполагаю, что эта функциональность не входит в список дел (или, скорее всего, в любом списке) для поставщиков, но я хотел бы спросить тех, кто в курсе, есть ли какие-либо положения, предоставляемые AMD ( ATI) или NVidia в своих драйверах для чтения экранного буфера (например, в контексте OpenGL). Я просто не знаю достаточно о современной архитектуре графического процессора, чтобы знать, с чего начать искать ответы.

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

OpenGL может только читать контекстный кадровый буфер (окно) и любые созданные вами кадровые буферы или буферные буферы.OpenGL не может касаться рабочего стола или любого другого окна.

1 голос
/ 29 июня 2011

Это интересный вопрос. К сожалению, я не думаю, что это действительно поддерживается. Я нашел сообщения об определенном уровне успеха при создании полноэкранного невидимого окна и чтении данных пикселей с помощью glReadPixels:

http://www.virtualdub.org/blog/pivot/entry.php?id=142

http://www.opentk.com/node/2430

Однако я считаю, что поведение при этом не определено и будет работать только на определенных конфигурациях оборудования / ОС.

...