So here’s some quick code to save a screenshot of your OpenGL game in a TGA file.
bool save_screenshot(string filename, int w, int h) { //This prevents the images getting padded // when the width multiplied by 3 is not a multiple of 4 glPixelStorei(GL_PACK_ALIGNMENT, 1); int nSize = w*h*3; // First let's create our buffer, 3 channels per Pixel char* dataBuffer = (char*)malloc(nSize*sizeof(char)); if (!dataBuffer) return false; // Let's fetch them from the backbuffer // We request the pixels in GL_BGR format, thanks to Berzeger for the tip glReadPixels((GLint)0, (GLint)0, (GLint)w, (GLint)h, GL_BGR, GL_UNSIGNED_BYTE, dataBuffer); //Now the file creation FILE *filePtr = fopen(filename.c_str(), "wb"); if (!filePtr) return false; unsigned char TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0}; unsigned char header[6] = { w%256,w/256, h%256,h/256, 24,0}; // We write the headers fwrite(TGAheader, sizeof(unsigned char), 12, filePtr); fwrite(header, sizeof(unsigned char), 6, filePtr); // And finally our image data fwrite(dataBuffer, sizeof(GLubyte), nSize, filePtr); fclose(filePtr); free(dataBuffer); return true; } |
I’ve been using this on my projects and it works, although I read a couple of times it’s better to use p-buffer or FBO, but I leave that for you to research.
EDIT (24/03/2016) : Thanks to Roger Dahl for pointing out the missing free(), leading to memory leaks
Hi, thanks for your article! Just one note – if you set GL_BGR, you don’t have to swap the pixels, which should shorten the code a little and save some computional resources. 🙂
Thanks for the tip, changed the code and credit you for the changes 🙂
why did i get black screen?
That can happen for numerous reasons. Are you getting any error?
no error but getting black screen need to change anything?
I got CD CD CD CD CD in the file? It means uninitialized buffer in debug mode of Visual studio
When opening the image in a image viewer does it appear corrupted?