Le basi del Game Engine, il motore di gioco di Blender 3D 2.6 – Lezione 1; videotutorial e trascrizione
 |
Video sottotitolato
Per attivare i sottotitoli in questo video, aprire il menù in basso a destra nel Player YouTube e selezionare la casella "CC".
|
* * *
Salve a tutti, questa è la prima puntata di un minicorso introduttivo sulle basi del Game Engine, il motore di gioco di Blender 3D. Questa serie di tutorials nasce su richiesta di un gruppo di studenti dell'istituto Balducci di Pontassieve, vicino Firenze, infatti nel Novembre 2011 ho tenuto un corso sulle basi di Blender 3D 2.6 (corso proposto, tra l'altro, dagli stessi studenti alle docenti referenti, Marina Di Bartolomeo e Rossella Calonaci, che saluto).
Come molti di voi sapranno, ho realizzato un videocorso di 80 puntate sulle basi di Blender 3D, disponibile su Youtube e, in versione testuale, sul mio sito web, ma quello è un corso di BASE, non c'è proprio TUTTO; inoltre, non ci sono molti esempi pratici e, pecca notevole dei videotutorials, non c'è l'interazione con l'insegnante, non c'è la possibilità di chiedere chiarimenti in tempo reale o, in generale, fare qualche domanda.
Per questo motivo ho tenuto quel corso di 21 ore, caratterizzato, rispetto al videocorso che trovate online, da Case Study pratici, da realizzare in tempo reale in aula, su modellazione, illuminazione, texturing e rendering... alla fine, gli studenti del quinto anno volevano spingersi oltre: volevano imparare ad utilizzare il Game Engine, il motore di gioco di Blender 3D, per realizzare un'applicazione interattiva con grafica 3D da presentare come tesina per l'esame finale.
Ho suggerito loro di seguire qualche mio videotutorial sul Game Engine di Blender 3D 2.5 ma mi sono reso conto di non aver realizzato un progetto organico, da zero, come il videocorso sulle basi di Blender 3D, quanto dei tips & tricks su alcuni aspetti del GE, di poca o nessuna utilità per chi non conosce le basi dell'ambiente. Ho cercato quindi di organizzare tutto il materiale per realizzare dei videotutorials introduttivi sul Game Engine cercando di non fare un corso troppo tecnico-didascalico e di spiegare un po' di tutto, ossia argomenti relativi a un'applicazione, a uno sparatutto, a un platform game, eccetera... ed eccoci qui.
Questo videocorso è per chi conosce già le basi di Blender Internal ed anzi ha dimestichezza con la modellazione, i materiali e l'illuminazione, per cui non mi soffermerò a descrivere la modellazione di un oggetto o di un ambiente o a spiegare la differenza tra una lampada Spot con Buffer Shadow e una Point Light, dando argomenti del genere per scontati; se non conoscete bene questi elementi, date prima un'occhiata al videocorso sulle basi di Blender 3D.
In questa prima puntata non parleremo dell'interazione e della logica del motore di gioco: vedremo, invece, come attivare il Game Engine e come risolvere i primi dubbi che vengono in mente a tutti quando premono il fatidico tasto P e non vedono il colore dello sfondo, le ombre o le Textures così come le hanno impostate nella 3D View o come le vedono in fase di rendering.
Iniziamo! La prima cosa da fare è, ovviamente, avviare Blender 3D, in questo caso versione 2.61. Siamo abituati a modellare, illuminare e texturizzare gli oggetti con il motore di rendering di default, Blender Internal, ma per sviluppare un'applicazione 3D, che prevede quindi la resa grafica in tempo reale (generalmente, a 25 frames al secondo o più) e l'interazione con l'utente, dobbiamo passare ad un altro ambiente di lavoro, detto appunto Game Engine, motore di gioco, anche se quel “gioco” è fuorviante perché col GE potete sviluppare anche applicazioni per lavoro, visite virtuali in musei, console di comando che interagiscono con dispositivi hardware mediante rete o altri dispositivi, ed altro ancora.
La resa grafica in tempo reale giustifica, in particolare, il passaggio ad un altro ambiente di lavoro: quando si imposta una scena per un rendering o un'animazione, infatti, si ha la possibilità di premere F12, alzarsi e fare altre cose (a volte anche dormire tutta la notte) mentre il pc renderizza un frame, che a seconda dei casi può richiedere diversi minuti o ore (dipende dal grado di fotorealismo, dagli effetti implementati, dalla risoluzione, dal Compositing, eccetera); alla fine, terminato il rendering, salviamo l'immagine o l'animazione e abbiamo finito.
Chiaramente, non possiamo permetterci questi tempi con un videogioco, dove il frame rate, ossia il numero di fotogrammi da visualizzare (leggi: rendering della scena) dev'essere di almeno (ALMENO!) 24-25 fotogrammi al secondo. Si arriva a queste performance con un mix di trucchetti per gestire meglio la resa (ad esempio, ombre non in tempo reale e assenza di effetti di rifrazione e mirroring, almeno di base), simulazioni fisiche precalcolate e hardware potente.
Per passare all'ambiente del Game Engine, il nostro ambiente di lavoro per tutto il minicorso, selezioniamo “Blender Game” dal selettore “Engine” (la cui voce di default è “Blender Render”, il motore di rendering interno di default di Blender 3D), nella finestra Info, in alto.
Ad una prima occhiata, sono cambiate le voci nella scheda Render, nella Properties Window, visibile a destra nella schermata, e tra pochissimo ne parleremo, comunque notiamo che nella 3D View non è successo niente: possiamo ancora aggiungere, cancellare, spostare e trasformare in generale, sia in Object che in Edit Mode, gli oggetti nella scena; siamo, cioé, in un ambiente di editing, di modellazione.
Per vedere l'esecuzione dell'applicazione 3D, posizioniamo il cursore del mouse su una finestra 3D View (magari quella con la vista telecamera) e premiamo P: ecco, adesso siamo in modalità esecuzione, in modalità gioco; P, infatti, sta per Play.
Non succede nulla perché di base gli oggetti non sono oggetti dinamici, soggetti cioé a forze (come quella di gravità), per cui non cadono e non si spostano, né abbiamo stabilito come interagire con l'ambiente, quindi è inutile premere tasti della tastiera o fare click col mouse (tra l'altro, non vediamo il cursore del mouse), né ci sono animazioni... niente di niente! Un po' deludente, come prima esecuzione dell'applicazione! Terminiamo quindi l'esecuzione premendo ESC, per tornare alla modalità modellazione.
Diamo un'occhiata alla scheda Render, all'interno della Properties Window: qui notiamo la presenza del pulsante “Start” al posto di “Image” e “Animation”, presenti con Blender Render, proprio perché ora dobbiamo eseguire l'applicazione, non lanciare un rendering... Il tasto P è proprio lo shortcut per questo “Start”, quindi è possibile lanciare l'applicazione con P, Start oppure “Start Game Engine” nel menù “Game”, finestra Info in alto.
La risoluzione della finestra, in Resolution X e Y, si riferisce alla grandezza della finestra del gioco quando lo eseguiamo in Blender oppure quando lo rilasceremo come applicazione a parte, o “stand-alone”, infatti le applicazioni 3D realizzate col Game Engine possono essere rilasciate come eseguibili indipendenti, senza doverle lanciare ogni volta da Blender. Parleremo di questo tra qualche puntata.
Se volete realizzare un gioco con una risoluzione prefissata, ad esempio 640x480 (quella di default), impostate i valori nei campi X, Y e lasciate “Letterbox”, in modo da colorare con il colore indicato nella Color Box sotto le altre parti dello schermo (default: nero), altrimenti scegliete Extend per estendere la visualizzazione a schermo intero.
Ogni tanto visualizzerò le varie opzioni premendo P, per vedere l'applicazione a runtime; vi consiglio di fare la stessa cosa, anche perché non sempre quello che si vede nella 3D View corrisponde all'esecuzione dell'applicazione in tempo reale (esempio immediato: il bordo colorato di Letterbox non è visibile nella 3D View).
La sezione “stereo” fa riferimento alla possibilità di realizzare applicazioni da visualizzare in 3D, ossia alla visione stereoscopica, ad esempio mediante i famosi occhialini con le lenti colorate (tipicamente, rosso e ciano), con la modalità nota come “Anaglifo”, infatti selezionando “Stereo”, lasciando “Anaglyph” e premendo P vedremo gli oggetti nella scena con il doppio bordo, rosso e ciano, e potremo vederli davvero in 3D indossando quegli occhialini. Il Game Engine mette a disposizione anche altre modalità per la visualizzazione 3D ma in questa sede non ne parleremo, per cui torniamo a None, nessuna opzione stereo.
Saltiamo per un secondo la sezione Shading e diamo un'occhiata a Display, in basso nella scheda: qui possiamo attivare la visualizzazione del cursore del mouse a runtime, selezionando appunto “Mouse Cursor”, e quella di alcune informazioni come le proprietà di sistema (Debug Properties) o fisiche degli oggetti (Physics Visualization, per visualizzare ad esempio informazioni su collisioni, deformazioni o rimbalzi), basta selezionare le voci e premere P per farsi un'idea del loro utilizzo.
Consiglio di non utilizzare Physics e di attivare, possibilmente, Mouse e Debug, per analizzare le proprietà del sistema o individuare il cursore del mouse quando si fanno dei test, ad esempio lo spostamento della visuale muovendo il mouse (opzione che di default non è disponibile) o altri esperimenti, prima di rilasciare l'applicazione come file eseguibile a parte.
Eccoci all'argomento che terrà banco per questa puntata e che avrà ripercussioni in tutte le altre: la scelta dell'ombreggiatore (shader) da utilizzare!
Se non lo avete ancora fatto, forse questo è il momento giusto per mettere il video in pausa e riposarsi un attimo, prima di passare alla seconda parte di questo tutorial.
* * *
Prima di procedere con gli shader, una piccola nota: per visualizzare correttamente i colori degli oggetti, le ombre in tempo reale o le Texture, soprattutto con lo shader GLSL (che introdurremo a breve) dobbiamo sempre passare alla modalità di visualizzazione Textured nella 3D View, come sto facendo in questo momento a video.
Lo shader è l'algoritmo utilizzato da Blender per definire la colorazione e l'ombreggiatura degli oggetti in fase di visualizzazione degli stessi, ossia in fase di rendering o, come nel nostro caso, di esecuzione del gioco, fotogramma per fotogramma.
Il Game Engine di Blender 3D 2.61 mette a disposizione tre shaders, selezionabili (in maniera esclusiva, ovviamente) mediante tre pulsanti nella scheda Render, all'interno della Properties Window: SingleTexture, MultiTexture e GLSL. E' importante conoscere le loro caratteristiche principali prima di procedere con la definizione di ambienti, luci, materiali e textures nella nostra applicazione.
SingleTexture è il tipo base: la colorazione avviene per vertice, il che significa che mesh con pochi vertici potrebbero presentare degli errori, inoltre è supportata una sola Texture per Material, che deve essere mappata con mappatura UV e non sono disponibili le ombre in tempo reale.
Per effettuare la mappatura UV dobbiamo quindi aprire l'immagine utilizzata come Texture in una finestra UV Editor delle immagini e fare l'unwrapping come in Blender Render, impostando poi la mappatura UV Coordinates e il relativo Layer nella scheda Mapping della Texture.
NOTA importante: le Textures procedurali NON vengono visualizzate in tempo reale, per cui bisogna fare il Bake di tali Textures, in modo da ottenerle come immagini “scucite” da salvare a parte, con il Blender Internal, per poi caricarle come Textures immagine UV-mappate nel Game Engine; mostrerò come fare quanto detto nella prossima puntata.
Come suggerisce il nome, Single Texture supporta una sola Texture, per cui se vogliamo aggiungere più Textures da miscelare in vari modi, ad esempio un'immagine ottenuta mediante Bake dell'Ambient Occlusion del modello da moltiplicare all'immagine utilizzata per il colore diffuso dello stesso, in modo da scurire le zone in prossimità delle occlusioni, dobbiamo passare per forza all'ombreggiatore MultiTexture, che ci consente di associare appunto più Textures ad un Material.
MultiTexture supporta due o tre Textures che devono essere comunque UV-mapped sul modello e possono essere miscelate in modalità Add, Multiply, Subtract o Mix; in quest'ultimo caso, bisogna agire sullo slider Color Diffuse per definire in che misura la Texture corrente dovrà sostituirsi alle altre, ossia quanto dovrà “pesare” in fase di miscelazione.
Il terzo ombreggiatore, GLSL (OpenGL Shading Language), è il più interessante: si basa sulle API OpenGL, supporta l'accelerazione hardware, consentita da praticamente tutte le schede video attualmente in circolazione, implementando le ombre in tempo reale (a patto di utilizzare le Spot Lights con ombre Buffer Shadow, come vedremo) e consentendo l'utilizzo della Color Ramp, l'utilizzo di più Textures UV-mapped (come MultiTexture) e dei Nodes per il Compositing.
Tutte queste opzioni possono essere disabilitate, nella pipeline di rendering, deselezionando le relative checkbox che appaiono nella scheda Shading, in Render nella Properties Window, quando si sceglie GLSL, possibilità che può tornare utile quando si fanno delle prove e non è necessario implementare TUTTI gli effetti, appesantendo l'esecuzione: ne bastano alcuni. Queste opzioni non sono disponibili con SingleTexture e MultiTexture in quanto non supportate da tali shaders.
Purtroppo, neanche GLSL implementa gli effetti di RayTracing, quindi niente trasparenza Raytrace con effetti di rifrazione e Glossiness e niente riflessi Mirror, a meno di non utilizzare degli script ad hoc che consentono, in pratica, di visualizzare su un oggetto “quello che l'oggetto sta vedendo”, in un certo senso... ma di questo parleremo un'altra volta.
Per i riflessi statici o con animazioni in un certo senso “programmate”, dove cioé non ci sono mutamenti dovuti a interazioni dell'utente o di altri elementi, ma animazioni stabilite a priori da chi crea il gioco, è possibile ricorrere al trucchetto delle EnvMaps, descritte nella 53esima puntata del mio videocorso sulle basi di Blender 3D 2.5 e 2.6.
Neanche a dirlo, consiglio vivamente di lavorare con GLSL piuttosto che con SingleTexture o MultiTexture.
Come anticipato, GLSL consente la visualizzazione delle ombre in tempo reale, ma solo per le ombre proiettate da Spot Light con Buffer Shadow; cambiamo quindi la fonte di luce presente nella scena di default (o aggiungiamone una nuova) in Spot Light e, nella scheda Object Data di tale oggetto, scegliamo la modalità Buffer Shadow per le ombre.
Il parametro che ci interessa, all'interno di Buffer Shadow, è Size, che serve a specificare la dimensione del buffer delle ombre; a seconda del valore di risoluzione si avranno risultati migliori, ma con un maggior utilizzo delle risorse di sistema.
A parte questo parametro possiamo impostare, per il faretto, la dimensione del cono di luce, mediante la voce Spot Size nella sezione Spot Shape della scheda Object Data, nella Properties Window; impostare 180° avrà l'effetto di SIMULARE una fonte di luce Area, buona ad esempio per pannelli luminosi o per gli esterni, in grado di proiettare ombre.
Conviene comunque non abusare delle ombre Buffer Shadow all'interno di un gioco, o almeno utilizzare valori modesti per le impostazioni, per evitare di avere rallentamenti durante l'esecuzione. Possiamo vedere le ombre in tempo reale già nella 3D View, senza bisogno di lanciare il Rendering, se abbiamo GLSL selezionato e la modalità di visualizzazione Textured.
Con queste condizioni (cioé GLSL e Textured) possiamo vedere anche la trasparenza degli oggetti provvisti di Material con Transparency attivato e un valore minore di 1 per Alpha, l'opacità, come sto mostrando in questo momento a video. Ricordo che la trasparenza RayTrace non è supportata: se si sceglie RayTrace e si abbassa il valore di Alpha, si finisce col miscelare il colore dello sfondo, World, con il colore e le Texture della mesh, e portando Alpha a 0 il colore della mesh sarà sostanzialmente il colore dello sfondo applicato in maniera shadeless, senza ombreggiature; conviene, quindi, utilizzare la trasparenza Z-Transp.
Tre problemi con le ombre proiettate da Spot con Buffer Shadow: le ombre degli oggetti semitrasparenti non vengono proiettate (nemmeno se attiviamo Receive Transparent nei Materials degli oggetti che le riceveranno), mentre in generale (cioé anche con oggetti opachi) i bordi non sono sfumati e comunque non vogliamo dover inserire Spot Lights per le ombre, anche perché a volte le ombre delle nostre scene sono statiche e non muteranno in seguito all'interazione dei personaggi con l'ambiente o altri eventi, per cui il calcolo in tempo reale è pure uno spreco... beh, la soluzione c'è e consiste nel precalcolare le ombre, ottenendole come Texture mediante Baking, per poi applicare tale Texture come immagine UV-Mappata, in questo caso in modalità Multiply, per scurire gli oggetti: è lo stesso discorso fatto per Ambient Occlusion poco fa e tutto si basa su questo famoso Bake, che tratteremo nella prossima puntata.
Nota sul colore dello sfondo: potete impostarlo cambiando Horizon Color nella scheda World; lo sfondo non viene colorato nella 3D View in fase di Editing, neanche in modalità Textured e GLSL, ma solo a runtime.
In World è possibile attivare anche MIST, la nebbia o foschia, per nascondere gli oggetti molto lontani con una specie di dissolvenza, utile soprattutto con scenari ampi perché la telecamera non renderizza a infinito, quindi gli oggetti posti oltre una certa distanza (da impostare con Clip End, nella scheda Object Data della telecamera) potrebbero sparire all'improvviso superata la distanza massima Clip End; ecco, per evitare questo brutto effetto, potete fissare l'inizio della nebbia con Mist Depth ad un valore leggermente inferiore di quello impostato per Clip End.

Bene, per questa prima puntata sul Game Engine è tutto; abbiamo visto alcuni elementi di base dell'ambiente del motore di gioco e capito perché dobbiamo scegliere bene lo Shader, passare alla modalità Textured nella 3D View, utilizzare le Spot Light per le ombre in tempo reale, preparare dei modelli semplici per poter mappare poi le Textures UV con facilità ed altro ancora; nella prossima puntata parleremo del BAKE delle Textures e di come fare per inserire Textures animate a runtime, mentre nella terza parleremo invece degli aspetti legati all'interazione, quindi la logica del motore di gioco, le Properties di scena e oggetti e una piccola introduzione sulla fisica nel GE.
A presto!
|