Rendering basato sulla fisica
Sei sulla strada giusta quando dici "cerca di imitare il modo in cui la luce si riflette nella vita reale, che di solito viene divisa in due componenti, speculare e diffusa a seconda del tipo di materiale".
Ma abbiamo a lungo modellato materiali con speculazioni e diffuse in giochi e computer grafica. Il trucco è che abbiamo usato queste cose come completamente indipendenti - cambiando la specularità non è cambiata la diffusa:
Questo è un esempio di Phong shading dal wiki di Blender . Puoi vedere che offre due parametri di intensità speculare e durezza speculare e questi parametri cambiano solo la parte biancastra del riflesso. Il riflesso diffuso blu non cambia affatto.
Il modo in cui i giochi userebbero questo è che un artista avrebbe il compito di mettere a punto questi valori per ciascun materiale fino a quando "sembra giusto". Poiché la "durezza speculare" non è una vera proprietà fisica dei materiali che possiamo misurare con precisione, ha dovuto essere fatta a occhio.
Questo metodo è un po 'fragile. Man mano che cambi l'illuminazione (diciamo, un oggetto dinamico che si muove attraverso aree diverse o in un ambiente con ora del giorno e tempo atmosferico) può apparire sottilmente sbagliato - troppo chiaro o troppo scuro - poiché le condizioni di visualizzazione non sono le stesse del sono stati sintonizzati i suoi parametri speculari.
Inserisci il rendering basato fisicamente, che è un tentativo di fondare le nostre descrizioni dei materiali in proprietà più oggettive e misurabili di superfici reali. Una delle proprietà più apparenti è la conservazione dell'energia: una superficie più ruvida diffonderà la luce in modo diffuso e una superficie più liscia / più metallica rifletterà la luce più direttamente, ma è lo stesso fascio di luce da cui entrambi attingono. Quindi, a parità di altre cose, quando rendiamo più brillante un materiale, la componente diffusa dovrebbe diventare più scura:
Questo esempio è tratto da un articolo di Marmoset che spiega PBR originariamente condiviso da Syntac_
C'è molto di più nel rendering basato sulla fisica che sul risparmio energetico, ma questo è probabilmente il segno più rivelatore che stai lavorando con un sistema basato sulla fisica.
Mantenendo i modelli di riflessione simili a come funzionano i materiali nella vita reale, riduciamo la necessità di fattori di sfumatura e soggettività dell'artista per ottenere un materiale del mondo reale come legno o cemento o pelle che appaia reale in un'ampia varietà di condizioni di illuminazione.
Si noti che un'altra risposta lo ha descritto in termini di illuminazione indiretta dalla luce che rimbalza su altri oggetti nella scena. Mentre molti sistemi di illuminazione che utilizzano modelli basati fisicamente includeranno anche strumenti per modellarlo, di solito è noto con un nome separato di Global Illumination . Questo è l'effetto che fa apparire verde un lato della testa diffusa in questa immagine, illuminato dalla luce che rimbalza sulla parete verde:
Immagine da questo articolo sull'illuminazione globale
Riflessione dello spazio
Mentre PBR cerca di modellare il modo in cui il materiale riflette la luce, Screenspace Reflection cerca di catturare ciò che viene riflesso - in particolare, per una superficie lucida, simile a uno specchio, cosa dovrei vedere nel riflesso?
Ancora una volta questa è una tecnica di rendering relativamente recente che è probabilmente la più chiara da capire in contrasto con il modo in cui i giochi lo facevano prima:
Rendering capovolto - comune per i piani d'acqua o gli specchi piatti, eseguiamo letteralmente il rendering di tutta la geometria riflessa una seconda volta specchiata sul piano della superficie riflettente. Ciò fornisce riflessi di alta qualità (dettagli completi, oggetti a contatto con la superficie allineati con i loro riflessi) ma funziona correttamente solo per superfici piane. Più una superficie è ondulata o irregolare, meno si comporta come riflessi reali, che dovrebbero distorcere o sfocare in modi complessi.
Mappe cubiche: memorizziamo il colore che verrebbe visualizzato da qualsiasi raggio di vista che si irradia dal loro punto centrale. Eseguendo il rendering dinamico delle mappe cubiche da punti selezionati nella scena, possiamo stimare quale colore deve essere riflesso da qualsiasi superficie arbitrariamente curva. Il problema qui è che la mappa del cubo è completamente corretta solo al suo punto centrale - poiché il punto in cui stiamo simulando il riflesso si sposta intorno alla scena, dovrebbe vedere una parallasse, che non è presente nella mappa del cubo. Ciò significa che gli oggetti non tendono ad allinearsi con i loro riflessi.
La riflessione dello spazio dello schermo tenta di ovviare a queste limitazioni utilizzando la scena renderizzata stessa come fonte di informazioni sulla riflessione. E ' ray-marcia una vista raggio riflesso, utilizzando la profondità della scena, fino a quando non sarebbe intersecano qualcosa nella scena renderizzata.
Ecco una slide di una presentazione EA DICE sul loro approccio alle riflessioni nel motore Frostbite .
Ciò significa che (con qualche lavoro algoritmico intelligente) possiamo ottenere riflessi con una precisione ragionevolmente simile al ray-tracing dalle superfici arbitrarie nei giochi, con un corretto allineamento delle superfici a contatto, distorsione e sfocatura, purché la parte riflessa della superficie sia visibile su -screen (cioè non offscreen o occluso da qualcos'altro). Laddove il riflesso non può essere determinato con precisione dal raymarching, di solito viene approssimato usando campioni vicini o una mappa cubica di fallback che rappresenta la scena accanto / dietro la vista della telecamera.
Puoi vedere in questo esempio di riflessione dello spazio dello schermo , l'impressione può essere molto convincente, anche se sono evidenti piccoli errori (vedi il riflesso della parte inferiore dei cubi, che non sono visibili nella cornice renderizzata e quindi semplicemente spalmare e ripetere pixel adiacenti, o i buchi nel riflesso della tenda verde destra accanto al vaso di fiori e nella parte inferiore dello schermo, dove il raymarching non è riuscito a trovare i pixel riflessi giusti). È comune utilizzare questa tecnica per superfici moderatamente lucide / leggermente ruvide per rendere meno visibile l'errore occasionale.