Qual è il compromesso prestazionale tra rendering forward e differito?


9

Il rendering in avanti è il processo di calcolo di un valore di luminosità per un frammento di superficie direttamente dalla geometria di input e dalle informazioni sull'illuminazione. Il rendering differito suddivide il processo in due fasi: prima producendo un buffer dello spazio dello schermo contenente proprietà del materiale (un buffer della geometria o buffer G) costruito rasterizzando la geometria di input e in secondo luogo producendo un valore di radianza per ciascun pixel combinando la G- buffer con informazioni di illuminazione.

Il rendering differito viene spesso presentato come un'ottimizzazione del rendering in avanti. Una spiegazione è che l'illuminazione è piuttosto costosa e se hai qualche sovraccarico stai illuminando pixel che non saranno mai visti sullo schermo, mentre se memorizzi le proprietà del materiale in un G-buffer e la luce in seguito, stai solo illuminando un pixel che effettivamente appare sullo schermo. Questo è effettivamente un vantaggio di differito, dato che puoi anche eseguire un pre-passaggio di profondità e quindi eseguire un passaggio di rendering in avanti con un test di profondità impostato su D3D11_COMPARISON_EQUALo GL_EQUALo equivalente?

Il rendering differito ha anche il potenziale per pianificare meglio sulla GPU. Dividere un grande ordito / fronte d'onda in un fronte d'onda di geometria più piccola e quindi fronti d'onda di illuminazione più piccoli in seguito migliora l'occupazione (più fronti d'onda in volo contemporaneamente). Ma finisci anche con un uso della larghezza di banda molto maggiore (scrivendo un gran numero di canali sul G-buffer, quindi rileggendoli durante l'illuminazione). Ovviamente i dettagli qui dipendono molto dalla tua GPU, ma quali sono i principi generali?

Ci sono altre considerazioni pratiche sulle prestazioni quando si decide tra rendering in avanti e differito? (Supponiamo che possiamo usare le variazioni di ogni tecnica, se necessario: cioè possiamo confrontare il piastrellato in avanti con il piastrellato anche differito.)

Risposte:


11

È possibile evitare il sovraccarico di oggetti opachi anche con il rendering in avanti eseguendo un pre-passaggio di profondità e utilizzando tali informazioni per rifiutare qualsiasi pixel che non sia effettivamente visibile. Tuttavia, a seconda del costo del vertice della scena, un pre-passaggio di profondità può aggiungere una quantità inaccettabile di costi generali delle prestazioni. Inoltre, il rendering utilizzando il pixel shading pipeline di mezzi GPU che non si paga un costo per pixel che è resa, si paga un costo per 2x2 pixel quad che viene reso. Quindi, anche eseguendo un pre-passaggio di profondità, i bordi del triangolo possono comunque perdere pixel di ombreggiatura di lavoro che verranno scartati.

La pianificazione delle GPU è un argomento complesso e il compromesso tra forward e differito non si riduce semplicemente a "corre più veloce ma utilizza più larghezza di banda". Se hai due operazioni ugualmente economiche che vengono eseguite in sequenza e ognuna utilizza lo stesso numero di risorse, non c'è motivo di dividerle in shader separati: due piccoli fronti d'onda che utilizzano ciascuna risorse X non funzionano fondamentalmente meglio di un singolo fronte d'onda più lungo che utilizza anche X risorse. Se hai un'operazione economica e un'operazione costosa da eseguire in sequenza, tuttavia, potrebbe trarre vantaggio dalla suddivisione in shader separati: lo shader in generale riserverà la massima quantità di risorse che potrebbe utilizzare in qualsiasi momento. E' È ipotizzabile che il rendering in avanti possa non essere in grado di utilizzare tutta la larghezza di banda della GPU perché ci sono così poche fronti d'onda in volo che non può eseguire operazioni sufficienti per saturare la larghezza di banda. Ma se tula larghezza di banda è limitata, potrebbe non esserci alcun vantaggio sul rendering differito (poiché probabilmente utilizzerà più larghezza di banda).

Un'ulteriore preoccupazione relativa alle prestazioni è che il rendering in avanti supporta diversi tipi di materiale (ad esempio, diversi BRDF) semplicemente usando uno shader diverso per quell'oggetto. Un semplice renderizzatore differito deve gestire diversi tipi di materiale in un modo diverso (potenzialmente un ramo nello shader), poiché il lavoro non è più raggruppato in orditi / fronti d'onda coerentemente a seconda dell'oggetto da renderizzare. Questo può essere mitigato con un renderer piastrellato: se solo aree specifiche dello schermo usano un tipo di materiale alternativo (diciamo, per i capelli), puoi usare la variazione dello shader con un ramo del tipo di materiale solo per le piastrelle che contengono pixel con quel materiale .

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.