Захватывает скриншот оконного окна OpenGL в AutoIt? - PullRequest
1 голос
/ 23 ноября 2011

Для моего класса графики мне нужно сопоставить вывод образца OpenGL идеальным для пикселя способом.

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

Я знаю, что могу использовать функцию screencapture, но я не уверен, как получить точные координаты и размер OpenGLобласть окна (не строка заголовка / окружающее окно).

Если бы кто-нибудь мог мне помочь, это было бы здорово.Или, если кто-нибудь может придумать более простое решение, чем AutoIt, и указать мне правильное направление, это тоже было бы здорово.

РЕДАКТИРОВАТЬ: у меня также нет доступа к исходному коду примераПрограмма вывода.

Ответы [ 2 ]

3 голосов
/ 23 ноября 2011

AutoIt - довольно хороший инструмент для этой работы. Я думаю, что вы уже нашли _ScreenCapture в файле справки, он имеет параметры для: X слева, Y сверху, X справа и Y снизу координат. Однако функция _ScreenCapture сохраняет в файл. Я создал библиотеку, в которой вы можете захватить часть экрана или окно и сохранить его в памяти. Затем вы можете получить цвета пикселей из памяти и сравнить их с существующими пикселями. Вы можете найти его здесь: http://www.autoitscript.com/forum/topic/63318-get-or-read-pixel-from-memory-udf-pixelgetcolor-au3/

Часть окна, которая не содержит заголовок и границы, называется «клиентской областью». Вы можете получить ширину и высоту клиентской области с помощью WinGetClientSize. Кроме того, вы можете использовать ControlGetPos для элемента управления OpenGL, чтобы получить X и Y относительно окна, а также ширину и высоту элемента управления OpenGL. В сочетании с WinGetPos вы сможете рассчитывать значения, необходимые для _ScreenCapture. Вы должны быть в состоянии найти хороший подход, если используете инструмент «Информация о окне AutoIt».

Наконец, простое и короткое решение, которое дает вам небольшой контроль, но может быть именно тем, что вам нужно, - это функция PixelChecksum. Получив координаты части OpenGL, вы можете использовать PixelChecksum и получить значение, соответствующее пикселям экрана (контрольная сумма пикселей). Затем вы можете сравнить это значение с предварительно записанным значением, чтобы определить, совпадают ли пиксели на экране. Посмотрите файл справки Autoit PixelChecksum для примера.

0 голосов
/ 23 ноября 2011

Если вы хотите захватить данные из буфера OpenGL, вот как вы можете сделать это с устаревшим OpenGL (версия 1.2 или около того)

glFinish();
glReadBuffer(GL_FRONT);
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
glReadPixels(ox, oy, w, h, mode, GL_UNSIGNED_BYTE, img);

где:

  • ox и oy являются источниками x и y
  • w и h - ширина и высота
  • mode - режим, такой как GL_BGR, если вы хотите сохранить в BMP
  • img - указатель на unsigned int * для копирования изображения в

Вы можете выполнить поиск glReadPixels в Интернете и просмотреть ссылку для получения дополнительной информации.

...