Qual è il concetto e le differenze tra Framebuffer e Renderbuffer in OpenGL?


136

Sono confuso sul concetto di Framebuffer e Renderbuffer. So che devono essere renderizzati, ma voglio capirli prima dell'uso.

So che è necessario un buffer bitmap per memorizzare il risultato del disegno temporaneo. Il buffer posteriore. E l'altro buffer deve essere visto sullo schermo quando quei disegni sono in corso. Il buffer frontale. E girali e disegna di nuovo. Conosco questo concetto, ma è difficile collegare quegli oggetti a questo concetto.

Qual è il concetto e le differenze di essi?


7
Renderbuffer è componenti simili a canali (colore, stencil, profondità e così via) di Framebuffer. Vedi: developer.apple.com/iphone/library/documentation/3DDrawing/…
eonil

2
Il link è specifico per iPhone, ma i framebuffer sono ben spiegati.
j00hi,

Risposte:


62

Questa pagina ha alcuni dettagli che penso spieghino abbastanza bene la differenza. In primo luogo:

La destinazione di rendering finale della pipeline OpenGL è chiamata [il] framebuffer .

Mentre:

Oggetto Renderbuffer
Inoltre, l'oggetto renderbuffer è stato recentemente introdotto per il rendering offscreen. Permette di eseguire il rendering di una scena direttamente su un oggetto renderbuffer, invece di renderizzare un oggetto texture. Renderbuffer è semplicemente un oggetto di archiviazione dati contenente una singola immagine di un formato interno renderizzabile. Viene utilizzato per archiviare buffer logici OpenGL che non hanno il formato di trama corrispondente, come stencil o buffer di profondità.


196

L' oggetto Framebuffer non è in realtà un buffer, ma un oggetto aggregatore che contiene uno o più allegati, che a loro volta sono i buffer effettivi. È possibile comprendere Framebuffer come struttura a C in cui ogni membro è un puntatore a un buffer. Senza alcun allegato, un oggetto Framebuffer ha un ingombro molto basso.

Ora ogni buffer collegato a un Framebuffer può essere un Renderbuffer o una trama .

Il Renderbuffer è un buffer reale (un array di byte o interi, o pixel). I Renderbuffer memorizza i valori dei pixel in formato nativo, quindi è fuori dallo schermo ottimizzati per il rendering. In altre parole, disegnare su un Renderbuffer può essere molto più veloce che disegnare su una trama. Lo svantaggio è che i pixel usano un formato nativo, dipendente dall'implementazione, quindi la lettura da un Renderbuffer è molto più difficile della lettura da una trama. Tuttavia, una volta che un Renderbuffer è stato disegnato, è possibile copiarne il contenuto direttamente sullo schermo (o su un altro Renderbuffer , immagino), usando molto rapidamente le operazioni di trasferimento dei pixel. Ciò significa che un Renderbuffer può essere utilizzato per implementare in modo efficiente il modello a doppio buffer che hai citato.

I renderbuffer sono un concetto relativamente nuovo. Prima di loro, veniva utilizzato un Framebuffer per eseguire il rendering su una trama , che può essere più lenta perché una trama utilizza un formato standard. È ancora possibile eseguire il rendering su una trama, ed è abbastanza utile quando è necessario eseguire più passaggi su ciascun pixel per costruire una scena o disegnare una scena su una superficie di un'altra scena!

Il wiki OpenGL ha questa pagina che mostra maggiori dettagli e collegamenti.


13
Grazie! Spiegarlo come una specie di struttura e di puntatore ha molto più senso per me.
DouglasHeriot,

2
Questo è ancora un po 'confuso per me. Se renderbuffer consente solo una copia rapida su un altro buffer di rendering, non serve quasi a niente! Se devo eseguire una fase di post-elaborazione (come SSAO) non è più facile renderlo al framebuffer predefinito usando il rendering precedente a Textures piuttosto che renderizzarlo su un RenderBuffer e quindi copiarlo nuovamente sullo schermo?
CoffeDeveloper

4
I buffer di rendering non sono progettati per la post-elaborazione personalizzata. Possono essere utilizzati per memorizzare informazioni sulla profondità e sullo stencil per una procedura di disegno. Questo è possibile perché solo l'implementazione GPL stessa deve leggere i dati renderbuffer e tende ad essere più veloce delle trame, poiché utilizza un formato nativo. Se hai bisogno di post-elaborazione, usa le trame.
fernacolo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.