проблема сохранения openGL FBO больше окна - PullRequest
10 голосов
/ 25 марта 2009

Я выполняю рендеринг в объект закадрового буфера OpenGL и хочу сохранить его как изображение. Обратите внимание, что FBO больше, чем размер дисплея. Я могу сделать рендеринг в внеэкранный буфер и использовать его как текстуру, которая работает. Я могу «прокрутить» эту большую текстуру по дисплею, используя смещение, что позволяет мне быть уверенным, что я рендерим в более широкий контекст, чем окно.

Если я сохраняю внеэкранный буфер в файл изображения, он всегда обрезается. Фрагмент кода для сохранения:

void ofFBOTexture::saveImage(string fileName) { 
    glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 
    // get the raw buffer from ofImage
    unsigned char* pixels = imageSaver.getPixels();
    glReadPixels(0, 0, 1024, 1024, GL_RGB, GL_UNSIGNED_BYTE, pixels); 

    imageSaver.saveImage(fileName); 
} 

Обратите внимание, что содержимое изображения обрезано, видимая часть сохранена правильно (что означает отсутствие ошибок в форматах пикселей, проблемы GL_RGB и т. Д.), Но оставшееся пространство заполнено одним цветом.

Итак, мой вопрос - что я делаю не так?

Ответы [ 4 ]

11 голосов
/ 26 марта 2009

Наконец я решил проблему.

Я должен активировать fbo для сохранения его содержимого:

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
// save code
...
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

при выборе только fbo для glReadPixels через

glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);

не достаточно.

(Все остальное, где правильно и проверено, например, размеры области просмотра, ширина и высота буфера, текстура изображения и т. Д.)

0 голосов
/ 25 марта 2009

Вы не делаете ничего плохого, это было довольно распространенным поведением с графическими драйверами OpenGL в течение длительного времени - я вспоминаю, что столкнулся с точно такой же проблемой на картах nVidia Geforce 3, по крайней мере, десять лет назад, и я принял аналогичное решение - рендеринг в закадровую текстуру.

0 голосов
/ 26 марта 2009

Похоже, у вас неправильный размер области просмотра или что-то подобное.

0 голосов
/ 25 марта 2009

Два вопроса для начала: как вы создаете imageSaver и уверены ли вы, что ваши ширина и высота правильные (например, вы пытаетесь сохранить изображение размером 1024 x 1024?

...