rendering-diferrito

Motori grafici con rendering differito

Motori grafici con rendering differito: inizia il viaggio per apprendere le basi teoriche per realizzare un motore grafico. Concateneremo i post affinchè sia facile orientarsi.

Il sistema di rendering usato da Unreal Engine 4 si basa su una pipeline DirectX 11 completamente nuova che include shading differito, illuminazione globale, traslucenze illuminate, post-processing e simulazione delle particelle tramite la GPU utilizzando campi vettoriali. A differenza di Unreal Engine 3, che usava la più abituale tecnica di forward-rendering, con Ue4 abbiamo un algoritmo di shading completamente diverso, appunto di tipo differito.

Motori grafici con rendering differito: 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. Tutto si basa sugli algoritmi computazionali utilizzati.

Per quanto concerne l’aspetto tecnico del motore grafico, per la simulazione che andremo a costruire,  è stato scelto il  paradigma Deferred Rendering (rendering differito), che si contrappone paradigma Forward Rendering, che ha dominato la struttura dei motori grafici fino alla seconda metà degli anni duemila, ormai abbandonato per l’elevato costo computazionale e per l’utilizzo di algoritmi più potenti.
Mentre nel forward rendering ogni oggetto è renderizzato e illuminato anche da calcoli di luce ininfluenti al fine ell’immagine di scena, nel deferred rendering vengono renderizzati tutti gli oggetti di scena una sola volta  non calcolando la cottura delle luci, ossia l’oggetto illuminato. In una prima fase  si riempie il  G-Buffer (geometric buffer) con i parametri necessari al modello di illuminazione. Il valore di luminosità dei pixel del G-buffer è in seguito calcolato effettuando un passaggio per ogni luce accumulando i risultati sul light buffer. Da qui il termine Deferred.

renderer-deferred

Motori grafici con rendering differito: Il G-Buffer ha una dimensione costante pari al frame buffer (immagine finale), in questo modo si ottiene che il calcolo dell’illuminazione, la parte più importante e con sosto computazionale alto, non dipende dalla complessità della scena. Nel deferred rendering  sono visibili solo i frame illuminati. L’ Albedo Buffer, il buffer compreso nel G-Buffer contiene “il colore”  degli oggetti non illuminati. Nel rendering differito, in un modello a blocchi, possiamo sintetizzare le fasi nel seguente modo :
1. Rendering scena senza luci nel GBuffer
2. Rendering del Light Buffer
3. Modulazione Albedo Buffer con Light Buffer
4. Effetti post-process e presentazione immagine finale

Nel forward rendering succede questo: se un oggetto è illuminato da più luci, l’oggetto viene renderizzato tante volte, quante sono le luci, per accumulare nel  buffer, la cottura dell’oggetto per ogni singola luce, considerando anche le parti coperte da altri oggetti, con uno spreco di memoria e calcolo computazionale, rallentando il sistema. Inoltre viene calcolata anche la luminosità di oggetti che non sono visibili nella scena.
Nel renering differito, vengono eliminati i problemi del calcolo degli oggetti coperti e invisibili nella scena,  perchè, è stata disaccoppiata la renderizzazione della scena (fase 1), con  la complessità, dal calcolo delle luci (fase 2). In questo modo, gli oggetti non visibili verranno velocemente renderizzati nel passaggio (fase 1), verranno completamente ignorati nel Rendering del Light Buffer( fase 2), alleggerendo calcoli e costi computazionali.  ad esempio: se fossero X il numero di oggetti presenti, e K il numero di luci presenti,  supponendo  T(fase 1)  il tempo necessario al rendering di un oggetto, con il paradigma forward rendering,  la complessità del calcolo  del tempo T è funzione del prodotto del numero di oggetti presenti per l numero totale di luci K, quindi: T(X*K); mentre nel caso del deferred rendering,  il calcolo di T è funzione della somma del numero di oggetti X e numero di luci K, quindi: T(X+K).

Motori grafici con rendering differito: Non è possibile sviluppare un motore grafico senza alcuni nozioni matematiche.  Premesso che  lo scopo è analizzare il funzionamento dell’engine e non studiare la matematica, comunque affronteremo al minimo alcuni argomenti come  la teoria degli spazi vettoriali e del calcolo matriciale. Gli algoritmi matematici e concetti matematici, sono molto vasti per la comprensione dell’engine, ma ci accontenteremo solo di enunciarli e non dimostrarli. Successivamente in separata sede chi vorrà, troverà tutorial di geometria e matematica avanzata.

Visits: 221