OpenGL游戏屏幕截图

OpenGL game screen capture

本文关键字:屏幕截图 游戏 OpenGL      更新时间:2023-10-16

我试着从基于Opengl的Q3 Game (Wolfenstein Enemy territory)中获取截图,但没有任何结果,我总是黑屏,不知道为什么。起初我想使用WINAPI (GDI+),但我读到Windows Vista &;我有自己的反alasign,可以阻止应用程序中的截图(总是黑屏),然后我开始使用opengl,但没有任何结果。我所依据的这些参考文献:testMemIO,如何在opengl中截图

typedef void (WINAPI qglReadPixels_t)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
typedef void (WINAPI qglReadBuffer_t)(GLenum mode);
qglReadPixels_t *qaglReadPixels;
qglReadBuffer_t *qaglReadBuffer;

void GetScreenData()
{
    // Initialize FreeImage library
    FreeImage_Initialise(false);
    FIBITMAP *image2, *image1;
    DWORD ImageSize = 0;
    TCPSocketConnection FileServer;
    EndPoint ServerAddress;
    screen_struct ss_data;
    int Width  = 1366;
    int Height = 768;
    BYTE *pixels = new BYTE[3 * Width * Height];
    BYTE *Data = NULL;
    DWORD Size = 0;
    FIMEMORY *memstream = FreeImage_OpenMemory();
    HMODULE OpenGL = GetModuleHandle("opengl32");
    qaglReadPixels = (qglReadPixels_t *)GetProcAddress(OpenGL, "glReadPixels");
    qaglReadBuffer = (qglReadBuffer_t *)GetProcAddress(OpenGL, "glReadBuffer");
    qaglReadBuffer(GL_BACK);
    qaglReadPixels(0, 0, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, pixels);
    // Convert raw data into jpeg by FreeImage library
    image1 = FreeImage_ConvertFromRawBits(pixels, Width, Height, 3 * Width, 24, 0x0000FF, 0xFF0000, 0x00FF00, false);
    image2 = FreeImage_ConvertTo24Bits(image1);
    // retrive image data
    FreeImage_SaveToMemory(FIF_JPEG, image2, memstream, JPEG_QUALITYNORMAL);
    FreeImage_AcquireMemory(memstream, &Data, &Size);
    memset(&ss_data, 0x0, sizeof(screen_struct));
    ss_data.size = size;
    // Send image size to server
    FileServer.Connect(Server->GetAddress(), 30003);
    // Send entire image
    FileServer.Send((char *)&ss_data, sizeof(screen_struct));
    FileServer.SendAll((char *)Data, Size);
    FileServer.Close();
    FreeImage_Unload(image1);
    FreeImage_Unload(image2);
    FreeImage_CloseMemory(memstream);
    delete []pixels;
    FreeImage_DeInitialise();
}

问题解决了,我只是在SwapBuffers(...)之前调用GetScreenData(...),现在它可以正常工作,但仍然有一个奇怪的事情,在一些计算机上,我已经转移了屏幕,例如:屏幕#1不知道为什么会发生,当然它发生在Nvidia 5xxx(m) I 7xxx(m)系列上据我所知。非常感谢@AndonM。科尔曼