Ad un certo punto, mentre cercavo di realizzare alcuni render adatti a valorizzare la scena, mi sono accorto di una problematica relativa ad alcuni materiali in un punto specifico della scena.
La situazione in questione è collocata in un angolo della cucina dal lato opposto alle finestre, quindi lontano dalle uniche fonti di luce. In quell'angolo i mobili della cucina schermano ulteriormente la nicchia su più lati. In questa situazione, in questo preciso contesto, l'unica fonte di luce è la finestra posta di fronte. Ho provato a realizzare un render ponendomi con la telecamera con la finestra alle spalle e guardando questo angolo di cucina e mi sono accorto del seguente risultato:
tutti i materiali di tipo vetro (con delle trasparenze e delle riflessioni) mostrano dei giochi di luce bianca molto accentuata.
La provenienza di queste forti riflessioni e rifrazioni è ignota, poiché per come è strutturata la scena non ci sono fonti di luce dirette verso la telecamera e quindi in grado di giustificare questa luminescenza. Gli unici fattori che potrebbero portare a questo tipo di fenomeno sono o delle luci poste oltre gli oggetti in vetro e quindi un fascio di luce diretto verso la telecamera attraverso gli oggetti oppure che gli oggetti di vetro siano inseriti in un ambiente molto luminoso.
Il materiale vetro in Eevee ci ha dato già parecchi grattacapi in passato e ne abbiamo già parlato in un blog precedente. Ho pensato subito che il problema potesse essere collegato sempre allo shader in questione, tuttavia da un po' di tempo a questa parte l'ultima versione a cui siamo arrivati ha dato finora buoni risultati e si è comportato bene in varie situazioni. Ero abbastanza restio a metterci mano ulteriormente.
Come controprova ho inserito nella scena gli stessi elementi soggetti a questo strano fenomeno in altri punti della scena. Ho fatto i render di prova e sono risultati correttamente illuminati. O perlomeno senza particolare evidenza di questa luminescenza.
Questo risultato mi ha spinto a voler cercare il colpevole altrove ed ho iniziato indagando sull'illuminazione, di conseguenza ho fatto una ampia serie di prove variando e sistema di illuminazione.
Riepilogando: nel setup delle luci della scena attuale non abbiamo una mappa ambiente HDR. Abbiamo solo esclusivamente due area light provenienti dalle finestre, una piccolissima area light sotto la cappa di aspirazione e per finire un'altra area light ben distante fuori dalla cucina per simulare la luce naturale proveniente dai locali esterni alla cucina.
È presente anche una lampada di tipo sole. Orientata appositamente per farla entrare dalle finestre ed incidere sul piano di lavoro della cucina.
A rigor di logica l'unica fonte luminosa che dovrebbe avere una componente diretta verso l'angolo della cucina in cui si verifica questo fenomeno è sicuramente la area light posta al di fuori della finestra sul lato opposto.
Ho iniziato una serie di test e modifiche al setup luminoso per capire cosa potesse influire su questo riflesso quindi ho provato ad azzerare il contributo della luce ambiente (World). Ho provato a rimuovere le area light fuori dalla finestra. Ho provato a togliere il sole. Ovviamente facendo una sola sostituzione ogni volta per vedere l'effetto. E curiosamente non ho trovato la fonte del problema.
Ad un certo punto mi sono ricordato di aver calcolato il bake della luce indiretta e di aver posizionato un irradiance volume ed una reflection cubemap nella scena.
Sia la reflection cubemap che l’irradiance volume hanno la forma di un parallelepipedo e sono inseriti nella scena per coprire l'intera cucina. Sono dimensionati per essere pari al volume interno della cucina o leggermente superiori.
Fino a questo momento il bake delle luci indirette ha sempre fornito una resa più che soddisfacente ed un contributo importante al realismo generale della scena, tuttavia è proprio qui che ho avuto la sorpresa.
Ho provato a cancellare il bake delle luci e a renderizzare senza bake: il render dell'angolo della cucina sorprendentemente non ha manifestato il difetto!
Da qui in poi ho iniziato a provare varie soluzioni di irradiance volumes, sostituendo l’irradiance volume globale con dei volumi più piccoli e meglio localizzati all'interno della cucina, ma nessuna delle prove effettuate ha portato a dei risultati concreti.
A questo punto avendo esaurito tutte le possibili alternative l'unico elemento su cui mi rimaneva da fare delle prove era la reflection cubemap e con una certa sorpresa ho scoperto che il colpevole era proprio lì.
A quanto pare la reflection cubemap estesa su tutta la stanza forniva un buon livello di riflessioni per la maggior parte degli oggetti inseriti, tuttavia in questo particolare angolo della cucina che sarebbe dovuto essere più buio degli altri venivano generati una serie di riflessi ingiustificati. La controprova è stata inserire delle piccole reflection cubemap attorno ad alcuni degli oggetti di scena interessati dal riflesso per vedere scomparire gli artefatti nei render di test.
Non sapendo bene, quale fosse l'origine del problema tutte le prove, le ricerche e l'indagine fatta fino a questo momento si è svolta sulla scena completa che purtroppo è tornata ad essere parecchio pesante per il mio computer. Dopo aver identificato la fonte del problema mi è stato possibile andare a realizzare una scena semplificata molto più leggera su cui poter eseguire varie prove ulteriori.
Innanzitutto ho verificato il comportamento sulla scena semplificata replicando fedelmente quanto riscontrato nella scena completa per avere un secondo riscontro che fosse effettivamente tutto come previsto.
Dopo aver avuto conferma nella scena semplificata dell'effettiva presenza di questi strani riflessi ho iniziato a fare una serie di prove campione incrociando in vari modi le reflection cubemap.
Ovviamente prima di iniziare questa indagine sperimentale, ho cercato ovunque possibile informazioni in merito all'utilizzo della reflection cubemap, purtroppo devo dire il manuale di Blender questa volta non è stato particolarmente esaustivo nello spiegare questo tipo di problematiche e con una certa sorpresa non ho trovato particolarmente esaustivi nemmeno i video tutorial di cui abbonda la rete, sebbene ce ne siano tantissimi sull’argomento.
Il problema di fondo è che la maggior parte dei video tutorial che ho potuto guardare spiegano il funzionamento della luce indiretta e delle riflessioni in Eevee (e quindi il calcolo del bake) sempre su delle scene campione piuttosto semplificate, quindi il classico piano, la sfera o Suzanne. Sono andato a guardare anche diversi video tutorial sulla realizzazione di un illuminazione credibile e realistica in scene di interni con Eevee, tutti i video che ho potuto guardare ed ascoltare hanno dettagliato molto bene l'utilizzo del irradiance volumes eppure hanno solo un accenno all'utilizzo delle reflection cubemap.
Giusto per dare un esempio della carenza di informazioni: non sono nemmeno riuscito a capire dopo una settimana di indagine se fosse possibile/corretto nidificare le reflection cubemap una dentro l'altra oppure no.
Per questo motivo l'unica soluzione a cui sono arrivato è stata di utilizzare un approccio a forza bruta e iterare su tutte le possibili varianti fino a trovare quella giusta per me.
Tornando quindi alla scena semplificata:
- ho provato a inserire delle reflection cubemap su i singoli oggetti ritagliate strette intorno ad ogni oggetto
- ho provato soluzione intermedie utilizzando delle cubemap ben più piccole dell'intero locale, ma dimensionate per raccogliere e contenere una serie di oggetti omogenei posizionati tutti a grandi linee nello stesso posto (in pratica ho diviso il volume della stanza in volumi più piccoli in base alle zone e non agli oggetti)
Sfortunatamente la prova che ha avuto l'esito migliore è stata proprio quella di inserire piccole reflection cubemap dettagliate per ogni oggetto che necessita un dettaglio maggiore dei riflessi. La buona notizia è che le prove hanno anche indicato la possibilità di nidificare le reflection cubemap tra di loro e quindi la possibilità di lasciare la reflection cubemap complessiva (che oggettivamente fino ad ora è risultata adatta per la maggior parte degli oggetti di scena) e di inserire delle mini reflection cubemap, specificamente solo per gli oggetti che lo richiedessero.
Quando dico che “sfortunatamente” ho trovato la soluzione al problema, è perché risulta essere la soluzione più onerosa in termini di risorse di sistema poiché inserire tante piccole reflection cubemap comporta un aumento considerevole del tempo di calcolo del bake, oltre che un aumento considerevole della memoria occupata dal bake, che a sua volta andrà ad aggravare il carico sulla scheda video in fase di rendering.
A conclusione della vicenda:
- ho inserito tutte le reflection cubemap necessarie per correggere il problema
- ho ricalcolato il tutto
- ho potuto constatare come la memoria occupata dal bake sia passata da poche centinaia di Mb a ben più di 1Gb
Nota a margine: siccome non riuscivo a convincermi del fatto che un problema tanto evidente non fosse già stato sviscerato e abbondantemente discusso dagli sviluppatori e dalla comunità di Blender, sono rimasto per un bel po' di tempo nella convinzione di non essere riuscito a capire fino in fondo il problema. Ho pensato che la cosa più semplice fosse rivolgersi alla comunità di blenderisti, per avere supporto.
Riporto per completezza qui sotto i link alle discussioni aperte sui vari social relativi a Blender dove ho cercato di avere delle risposte (purtroppo non ho tenuto risposte concrete sull'argomento fino a questo momento).
rif. discussioni su: