problema durante il salvataggio openGL FBO più grande di finestra
-
22-08-2019 - |
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
?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.