2012-01-23 9 views
5

Per chiarire, quando dico 'framebuffer predefinito' intendo quello fornito dal sistema di finestre e ciò che finisce sul monitor.Miscela FBO sul framebuffer predefinito

Per migliorare le velocità di rendering per un'app CAD, sono riuscito a separare gli elementi 3D da quelli 2D gestiti da Qt e ora vengono resi ciascuno nel proprio FBO. Quando arriva il momento di farli apparire sullo schermo, metto l'FBO 3D sull'FB predefinito, e poi voglio fondere il mio FBO 2D su di esso.

Ho ottenuto la parte blitting bene, ma non riesco a vedere come si fondono il mio FBO 2D su di esso? Entrambi gli FBO sono identici per dimensioni e formato e sono entrambi uguali all'FB predefinito.

Sono sicuro che è un'operazione semplice, ma non riesco a trovare nulla in rete - presumibilmente mi manca il termine giusto per quello che sto cercando di fare. Anche se sto usando Qt, posso usare comandi OpenGL nativi senza problemi.

risposta

7

Un'operazione di blit è in definitiva un'operazione di copia di pixel. Se vuoi sovrapporre un'immagine a un'altra, non puoi confonderla. È invece necessario eseguire il rendering di un quad a schermo intero come trama e utilizzare proper blending parameters per l'operazione di fusione.

+0

Questo sembra proprio orribilmente inefficiente però, ho due array di valori di pixel (i buffer) di uguali dimensioni, in definitiva tutto che debba fare è applicare un'operazione matematica di fondere un elemento di una di esse l'elemento corrispondente dell'altro. OpenGL in realtà tratta solo gli FBO come trame? – cmannett85

+0

@ il rendering di cbamber85 per la trama non sarebbe inefficiente –

+1

@ cbamber85: "OpenGL in realtà tratta solo gli FBO come trame?" Gli FBO sono solo contenitori per immagini. Alleghi immagini agli FBO, ma l'FBO stesso non li possiede. Le immagini provengono da altri oggetti: trame e renderbuffer. E tuttavia "inefficiente" potrebbe sembrare, il rendering di un'immagine sopra l'altra è estremamente veloce. Nessuna trasformazione dei vertici. Nient'altro che il campionamento delle texture nello shader dei frammenti. Inoltre, l'API non ti offre un altro modo per farlo, quindi è tanto efficiente quanto diventa. –

1

È possibile utilizzare GL_EXT_framebuffer_blit in blit contenuto dell'oggetto framebuffer nel framebuffer dell'applicazione (o in qualsiasi altro). Sebbene, come indica la specifica, non sia possibile utilizzare la fusione:

La copia di pixel ignora la pipeline del frammento. Le uniche operazioni di frammento che riguardano il blit sono il test di proprietà dei pixel e il test di forbice .

Quindi qualsiasi miscelazione significa utilizzare framment shader come suggerito. Un passaggio a schermo intero con la miscelazione dovrebbe essere piuttosto economico, credo che non ci sia nulla di cui preoccuparsi.

Problemi correlati