Perdo / guadagno le prestazioni per scartare i pixel anche se non utilizzo il test di profondità?


22

Quando ho cercato per la prima volta le istruzioni di eliminazione, ho trovato esperti che affermano che l'utilizzo di eliminazione comporterà un peggioramento delle prestazioni. Hanno detto che scartare i pixel interromperà la capacità della GPU di usare correttamente zBuffer perché la GPU deve prima eseguire Fragment shader per entrambi gli oggetti per verificare se quello più vicino alla videocamera viene scartato o meno. Per un gioco 2D su cui sto attualmente lavorando, ho disabilitato sia il test di profondità che la scrittura di profondità. Sto disegnando tutti gli oggetti ordinati in base alla loro profondità e questo è tutto, non c'è bisogno che la GPU faccia cose fantasiose. ora mi chiedo è ancora male se scarto i pixel nel mio framment shader?

Risposte:


20

L'hardware grafico può eseguire l' abbattimento anticipato dei frammenti in base alla profondità prima di calcolare il loro valore di colore (in altre parole, prima di eseguire lo shader di frammenti). Di conseguenza, se si utilizzano funzionalità che potrebbero influire su questo, come il discardtest alfa o la manipolazione gl_FragDepthdella capacità dell'hardware di eseguire tale ottimizzazione, verrà compromessa poiché non è possibile ipotizzare la vera profondità del frammento e deve essere eseguito lo shader completo.

Tuttavia, se l'utilizzo di una qualsiasi di queste funzionalità compromettenti abbia un impatto netto sulle prestazioni osservabile dipende dalla situazione. L'ottimizzazione early-z può migliorare le prestazioni se si dispone di shader di frammenti molto costosi, ad esempio, ma se il costo della pipeline è nello shader di vertici (o altrove), ciò non gioverà così tanto e di conseguenza si potrebbe vedere poco o nessun peggioramento delle prestazioni utilizzando discard.

La disabilitazione del test di profondità interamente tramite l'API dovrebbe impedire anche l'esecuzione dell'ottimizzazione, poiché potrebbe provocare scene con rendering errato. Nel tuo caso, quindi, non dovrebbe importare che usi discard.

L'hardware recente può forzare i test (compresi i primi test di stencil) utilizzando layout(early_fragment_tests)- ci sono più informazioni (e avvertenze) su questo nella pagina che ho collegato all'inizio della risposta.


3

Come sempre per le domande sulle prestazioni, la risposta più accurata è provarla sull'hardware di destinazione e misurare ciò che accade.

Nel tuo caso probabilmente non è una brutta cosa da fare. In effetti c'è una possibilità che aiuterà le prestazioni risparmiando sulla larghezza di banda della memoria. Aggiungerà anche le istruzioni dello shader, quindi non è sempre un vantaggio in termini di prestazioni.

Anche quando si utilizza il buffer di profondità, le prestazioni non sono sempre molto significative, se si è attenti all'ordine in cui si disegnano le cose.

C'è un post sul blog su https://fgiesen.wordpress.com/2011/07/08/a-trip-through-the-graphics-pipeline-2011-part-7/ che descrive in dettaglio come potrebbero funzionare i test di profondità precoci nell'hardware e quali limiti potrebbero esserci.


1
In realtà dopo il test penso che sia sicuro presumere che non perdo né guadagno le prestazioni, ma stavo cercando una risposta che spiegasse in modo approfondito cosa e perché accadrà.
Ali1S232,
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.