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