能否将glReadPixels提取出来的一系列OpenGL像素数据直接写入一个avi文件生成视频呢??高手指点
如题这个函数是将OpenGL场景写入一个bmp文件,能不能向这个函数一样实现将一系列读取的数据直接写入avi文件中呢??
void grab(int x0, int y0, int WindowWidth, int WindowHeight, char* filename)
{
unsigned char bmp_header[]={0x42, 0x4D, 0x66, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,0x00, 0x00,
0x58, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01,
0x00, 0x18, 0x00, 0x00, 0x00,0x00, 0x00, 0x30, 0x48,
0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0xC4, 0x0E, 0x00,
0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
int BMP_Header_Length=54; //位图信息头的长度
FILE* pWritingFile;
GLubyte* pPixelData;
// GLubyte BMP_Header[54];
GLint i, j;
GLint PixelDataLength;
// 计算像素数据的实际长度
i = WindowWidth * 3; // 得到每一行的像素数据长度
while( i%4 != 0 ) // 补充数据,直到i是的倍数
++i; // 本来还有更快的算法,
// 但这里仅追求直观,对速度没有太高要求
PixelDataLength = i * WindowHeight;
// 分配内存和打开文件
pPixelData = (GLubyte*)malloc(PixelDataLength);
if( pPixelData == 0 )
{
//TRACE("在grab()函数中分配内存失败!");
exit(0);
}
pWritingFile = fopen(filename, "wb");
if( pWritingFile == 0 )
{
//TRACE("在grab()函数中打开文件失败!");
exit(0);
}
// 读取像素
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glReadPixels(x0, y0, WindowWidth, WindowHeight,GL_BGR_EXT, GL_UNSIGNED_BYTE, pPixelData);
// 把位图文件头复制为新文件的文件头
fwrite(bmp_header, 54, 1, pWritingFile);
fseek(pWritingFile, 0x0012, SEEK_SET);
i = WindowWidth;
j = WindowHeight;
fwrite(&i, sizeof(i), 1, pWritingFile);
fwrite(&j, sizeof(j), 1, pWritingFile);
// 写入像素数据
fseek(pWritingFile, 0, SEEK_END);
fwrite(pPixelData, PixelDataLength, 1, pWritingFile);
// 释放内存和关闭文件
fclose(pWritingFile);
free(pPixelData);
}