визуальный Как я могу сохранить OpenGL отрисовки с OpenGL?

Я рисую экран с помощью команд OpenGL. И я должен сохранить этот экран в формате .bmp или .png. Но я не могу этого сделать. Я использую glReadpixels, но не могу продолжить. Как я могу сохранить этот рисунок в C ++ с OpenGL?

1

Решение

Вот оно! Вы должны включить WinGDI.h (который, я думаю, GL сделает это!)

void SaveAsBMP(const char *fileName)
{
FILE *file;
unsigned long imageSize;
GLbyte *data=NULL;
GLint viewPort[4];
GLenum lastBuffer;
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
bmfh.bfType='MB';
bmfh.bfReserved1=0;
bmfh.bfReserved2=0;
bmfh.bfOffBits=54;
glGetIntegerv(GL_VIEWPORT,viewPort);
imageSize=((viewPort[2]+((4-(viewPort[2]%4))%4))*viewPort[3]*3)+2;
bmfh.bfSize=imageSize+sizeof(bmfh)+sizeof(bmih);
data=(GLbyte*)malloc(imageSize);
glPixelStorei(GL_PACK_ALIGNMENT,4);
glPixelStorei(GL_PACK_ROW_LENGTH,0);
glPixelStorei(GL_PACK_SKIP_ROWS,0);
glPixelStorei(GL_PACK_SKIP_PIXELS,0);
glPixelStorei(GL_PACK_SWAP_BYTES,1);
glGetIntegerv(GL_READ_BUFFER,(GLint*)&lastBuffer);
glReadBuffer(GL_FRONT);
glReadPixels(0,0,viewPort[2],viewPort[3],GL_BGR,GL_UNSIGNED_BYTE,data);
data[imageSize-1]=0;
data[imageSize-2]=0;
glReadBuffer(lastBuffer);
file=fopen(fileName,"wb");
bmih.biSize=40;
bmih.biWidth=viewPort[2];
bmih.biHeight=viewPort[3];
bmih.biPlanes=1;
bmih.biBitCount=24;
bmih.biCompression=0;
bmih.biSizeImage=imageSize;
bmih.biXPelsPerMeter=45089;
bmih.biYPelsPerMeter=45089;
bmih.biClrUsed=0;
bmih.biClrImportant=0;
fwrite(&bmfh,sizeof(bmfh),1,file);
fwrite(&bmih,sizeof(bmih),1,file);
fwrite(data,imageSize,1,file);
free(data);
fclose(file);
}
4

Другие решения

Если вы не чувствуете себя особенно амбициозным (или, возможно, мазохистским), вы, вероятно, захотите использовать такую ​​библиотеку, как DevIL это уже поддерживает это. Текущая версия может загружать и / или сохранять в форматах PNG и BMP, а также несколько десятков других.

По сравнению с чем-то вроде IJG, он гораздо более ориентирован на работу с OpenGL или DirectX (например, он может загружать файл довольно напрямую в текстуру или наоборот).

1

Одна вещь должна быть исправлена ​​в:

bmih.biXPelsPerMeter = bmih.biYPelsPerMeter = 0;

В противном случае редактирование некоторых изображений может не открыться правильно.

1

Я знаю, что вы запрашиваете растровые форматы, но косвенным способом было бы сначала выводить векторную графику через gl2ps (http://www.geuz.org/gl2ps/). Примеры использования предоставляются вместе с пакетом и на сайте (http://www.geuz.org/gl2ps/#tth_sEc3).

Затем векторный вывод можно преобразовать в формат по вашему выбору, используя другой инструмент (Inkscape, Image / GraphicsMagick и т. Д.) Или библиотеку. Дополнительным преимуществом является то, что в будущем вы можете преобразовывать в растровые изображения любого разрешения.

0
По вопросам рекламы [email protected]