Сделайте скриншот игры, используя OpenGL с C # - PullRequest
2 голосов
/ 08 марта 2011

Я искал, как сделать снимок экрана с игрой, которая использует полноэкранный режим, а также использует OpenGL. Если я использую CopyFromScreen или BitBlt, игровой экран не появится, и я увижу только то, что находится за игрой. Я читал некоторые учебники об этом, но они включают перехват DLL и немного C ++. Есть ли способ сделать это с помощью чисто C #? (Или с некоторыми ссылками ...)

1 Ответ

1 голос
/ 09 марта 2011

BitBlt с использованием HDC экрана (передайте NULL в функцию GetDC) - ваш лучший выбор, если вы не хотите использовать подключаемую DLL.Если это не сработает, у вас останется несколько вариантов.

glReadPixels не будет работать именно так.Вам нужен GL-контекст приложения, являющийся текущим контекстом в вашем потоке, в противном случае вы получите черное изображение в лучшем случае и ошибку сегментации в среднем случае.wglShareLists или wglCopyContext и тому подобное вам тоже не помогут, потому что вы можете совместно использовать контекст только в рамках одного и того же процесса .

Вот где начинается перехват DLL. По сути, вы делаете DLLэто будет помещено в папку программы, которая экспортирует те же символы, что и DLL-библиотека OpenGL, и просто перенаправляет их все в оригинал (просто, да!).
Однако для SwapBuffers вы бы сделали немного больше.Сначала вы перенаправите функцию в оригинал, а затем выполните свои glReadPixels.Как это бывает, когда вызывается эта функция, контекст GL обязательно актуален в вашем потоке, поэтому он будет работать.Кроме того, поскольку SwapBuffers только что выполнил свою работу, вам гарантировано, что все вызовы отрисовки, принадлежащие предыдущему кадру, завершены, и полное изображение теперь находится в переднем буфере.

...