2013-08-05 6 views
7

Ho letto le specifiche openGL cercando di trovare una risposta a questa domanda, senza fortuna. Sto cercando di capire se OpenGL garantisce che disegnare chiamate come GLDrawElements o GLDrawArrays disegnerà gli elementi esattamente nell'ordine in cui appaiono nel VBO o se è libero di elaborare i frammenti di quei primitivi in ​​qualsiasi ordine.OpenGL garantisce che le primitive in un buffer di vertici vengano disegnate in ordine?

Ad esempio, se si dispone di un buffer di vertici con 30 vertici che rappresentano 10 triangoli, ciascuno con le stesse coordinate. Sarà sempre il caso che il triangolo corrispondente ai vertici 0, 1 e 2 sarà reso prima (e quindi in basso); e il triangolo corrispondente ai vertici 28, 29, 30 è sempre reso ultimo (e quindi in alto)?

risposta

12

La specifica è molto attenta a definire un ordine per il rendering di tutto. Le matrici dei dati dei vertici vengono elaborate in ordine, il che si traduce nella generazione di primitive in un ordine specifico. Si dice che ogni primitivo è rasterizzato in ordine, e in seguito i primitivi non possono essere rasterizzati fino a quando quelli precedenti non sono terminati.

Naturalmente, questo è tutto ciò che OpenGL dice che dovrebbe comportarsi. Le implementazioni possono (e fanno) imbrogliare rasterizzando e processando più primitive contemporaneamente. Tuttavia,, obbediranno comunque alla regola "come se". Quindi imbrogliano internamente, ma scriveranno comunque i risultati come se avesse eseguito tutti in sequenza.

Quindi sì, c'è un ordine specifico su cui puoi fare affidamento. A meno che non si stiano utilizzando gli shader che perform incoherent memory accesses; quindi tutte le scommesse sono disattivate per le scritture shader.

1

Sebbene possano effettivamente essere disegnati in un ordine diverso e diano finitura in momenti diversi, all'ultimo raster fase di esercizio conduttura, qualsiasi miscelazione (o profondità/stencil/alpha test per questo) sarà fatto in modo che i triangoli furono emessi.

È possibile confermare questa rendendo un oggetto utilizzando un'equazione di miscelazione che non pendolari, ad esempio:

glBlendFunc(GL_ONE, GL_DST_COLOR); 

Se i contenuti finali framebuffer sono stati scritti dallo stesso ordine arbitrario che i primitivi si possono trarre , quindi in questo esempio vedresti un effetto simile al combattimento a Z.

Questo è il motivo per cui si chiama uno shader frammento (al contrario di pixel shader) perché non è un pixel ma dal momento che dopo la fase di frammento non venga scritto il framebuffer appena ancora; solo dopo la fase operativa raster.