2012-10-15 16 views
7

Non molto tempo fa, ho provato un programma da una guida OpenGL che si diceva fosse a doppio buffer; mostrava un rettangolo rotante sullo schermo. Sfortunatamente, non ho più il libro e non ho trovato una chiara e semplice definizione di cosa sia un buffer in generale. La mia ipotesi è che sia un "luogo" per disegnare cose, dove usare molto potrebbe essere come stratificare?Che cos'è esattamente un buffer in OpenGL e come posso utilizzarne più a mio vantaggio?

Se questo è il caso, mi chiedo se posso utilizzare più buffer a mio vantaggio per un programma di ritaglio poligonale. Ho una piccola finestra che consente all'utente di disegnare poligoni sullo schermo, oltre a un'utilità per trascinare e disegnare una casella di selezione sopra i poligoni. Quando l'utente ha disegnato il rettangolo di selezione e lascia andare il mouse, i poligoni verranno ritagliati in base ai limiti del rettangolo.

che è fattibile abbastanza, ma voglio anche che l'utente sia in grado di ricominciare da capo: quando si preme il tasto Esc, la casella clip dovrebbe scomparire, ei poligoni originali devono essere ripristinati. Dato che sto facendo cose pixel per pixel, mi sembra molto difficile capire come cambiare i colori dei pixel rettangolari in nero come lo sfondo o il colore di un particolare poligono, a seconda di dove sono stati disegnati (a meno che non trovi un modo per salvare i colori quando viene disegnato ogni pixel di poligono, ma sembra fuori bordo). Mi chiedevo se sarebbe stato utile dare al rettangolo il suo buffer, nella speranza che si comportasse come una sorta di strato trasparente che potrebbe essere facilmente cancellato (?) È questo il modo in cui i buffer possono essere usati, o ho bisogno trovare un'altra soluzione?

risposta

8

OpenGL sa più tipi di buffer:

  • frame buffer: Porzioni di memoria alla quale le operazioni di disegno sono dirette cambiando i valori dei pixel nel buffer. OpenGL di default dispone di buffer su schermo, che possono essere suddivisi in un fronte e un backbuffer, in cui le operazioni di disegno avvengono invisibili sul backbuffer e vengono invertite in primo piano quando finisce. In aggiunta a ciò OpenGL utilizza un buffer di profondità per l'implementazione di Z di test di profondità, un buffer di stencil usato per limitare il rendering a cut-out (= stencil) come le porzioni selezionate del framebuffer. C'erano tamponi ausiliari e di accumulo. Tuttavia, questi sono stati sostituiti dai cosiddetti oggetti framebuffer, che sono oggetti creati dall'utente, che combinano diverse trame o renderbuffer in nuovi framebuffer a cui è possibile eseguire il rendering.

  • Renderbuffer: destinazioni di rendering create dall'utente, da allegare agli oggetti framebuffer.

  • Oggetti buffer (vertice e pixel): archiviazione dati definita dall'utente. Utilizzato per la geometria e i dati di immagine.

  • chiave: chiave sono sorta di buffer, cioè esse contengono dati, che possono essere fonti in operazioni di disegno

L'approccio comune con OpenGL è quello di rerender tutta la scena ogni volta che cambia qualcosa. Se vuoi salvare queste operazioni di disegno, puoi copiare il contenuto del framebuffer su una texture e poi disegnare quella texture su un singolo quad e sovrascriverlo con il rettangolo di elastico selezionato.