Environment in VR (un caso studio)
Vi presento la trascrizione del mio Talk tenuto al Campus Party IT2.
Alla progettazione grafica di queste soluzioni che andremo a vedere hanno partecipato Riccardo Morgia e Valentino Bononi durante il mio periodo lavorativo in Uqido.
Di cosa si parla oggi:
- Un caso di studio a cui ho partecipato attivamente
- Preproduzione di un ambiente
- Preparazione della mappa
- Plugins di Unity
- Extra
Dirò spesso la parola Erba
Potrebbe capitare nelle prossime righe di leggere robe tipo “l’erba che abbiamo usato è la migliore”, facciamo i maturi eh
Disclaimer: mi riferisco ai prati.
Cosa sono gli Environment
E Prima di tutto come si pronuncia?
Environment?
Envairoment?
Enviropment?
Insomma sono gli ambienti.
Il problema generico
Sviluppare ambienti aperti, naturalistici e realistici in realtà virtuale è complicato: se in un videogame qualsiasi puoi fregare l’occhio del giocatore in tanti modi diversi, in VR sei costretto a trovare soluzioni più consistenti. Bisogna mantenere le performance costanti (stai pur sempre renderizzando un ambiente a più di 90fps, 2 volte, anche 3) e capire che in VR non è così facile fregare l’occhio umano.
Il problema da risolvere
Mi era già capitato di fare ambientazioni dallo spazio molto aperto in VR; in quel caso avevo dalla mia due fattori: ● Era tutto stilizzato ● Non aveva elementi organici (erba, acqua, alberi) Quando mi è stato chiesto di creare una “semplice piana, col prato e gli alberi” devo ammettere che mi sono detto: “vabbè che ci vuole”.
Il contesto
La ricreazione del Bostel di Rotzo, un sito archeologico situato su un altopiano. C’è poco o niente che possa occludere l’enorme quantitativo di erba che c’è attorno al giocatore, il chè è molto preoccupante, tra poco capirete il perchè.
La preproduzione
Per quanto apparentemente semplice, creare questa ambientazione necessita di soluzioni immediate alle seguenti domande ● Il giocatore è libero di muoversi? ● il contesto? E la domanda che mi interessa di più: ● cosa vede il giocatore dal suo punto di vista?
Cosa vede il giocatore?
- Quali sono gli elementi che il giocatore vede ed a quale distanza?
- Che visore verrà utilizzato? (Microsoft MR)
In base a questo tracceremo il limite delle LOD (level of detail) degli elementi, divisi per qualità delle mesh e delle texture.
La mappa
Foto (le famose “Reference” perchè chiamarli “spunti” fa troppo Loser) ed un Plastico ci hanno aiutato nella costruzione della scena di base. La mappa a grandezza naturale (grazie google maps) ci ha permesso di scegliere un punto e testare lo sguardo del player.
Il giocatore non si muove (fortunatamente)
La differenza tra creare una mappa “esplorabile” ed una mappa che deve fare solo scena è che puoi prenderti la libertà di fare dei trucchi sporchissimi sapendo che il giocatore può muoversi solo entro la room scale designata (più o meno 4 metri). Oltre i 10/20 metri puoi davvero fare delle cose immorali graficamente, purché rimangano nascoste all’occhio del giocatore stesso: in VR, in una situazione di realismo, ci vuole un attimo per perdere la sospensione di incredulità.
Ricapitolando Il giocatore vedrà:
- Un altopiano con parti scoscese ai lati
- Tanta Erba
- Terriccio sotto ai piedi
- Vegetazione
- Piccoli terrapieni
- Staccionate
- Cielo
L’erba
ricordate il disclaimer :V
Erba Classica
Ci sono diverse tipologie di erba. I piani, cioè delle immagini spalmate su piani più o meno piegati su se stessi con qualche edge loop. Le billboard, ovvero come gli sprite del vecchio Doom, delle immagini che possono essere bloccate in una delle assi verticali oppure orizzontali. Esempio: se un piano/billboard lo guardate da sopra, non avendo profondità perderà ogni senso.
Erba VR
L’unico modo è farla in 3D, ma quanto può pesare (e quanto tempo ci vuole?) per creare una cosa del genere? Sarà poi interattiva? Fortunatamente Stix Games ha creato DirectX 11 Grass Shader la migliore erba che abbiamo provato.
DirectX 11 Grass Shader
https://assetstore.unity.com/packages/vfx/shaders/directx-11/directx-11-grass-shader-36335
E’ un tipo di Erba Volumetrica che si aggancia alla tessellazione della mesh su cui inserite il materiale: più è densa la mesh, più densa sarà l’erba. Le opzioni di Falloff, di Lod, softness e di customizzazione dell’aspetto, mista alla possibilità di “dipingere” l’erba sulla texture RGBA permette una capacità di ottimizzazione notevole. Insomma è un ottima erba ma non bisogna abusarne…essendo GPU oriented. Verrà piazzata con un piano suddiviso, dipingendo le parti dove è necessaria.
Poligoni nudi VS Poligoni e Texture
Le modalità di DX11GS sono due, una che permette l’utilizzo di Texture/Texture Atlas,
l’altra con dei poligoni nudi. La prima è più realistica ma è anche l’erba più pesante, ogni singola texture è trasformata automaticamente in una mesh. I poligoni nudi invece sono più leggeri e sono più gestibili.
Falloff, Lod e Density
Si gioca tutto su questi valori. Bisogna stare particolarmente attenti nel cancellare COMPLETAMENTE le zone di erba dipinte per sbaglio o che non vengono utilizzate. Il metodo migliore è aumentare il falloff al minimo e la density al massimo (così vedete tutta l’erba del mondo) e cancellare. Così non rischiate calcoli inutili.
#truestory
Il terreno
A pochi centimetri dal naso ci sono le texture a terra
Provate a guardare ai vostri piedi: notate quanti dettagli i vostri occhi riescono a scorgere. Immaginate una scena naturalistica; c’è da considerare la presenza di terriccio, erba, fanghiglia, pietre, foglie… insomma come quando si va a pasquetta da qualche parte, solo in VR. Non potendo usare mesh da 8k, e nemmeno texture tile con la detail dobbiamo trovare una soluzione diversa.
Il maledetto Terrain di Unity (scusate eh)
Terrain è il sistema di creazione di Unity del
terreno, ed ha i seguenti problemi
- Una pessima gestione dello sculpting (via mouse e IPD)
- Se sbagli a dipingere le texture devi ricominciare completamente da zero
- Se sbagli le proporzioni e vuoi cambiarle devi ricominciare da zero uguale
- Ha solo la gestione dell’albedo e delle normal (quindi niente occlusion o metallic).
- Non è assolutamente compatibile con il sistema di erba che vogliamo usare.
CTS
https://assetstore.unity.com/packages/tools/terrain/ctscomplete-terrain-shader-91938
CTS Ha tutti i problemi di Terrain MA
- permette di utilizzare delle texture PBR
- più profili di configurazione (insomma si può salvare)
Una volta decisa la posizione del giocatore abbiamo creato un piccolo piano di terrain + cts ed abbiamo cominciato a dipingere il pavimento.
Il resto dello stage è una enorme texture in tile su una mesh (che non si vede essendo scosceso)
Ricordatevi di impostare CTS su “lite” che è la configurazione ottimale per la Realtà Virtuale.
#iknowthefeeling
Altre soluzioni
Ci sarebbe la Tesselazione o la divisione del terreno in più moduli.
Ma non è il caso di dirlo a pochi giorni dalla consegna :V
https://assetstore.unity.com/packages/vfx/shaders/directx-11/dx11-tessellation-displacement-37322
Vegetazione
Da non confondersi con la GokuAzione :V
(scusatemi tanto)
Alberi
Se andate sull’asset store potete trovare tutti gli alberi che volete, sopratutto quelli di speed-tree. C’è solo un piccolo problema: avrete un quantitativo di Drawcall che non vi servono assolutamente.
In questo caso abbiamo deciso di creare 3 tipologie di alberi diversi,restando sotto i 3000 poligoni, alcuni di questi hanno solo solo il lato che il giocatore può vedere.
Cespugli
Stessa cosa, in questo caso ancora più becera: piani piegati da alcune edge loop. Li abbiamo messi nella parte esterna della mappa (dove sono naturalmente presenti, essendo parti non lavorate/calpestate) dove ci sono alberi lowpoly, in modo da nascondere le radici, solo abbozzate.
Terrapieni
sono le sezioni su cui vengono poi posizionate le capanne degli abitanti del villaggio.
Una volta impostato il punto di vista del giocatore ci siamo resi conto che la parte superiore non veniva mai visualizzata. Ci siamo occupati solo dei lati, di una piccola parte scoscesa ed abbiamo dipinto a mano su Substance Painter utilizzando delle texture custom miste a quelle del terreno, per creare continuità con la mappa.
Capanne e Staccionate
Il falegname virtuale. Fare un sacco di legna senza impazzire Fortuna vuole che tutto ciò che è da costruire deve essere fatto con dei tronchi.
il tronco d’albero del 1300 di sicuro non usciva dalla fabbrica dritto e preciso quindi bisogna dargli del movimento: Usando dei cilindri li abbiamo dotati di alcune edge loop (in base alla larghezza) ed abbiamo messo un displacement cloud in world space: in due secondi avevamo tutti i tronchi che volevamo, usando dei semplici array.
Le staccionate
è l’unico elemento della scena che utilizzi le Lod di Unity: essendo presenti attorno a tutto il villaggio ed avendo la necessità di inserirle manualmente nei posti prestabiliti abbiamo creato tre diverse entità, usando una singola texture. Quelle più lontane sono composte davvero da poche decine di poligoni. Tutte utilizzano una versione modificate dei tronchi d’albero che abbiamo realizzato prima
Le capanne
A parte zone che non si vedono tutti i pezzi di legno sono posizionati esattamente come nella ricostruzione della capanna presente nel museo.
Abbiamo prodotto anche una versione interna della stessa ma il risultato per l’esterno ci permetteva di togliere pezzi della struttura e metà dei poligoni dei tronchi (quelli interni), invero invisibili all’occhio. Abbiamo piazzato dentro una mesh completamente nera per non far passare la luce, in modo da dare una sensazione di “pieno”.
Cielo
Ovvero “le nuove si muovono” (spoiler, no)
Fog Volume
https://assetstore.unity.com/packages/tools/particles-effects/fog-volume-3-81802
Il sistema di nuvole più figo che siamo riusciti a trovare e provare, permette di avere delle nuvole volumetriche, la nebbia volumetrica, Godray (i raggi di luce dal cielo) il tutto condito con ombre in tempo reale e tante belle cose.
Bello.
Pesa come un macigno.
Quindi abbiamo deciso di lasciare le nuvole in cielo alla classica skybox ed usare la sua nebbia volumetrica per avere un pò di foschia.
Le nuvole finte
https://github.com/TheMasonX/UnityPCSS
Per dare la sensazione di movimento delle nuvole abbiamo creato delle forme semplici (o come dico io, abbiamo agganciato delle sfere a caso) innestandole in un particle system.
Le abbiamo fatte generare da sinistra verso destra. Il resto l’ha fatto il sistema di ombre PCSS, rendendole più morbide. L’utente ha la sensazione che ci sia un cielo in movimento al costo di 4 mesh. Quindi se chiedono “il cielo si muove?” la risposta è “sisi…”
Il vento
https://assetstore.unity.com/packages/tools/visual-scripting/amplify-shader-editor-68570
C’è ma non si vede…Non è vero, non c’è e basta :V
Sempre in ottica di risparmio, avendo già il DX11GS che simula il vento in maniera più che decente sulla superficie d’erba abbiamo deciso di lasciar fare ad uno shader anche il movimento delle foglie degli alberi con il Lod maggiore. Agganciando un Double Sided Shader Cutsom che simula il movimento alle crune degli alberi abbiamo aggiunto un tocco di realismo in più. nLo stesso shader si può usare anche per i cespugli, o per altra vegetazione aggiuntiva, basta non esagerare.
Il risultato finale
(dopo aver impostato l’occlusion culling, aver
cancellato gli asset inutili e modificato la resa
delle texture in base alla distanza + post processing)
Bloopers
I glitch belli
Qui è quando ho applicato lo shader del movimento delle foglie la prima volta
Questi sono i test con i Layer
E le timeline che hanno dato i numeri dopo uno degli aggiornamenti di Unity :V
Cosa altro fare con le stesse meccaniche
La sacra tecnica del copia e incolla
Tutti questi elementi che vedete sopra sono stati fatti in 2 giorni soltanto, 10 ore in tutto. Ringraziando la Nasa coi file gratuiti (in Blender!) e l’asset store per l’aiuto!
Ricordatevi che la Realtà Virtuale è sperimentazione
ma ai clienti interessa soprattutto il risultato
Domande Time
potete farmele a questi indirizzi social, o qua sotto.
Grazie, Graziella e Grazie a tutti!
- Beavers.it
- HypotermicGames.com
- Uqido.com
- @thetmo
- facebook.com/theTMO
- thetmo@gmail.com
- Gli stickers telegram di Beavers!
https://telegram.me/addstickers/Beaversandfriends
Commenti