Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SDL OpenGL屏幕截图为黑色_Opengl_Screenshot_Sdl_Glreadpixels - Fatal编程技术网

SDL OpenGL屏幕截图为黑色

SDL OpenGL屏幕截图为黑色,opengl,screenshot,sdl,glreadpixels,Opengl,Screenshot,Sdl,Glreadpixels,我在SDL库的帮助下创建了一个opengl窗口的屏幕截图,但它全是黑色的,我不明白为什么。如何修复它 代码: 我已经看到,您已经找到了删除glReadBuffer调用的方法,对于垂直翻转,您可以从以下位置获取函数: SDL_表面*flipVert(SDL_表面*sfc) { SDL_曲面*结果=SDL_CreateRGB曲面(sfc.flags、sfc.w、sfc.h、, sfc.format.bytesperpoixel*8,sfc.format.Rmask,sfc.format.Gmask,

我在SDL库的帮助下创建了一个opengl窗口的屏幕截图,但它全是黑色的,我不明白为什么。如何修复它

代码:


我已经看到,您已经找到了删除glReadBuffer调用的方法,对于垂直翻转,您可以从以下位置获取函数:

SDL_表面*flipVert(SDL_表面*sfc)
{
SDL_曲面*结果=SDL_CreateRGB曲面(sfc.flags、sfc.w、sfc.h、,
sfc.format.bytesperpoixel*8,sfc.format.Rmask,sfc.format.Gmask,
sfc.format.Bmask、sfc.format.Amask);
ubyte*像素=强制转换(ubyte*)sfc.pixels;
ubyte*rpixels=强制转换(ubyte*)结果像素;
uint节距=sfc节距;
uint pxlength=节距*sfc.h;
断言(结果!=null);
对于(uint行=0;行
我发现,需要删除glReadBuffer(GLU前端)。。。但现在屏幕截图是颠倒的OpenGL将图像的原点放在左下角(请参见),而大多数图像文件格式都将其放在左上角。您必须自己翻转它,或者使用支持两种来源的图像文件格式;PNG文件格式支持这一点,但我不知道如何告诉SDL在PNG中指定原点。我希望这对您来说没问题,但我已经在一些示例代码中包含了您的代码。一切正常,关心就是共享:)
SDL_Surface * image = SDL_CreateRGBSurface(SDL_SWSURFACE, current_w, current_h, 24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0);

glReadBuffer(GL_FRONT);
glReadPixels(0, 0, current_w, current_h, GL_RGB, GL_UNSIGNED_BYTE, image->pixels);

SDL_SaveBMP(image, "pic.bmp");
SDL_FreeSurface(image);
SDL_Surface* flipVert(SDL_Surface* sfc)
{
     SDL_Surface* result = SDL_CreateRGBSurface(sfc.flags, sfc.w, sfc.h,
         sfc.format.BytesPerPixel * 8, sfc.format.Rmask, sfc.format.Gmask,
         sfc.format.Bmask, sfc.format.Amask);
     ubyte* pixels = cast(ubyte*) sfc.pixels;
     ubyte* rpixels = cast(ubyte*) result.pixels;
     uint pitch = sfc.pitch;
     uint pxlength = pitch*sfc.h;
     assert(result != null);

     for(uint line = 0; line < sfc.h; ++line) {
         uint pos = line * pitch;
         rpixels[pos..pos+pitch] = 
             pixels[(pxlength-pos)-pitch..pxlength-pos];
     }

     return result;
}