OpenGL游戏截图 [英] OpenGL game screen capture

查看:588
本文介绍了OpenGL游戏截图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图从基于Opengl的第三局(Wolfenstein Enemy Teritory)获取屏幕截图,但没有任何结果,我总是有黑屏,不知道为什么。我想先使用WINAPI(GDI +),但我读到Windows Vista& 7有自己的antialasign阻止应用程序中的屏幕截图(总是黑屏),然后我开始使用opengl,但没有任何结果。我基于的这些引用:
testMemIO & ;
如何在opengl中截取屏幕截图

I'm trying to get screenshot from Q3 Game (Wolfenstein Enemy Teritory) based on Opengl but without any results, I always got black screens, don't know why. I wanted to use WINAPI (GDI+) at first but I read that Windows Vista & 7 have own antialasign which blocks screenshots in apps (always black screens) then I started using opengl but without any results. These references which I based on: testMemIO & How to take screenshot in 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();
}


推荐答案

调用 GetScreenData(...)之前 SwapBuffers(...)现在它工作正常,但仍有一个奇怪的事情,在一些电脑上我已经移动屏幕,例如:屏幕#1 不要知道为什么会发生,肯定它发生在Nvidia 5xxx(m)i 7xxx(m)系列,就我所知。
非常感谢@ AndonM.Coleman

Problem is solved, I just calling GetScreenData(...) before SwapBuffers(...) now it works correctly but there is still a weird thing, on some computers I'v got shifted screens, for example: Screen #1 Don't know why it happens, for sure it happens on Nvidia 5xxx(m) i 7xxx(m) series so far as I know. Big thanks for @AndonM.Coleman

这篇关于OpenGL游戏截图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆