Domanda

Sono il rendering OpenGL in un fuori campo oggetto framebuffer e desidera salvare come immagine. Si noti che il FBO è maggiore della dimensione del display. Posso rendere nel buffer fuori schermo e usarla come texture, che funziona. Posso "scorrere" questa texture più grande attraverso il display utilizzando un offset, il che mi rende fiducioso, che rendo in un contesto più grande della finestra.

Se salvo il buffer fuori schermo in un file immagine è sempre viene ritagliata. Il frammento di codice per il risparmio è:

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

Si prega di notare, che il contenuto dell'immagine viene ritagliata, la parte visibile è salvata correttamente (il che significa che nessun errore in formati di pixel, problemi GL_RGB etc.), ma lo spazio rimanente viene riempito con un colore.

Quindi, la mia domanda è - quello che sto facendo di sbagliato

?
È stato utile?

Soluzione

Finalmente ho risolto il problema.

Devo attivare il FBO per salvare il suo contenuto:

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

mentre solo selezionando l'OSA per glReadPixels tramite

glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);

non è sufficiente.

(Tutte le altre cose in cui corretta e testati, per esempio. Dimensioni viewport, larghezza e altezza di tampone, Texture immagine ecc.)

Altri suggerimenti

Due domande per iniziare: (? Per esempio stai cercando di salvare x immagine 1024 1024 Che taglia vuoi arrivare)? Come stai creando ImageSaver e sono sicuro che la tua larghezza e l'altezza sono corrette

Non stai facendo nulla di male, questo è stato un comportamento abbastanza comune con i driver grafici OpenGL per un lungo periodo - Mi ricordo di corsa contro esattamente lo stesso problema su nVidia Geforce 3 carte almeno un decennio fa, e ho adottato un soluzione simile -. rendering una texture fuori campo

Questo suona come avete la dimensione finestra sbagliato o qualcosa di simile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top