Как сохранить рендеринг OpenGL в файл bmp в c ++ под окнами? [Дубликат]

__proto__ является базой для построения prototype и функции-конструктора, например: function human(){} имеет prototype, который совместно используется через __proto__ в новом экземпляре функции-конструктора. Более подробное чтение здесь

1
задан Bart 11 March 2012 в 19:36
поделиться

4 ответа

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

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
ответ дан chakmeshma 21 August 2018 в 05:21
поделиться

Необходимо зафиксировать одно:

bmih.biXPelsPerMeter = bmih.biYPelsPerMeter = 0;

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

1
ответ дан BLooM2 21 August 2018 в 05:21
поделиться

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

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

1
ответ дан Jerry Coffin 21 August 2018 в 05:21
поделиться
  • 1
    Я должен использовать библиотеку opengl. Разве это невозможно? – golazo 11 March 2012 в 20:20
  • 2
    Вы используете DevIL вместе с OpenGL. Можно читать пиксели назад с помощью glReadPixels, затем поместить заголовок на передний план, вставить прокладку по мере необходимости и сохранить как файл BMP, но OpenGL не предоставляет ничего, чтобы поддерживать его напрямую. – Jerry Coffin 11 March 2012 в 20:23
  • 3
    как я могу использовать DevIL? ты можешь мне помочь – golazo 11 March 2012 в 20:30
  • 4
    Я связался с сайтом, где вы можете скачать его. Он содержит довольно хорошую документацию. Если у вас возникнут определенные проблемы, вероятно, лучше спросить о них в отдельных вопросах. – Jerry Coffin 11 March 2012 в 20:34
  • 5
    может у меня использовать эту библиотеку. с glReadpixels () – golazo 12 March 2012 в 09:45

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

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

0
ответ дан Not Sure 21 August 2018 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: