qua*_*ant 2 c++ opengl freeglut
我有一个使用OpenGL在窗口中运行的程序(带有freeglut 2.8.1的VS2012).基本上在每一个步骤(通过glutPostRedisplay从我的glutIdleFunc钩子调用运行)我调用我自己的draw函数,然后调用glFlush以显示结果.然后我调用我自己的screenShot函数,它使用glReadPixels函数将像素转储到tga文件.
此设置的问题是当窗口最小化时文件为空.也就是说,输出glReadPixels是空的; 我怎么能避免这个?
这是screenShot我正在使用的功能的副本(我不是版权所有者):
//////////////////////////////////////////////////
// Grab the OpenGL screen and save it as a .tga //
// Copyright (C) Marius Andra 2001 //
// http://cone3d.gz.ee EMAIL: cone3d@hot.ee //
//////////////////////////////////////////////////
// (modified by me a little)
int screenShot(int const num)
{
typedef unsigned char uchar;
// we will store the image data here
uchar *pixels;
// the thingy we use to write files
FILE * shot;
// we get the width/height of the screen into this array
int screenStats[4];
// get the width/height of the window
glGetIntegerv(GL_VIEWPORT, screenStats);
// generate an array large enough to hold the pixel data
// (width*height*bytesPerPixel)
pixels = new unsigned char[screenStats[2]*screenStats[3]*3];
// read in the pixel data, TGA's pixels are BGR aligned
glReadPixels(0, 0, screenStats[2], screenStats[3], 0x80E0,
GL_UNSIGNED_BYTE, pixels);
// open the file for writing. If unsucessful, return 1
std::string filename = kScreenShotFileNamePrefix + Function::Num2Str(num) + ".tga";
shot=fopen(filename.c_str(), "wb");
if (shot == NULL)
return 1;
// this is the tga header it must be in the beginning of
// every (uncompressed) .tga
uchar TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0};
// the header that is used to get the dimensions of the .tga
// header[1]*256+header[0] - width
// header[3]*256+header[2] - height
// header[4] - bits per pixel
// header[5] - ?
uchar header[6]={((int)(screenStats[2]%256)),
((int)(screenStats[2]/256)),
((int)(screenStats[3]%256)),
((int)(screenStats[3]/256)),24,0};
// write out the TGA header
fwrite(TGAheader, sizeof(uchar), 12, shot);
// write out the header
fwrite(header, sizeof(uchar), 6, shot);
// write the pixels
fwrite(pixels, sizeof(uchar),
screenStats[2]*screenStats[3]*3, shot);
// close the file
fclose(shot);
// free the memory
delete [] pixels;
// return success
return 0;
}
Run Code Online (Sandbox Code Playgroud)
那么无论Windows是否决定在显示器上实际显示内容,我如何将屏幕截图打印到TGA文件?
注意:因为我试图保持模拟进度的可视化记录,所以我需要打印每一帧,无论它是否被渲染.我意识到最后的陈述有点矛盾,因为我需要渲染帧以产生screengrab.改写; 我需要glReadPixels(或一些替代功能)在每一步产生我的程序的更新状态,以便我可以将它打印到文件,无论窗口是否会选择显示它.
| 归档时间: |
|
| 查看次数: |
1481 次 |
| 最近记录: |