PREVIOUS article

DevLog #002: Blender + Unreal Engine? [17/02/2019]

NEXT article

DevLog #007: la resa del vetro in eevee [21/04/2019]
DevLog #006: il problema delle unità di misura [24/03/2019]

Come spesso succede (almeno secondo le mie abitudini), abbiamo deciso di cominciare dalle cose più semplici e nonostante questo ci siamo incartati subito.
Nelle prime fasi di progetto quando non era ancora ufficiale se fare tutto solo con Blender e Eevee oppure se modellare in Blender e poi importare tutto in Unreal Engine, abbiamo deciso di impostare le unità di misura di Blender per la creazione degli asset compatibili con la esportazione/importazione in UE4 così da permetterci di cambiare idea un domani e non trovarci troppo in difficoltà, inoltre dovendo lavorare sul dettaglio di molti asset, l'unità di misura di default in metri era scomoda e limitativa...
Dopotutto abbiamo semplicemente pensato che lavorare in Blender in una unità di misura piuttosto che in un'altra non avrebbe fatto differenza... e qui evidentemente abbiamo commesso un grosso sbaglio.
Solitamente per creare degli asset facilmente e comodamente importabili in UE4 è buona norma impostare le “units” di Blender a 0.01.
Inoltre dovendo realizzare un progetto i cui eventi si svolgono tutti internamente ad una stanza di pochi metri quadrati abbiamo ritenuto più saggio impostare unità di misura in cm.

 


Torniamo un attimo ai primi asset che abbiamo deciso di realizzare: per non impazzire e prendere gradualmente la mano il workplan prevede di iniziare dalle cose più semplici. Abbiamo deciso di modellare un po' di pasta cruda, nulla di particolarmente complicato, nei formati più diffusi (qui in Italia) come maccheroni, penne, farfalle, fusilli, eccetera eccetera...
Ebbene siamo rimasti abbastanza stupiti nello scoprire che fin dai primi test render della pasta avevamo grosse difficoltà a realizzare uno shader credibile, mentre una rapida prova con Cycles ha portato immediatamente ad un risultato onorevole. Una delle principali differenze/difficoltà sembra essere legato al Sub-Surface Scattering.
Ma procediamo per gradi...
Una parte del ragionamento (ignorante) è stato: se abbiamo ridotto le unità di misura di Blender di due decimali, allora basterà ridurre tutti i parametri dei vari shader proporzionalmente altrettanto per ottenere lo stesso effetto finale che possiamo osservare con uno shader applicato in Blender con le impostazioni di default (e quindi in metri con “units=1.0”). Quindi abbiamo cercato di applicare lo stesso fattore di scala che abbiamo applicato alle unità anche ai parametri dei materiali, ma evidentemente la questione non era così semplice. Sebbene ci siano molteplici videotutorial dimostrativi ed esplicativi che facciano vedere come impostare particolari caratteristiche dello shader come ad esempio subsurface scattering anche in Eevee, non sono riuscito ad ottenere gli stessi risultati seguendo gli stessi identici passi. Perchè? Qual’era la differenza?

Mi ci è voluto un bel po' di tempo e di esperimenti per riuscire a isolare la problematica e ancora oggi non sono sicuro di aver capito se è un limite di Eevee o un baco ancora da sistemare (ricordo a tutti che al momento della stesura di questo articolo, Blender 2.80 è ancora in fase di sviluppo e non è ancora stata rilasciata versione stabile).
Alla fine ho realizzato che il problema di fondo era proprio l'utilizzo di unità di misura differenti da quelle di default e il test finale è stato relativamente semplice: ho realizzato un cubo (completo di shader) utilizzando le impostazioni delle unità di misura di  default e poi ho realizzato lo stesso identico cubo in un altro file dove utilizziamo le “nostre” unità di misura. Facendo due render e paragonandoli il risultato del subsurface scattering è palesemente differente e per quanto io mi convinca che il problema sia la mia incapacità di settarli in modo corretto, la realtà dei fatti è che non ho trovato un modo di ottenere lo stesso risultato estetico con il cubo nelle unità di misura di default e con quello nelle unità di misure ridotte che abbiamo scelto di utilizzare il nostro progetto.

 


Il problema non è limitato solo ed esclusivamente al subsurface scattering, sfortunatamente abbiamo avuto fenomeni simili sia con la proiezione delle ombre sia con alcune texture procedurali. In pratica sembrava che fossimo in grado di realizzare lo shader esattamente come lo volevamo nelle unità di misura di default ma non fossimo in grado di replicarlo nelle unità di misura variate.
Successivamente, mentre con la produzione dei primi asset eravamo sepolti dalle problematiche sopra elencate, abbiamo scelto di abbandonare momentaneamente l'Unreal Engine in favore di un workflow interamente basato su Blender con Eevee. Una volta presa la decisione abbiamo ripristinato le units di default (=1.0) per i nostri asset e di colpo tutti i problemi che non riuscivamo a risolvere legati agli shader sono scomparsi.
Penso che sia un peccato. Mi sarebbe piaciuto tenere aperta la possibilità di importazione semplice UE4, tuttavia non potevamo permettere di arenarci prima ancora di cominciare e dopo molte ore spese a cercare di venire a capo di questi problemi è sembrata la cosa più naturale fa dare. Dopo tutto si tratta sempre di seguire la via più semplice.
Nonostante i problemi sopra elencati siano stati aggirati, mi è rimasta comunque la curiosità di capire meglio la problematica e trovare una soluzione... Se qualcuno avesse suggerimenti in merito, vi invito a contattarmi su uno dei miei canali oppure tramite il seguente link al thread aperto su blender.it dove ho iniziato una discussione in merito a questa faccenda.