10 Stimmen

Problem beim Speichern von OpenGL-FBOs, die größer als das Fenster sind

Ich rendere in ein OpenGL Offscreen Framebuffer Objekt und möchte es als Bild speichern. Beachten Sie, dass die FBO größer ist als die Anzeigegröße. Ich kann in den Offscreen-Puffer rendern und ihn als Textur verwenden, was funktioniert. Ich kann "scrollen" diese größere Textur durch die Anzeige mit einem Offset, die mich zuversichtlich, dass ich in einem größeren Kontext als das Fenster zu rendern macht.

Wenn ich den Offscreen-Puffer in einer Bilddatei speichere, wird er immer abgeschnitten. Das Codefragment zum Speichern lautet:

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); 
} 

Bitte beachten Sie, dass der Bildinhalt beschnitten wird, der sichtbare Teil korrekt gespeichert wird (d.h. keine Fehler in den Pixelformaten, GL_RGB-Probleme usw.), aber der restliche Raum mit einer Farbe gefüllt wird.

Meine Frage ist also: Was mache ich falsch?

11voto

razong Punkte 1269

Endlich habe ich das Problem gelöst.

Ich muss die fbo aktivieren, um ihren Inhalt zu speichern:

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

und wählt nur die fbo für glReadPixels über

glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);

reicht nicht aus.

(Alle anderen Dinge waren korrekt und wurden getestet, z. B. Viewport-Größen, Breite und Höhe des Puffers, Bildtextur usw.)

0voto

MarkusQ Punkte 21488

Zwei Fragen für den Anfang: Wie erstellen Sie imageSaver und sind Sie sicher, dass Ihre Breite und Höhe korrekt sind (z. B. versuchen Sie, ein 1024 x 1024 Bild zu speichern? Welche Größe erhalten Sie)?

0voto

Cruachan Punkte 15597

Sie machen nichts falsch, dieses Verhalten ist bei OpenGL-Grafiktreibern schon lange üblich - ich erinnere mich, dass ich vor mindestens einem Jahrzehnt mit genau demselben Problem auf nVidia Geforce 3-Karten konfrontiert war, und ich habe eine ähnliche Lösung gewählt - Rendering auf eine Offscreen-Textur.

0voto

Maurice Gilden Punkte 1904

Das klingt, als hätten Sie die falsche Ansichtsgröße oder etwas Ähnliches.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X