Ci sono ancora vantaggi nell'uso di gl_quads?


10

OK, ho capito che i gl_quad sono deprecati e quindi non dovremmo "usarli" più. Capisco anche che un PC moderno quando esegue un gioco usando gl_quads sta effettivamente disegnando due triangoli.

Ora, ho sentito dire che un gioco dovrebbe essere scritto usando triangoli invece. Ma mi chiedo se, a causa delle specifiche di come OpenGL trasforma quel quad in due triangoli, sia mai vantaggioso usare i quad ancora?

In particolare, attualmente sto eseguendo il rendering di molti quad non collegati da oggetti buffer piuttosto grandi. Una delle aree che devo fare attenzione è quanto grande sia il vettore di float che sto usando per creare / aggiornare questi oggetti buffer (ho un numero di valori float extra per vertice e molti vertici in un buffer - il i buffer più grandi sono circa 500 KB).

Quindi mi sembra che se cambio i miei oggetti buffer per disegnare triangoli, i dati sui vertici saranno più grandi del 50% (sei vertici per disegnare un quadrato anziché 4) e impiegheranno il 50% in più per generare la CPU.

Se gl_quads funziona ancora, sto ottenendo un vantaggio qui o la memoria e il tempo CPU aggiuntivi del 50% vengono ancora utilizzati per la conversione automatica di OpenGL in due triangoli?


5
Sono sicuro che OpenGL supporta una sorta di buffer di vertice indicizzato, il che significa che memorizzi solo gli stessi 4 vertici per un quad, e invece di ripetere interi vertici per creare i due triangoli, ripeti solo gli indici: [0,1,2] , [2,3,0]

Ottima risposta qui
bobobobo

Credo che le specifiche GL prevedano ancora alcuni casi in cui il disegno come un quad è importante, ad esempio con glPolygonMode (..., GL_LINE).
Maximus Minimus

Risposte:


5

Metti alla prova il tuo gioco reale. Se i quad sono più veloci, usa quelli. Altrimenti no.

Si può pensare che in alcuni casi siano più lenti perché alcuni componenti hardware non supportano i quad, quindi il driver deve fare molto lavoro per "riparare" le chiamate in quad. Alcuni hardware supportano i quad, eseguendo la divisione in triangoli in alcune fasi dell'assemblaggio di input a funzione fissa, quindi funzionano senza sovraccarico significativo. Ci sono anche domande su come vengono inviati i quadrupli indicizzati rispetto a quelli non indicizzati, man mano che si solleva, e che fa un uso migliore della larghezza di banda di trasferimento bus limitata e del tempo di generazione della CPU. La saggezza popolare dice di evitare i quad, che è un buon consiglio se stai partendo dal nulla, forse non tanto se il tuo codice funziona già. la saggezza popolare dice che molte cose uccidono le prestazioni nonostante i giochi reali e ben performanti facciano quelle cose.

In breve, prova. Non dare per scontato e non chiedere a Internet consigli sulle prestazioni. A volte potremmo avere ragione, ma più spesso ti forniremo dati obsoleti, dati basati su una circostanza specifica in cui non ti trovi, o immondizia totale che noi stessi abbiamo acquisito di seconda mano da Internet o dai colleghi (che potrebbero non esperienza di prima mano).


3

Quali sono le alternative? Bene, un'alternativa è usare Geometry Shader , passando una GL_LINES_ADJACENCYprimitiva (4 vertici) e facendo convertire la primitiva in una striscia triangolare da GS. Tuttavia, sarà più lento il rendering, perché si dovrebbe presumere che gli shader della geometria siano sempre più lenti nel rendering.

Un metodo migliore consiste nell'utilizzare il rendering indicizzato. Qui hai due alternative: GL_TRIANGLESe GL_TRIANGLE_STRIPcon il riavvio primitivo. Quest'ultimo si tradurrà in un buffer indice leggermente più breve (un indice per ogni quadruplo). È possibile riutilizzare lo stesso buffer di indice per qualsiasi rendering quad, quindi non sarà necessario aggiornare o modificare il buffer di indice.

Vorrei anche suggerire di utilizzare short senza segno come tipo di indice. Se è necessario eseguire il rendering di più di 16384 quad alla volta, quindi effettuare più chiamate di rendering, utilizzando glDrawElementsBaseVertex per compensare gli indici.


Alcuni recenti benchmarking che ho fatto mostrano che glMultiDrawArrays ora è un percorso veloce sia su NV che su AMD (non si è disturbato con Intel), quindi c'è un'altra opzione: glMultiDrawArrays con ventola o strip.
Maximus Minimus

@ mh01: questo richiede un array lato client di comandi di disegno. Dovresti glMultiDrawArraysIndirectfarlo dal lato GPU. Cosa che puoi fare, ma limita l'hardware.
Nicol Bolas,
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.