1. 현재 프레임의 이미지 버퍼 값을 가져와 BMP 파일로 저장하는 코드
void screen_dump(int W, int H)
{
//W: window with H: window height
char pixel_data[W*H*300]
glReadPixels(0, 0, W, H, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixel_data);
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
char buff[256];
char *filename = "filename.bmp";
FILE *out = fopen(filename, "wb");
char *data = pixel_data;
memset(&bf, 0, sizeof(bf));
memset(&bi, 0, sizeof(bi));
bf.bfType = 'MB';
bf.bfSize = sizeof(bf) + sizeof(bi) + W*H* 3;
bf.bfOffBits = sizeof(bf) + sizeof(bi);
bi.biSize = sizeof(bi);
bi.biWidth = W;
bi.biHeight = H;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biSizeImage = W*H* 3;
fwrite(&bf, sizeof(bf), 1, out);
fwrite(&bi, sizeof(bi), 1, out);
fwrite(data, sizeof(unsigned char), H*W* 3, out);
fclose(out);
}
2. 다수의 프레임을 저장하고 싶은 경우
위 함수를 무조건 반복해서 사용할 경우, 파일 write에 걸리는 시간으로 인해 버퍼의 데이터가 원하는데로 저장되지 않음
따라서, 원하는 프레임 수에 맞춰 buffer를 늘리고 렌더링이 모두 끝나고 나서 반복해 저장하는 형식으로 수행해야 함
//원하는 프레임마다 front 버퍼의 값을 읽어 pixel_data배열에 저장하는 함수
void read_screen_data(int W, int H, int framenumber)
{
int index = framenumber / 20;
glReadBuffer(GL_FRONT);
glReadPixels(0, 0, W, H, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixel_data[index]);
printf("read %d frame's pixel data\n", framenumber);
}
//프로그램이 끝나고 난 뒤 한번에 저장하는 코드
void screendump(int W, int H) {
char *ss = (char*)malloc(sizeof(char) * 100);
char *filename = (char*)malloc(sizeof(char) * 100);
for (int i = 0; i < MAX_FRAME_SIZE; i++)
{
char buff[256];
sprintf(buff, "%d", i);
char *file = strcat(buff, ".bmp");
FILE *out = fopen(file, "wb");
char *data = pixel_data[i];
memset(&bf, 0, sizeof(bf));
memset(&bi, 0, sizeof(bi));
bf.bfType = 'MB';
bf.bfSize = sizeof(bf) + sizeof(bi) + W*H* 3;
bf.bfOffBits = sizeof(bf) + sizeof(bi);
bi.biSize = sizeof(bi);
bi.biWidth = W;
bi.biHeight = H;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biSizeImage = W*H* 3;
fwrite(&bf, sizeof(bf), 1, out);
fwrite(&bi, sizeof(bi), 1, out);
fwrite(data, sizeof(unsigned char), H*W* 3, out);
fclose(out);
}
'개발 > OpenGL' 카테고리의 다른 글
GLFW, GLEW, GLM을 사용하는 프로젝트 세팅하기 (0) | 2018.04.17 |
---|---|
OpenGL 애니메이션 처리하기(더블 버퍼링) (0) | 2016.12.13 |
OpenGL 점,선 그리기 (1) | 2016.01.14 |
OpenGL 1.0 시작하기 (0) | 2015.12.30 |