In 2.5D usi risorse 2D / tecniche di rendering per dare la sensazione di un ambiente 3D.
Ora, con quella definizione, nel seguente scenario potenzialmente ambiguo, sono necessarie alcune elaborazioni:
Gioco A
Utilizzando la grafica 3D, GPU accelerata e tutto (gli oggetti di gioco sono mesh, non immagini), con un angolo fisso della telecamera. Facciamo ancora peggio, la proiezione è ortografica, i classici 63,43 gradi. L'unico modo per notare a prima vista che la grafica non è 2D è perché 3DGC, tranne per il fatto che li rendi con estrema cura, sono facilmente differenziati dagli sprite di disegno a mano, non importa la proiezione usata per renderli. Puoi sperimentare diverse tecniche di rendering, parametri, shader, ecc. E avrai difficoltà a nascondere il fatto che si tratta di mesh 3D.
Gioco B
Una porta del gioco A, ma con piattaforme di targeting note per l'hardware che non gestisce molto bene la grafica 3D o che non la gestisce affatto. Quindi la porta sostituisce le maglie con gli sprite. Ad esempio, utilizza ancora 3D Bounding Boxes per le collisioni e gli oggetti hanno una proprietà position con valori x, y e z, poiché la logica di gioco non è stata per lo più toccata o non è stata toccata, è stato modificato solo il codice di rendering.
Poiché gli sprite di Game B sono rendering delle risorse 3D del Gioco A e, per rendere le cose più ambigue, il Gioco A non fa nulla che richieda shader complicati, nel 99% di tutte le GPU là fuori non è possibile differenziare un frame dal Gioco B di un fotogramma dal gioco A.
In 2.5D, l'interazione tra oggetti di gioco è limitata all'insieme di situazioni in cui l'illusione del 3D non può essere compromessa. Per rappresentare un abbraccio di due personaggi, ad esempio, dovrai creare un singolo file di immagine con i due personaggi che interagiscono, poiché cercare di rappresentare l'azione di abbraccio usando solo una singola immagine per personaggio sarebbe troppo difficile o impossibile. Forse puoi venire con un corpo di personaggio diviso in parti e disegnarle nell'ordine corretto. In 3D questo problema non esiste (ne esiste un altro, che pone correttamente i due personaggi in modo che non penetrino nella mesh dell'altro personaggio).
Ora, per visualizzare questo, immagina che i giochi A e B abbiano un bug che in alcune situazioni consente al personaggio del giocatore di passare attraverso un altro oggetto di gioco, permettendoci di distinguere facilmente tra quello 2.5D e quello 3D.
Gioco B, Render 2.5D, gli sprite sono ordinati per il valore z del suo vettore di posizione. In questo esempio z positivo è in basso e z negativo in alto. l'asse z e l'asse y sono paralleli ma z è ridimensionato di un fattore di 0,5 di y. Quindi se l'area visibile va da 10 a -10 anni, nella stessa area abbiamo da 20z a -20z. Gli oggetti con una z maggiore verranno disegnati per ultimi, quindi saranno visti come di fronte a oggetti con una z inferiore. L'ombra del personaggio del giocatore sembra strana perché le ombre sono in uno strato superiore rispetto al pavimento, ma in uno strato inferiore rispetto a tutti gli altri oggetti, quindi l'ombra del personaggio del giocatore non è mai in cima al cubo.
Gioco A, rendering 3D. Il buffer di profondità (noto anche come buffer z) viene utilizzato per i test di profondità di precisione dei pixel. Quindi, un oggetto non ha bisogno di occluderne completamente un altro, nemmeno un triangolo deve occluderlo completamente, abbiamo un test di profondità con precisione dei pixel. Possiamo ruotare gli oggetti di gioco in qualsiasi modo e ottenere comunque risultati realistici quando interagiscono.
In riassunto: in 2.5D uno sprite è davanti o dietro un altro sprite. In 3D, una mesh è composta da triangoli, ma il triangolo non è l'unità minima durante i test di profondità, puoi avere la precisione dei pixel. Naturalmente, la rotazione della telecamera in 2.5D è impossibile poiché le risorse sono state create per un angolo fisso della telecamera, mentre in 3D è naturale, se gli angoli della telecamera sono limitati dalla progettazione in un gioco 3D è un altro argomento.
Ci sono diversi trucchi per dare la sensazione di essere in un mondo 3D quando puoi solo rendere la grafica 2D, ho presentato solo un esempio rapidamente realizzato usando alcune risorse di un mio progetto abbandonato.
Perché non usare sempre il 3D e dimenticare 2.5D?
Bene, posso pensare in alcuni esempi del perché uno sviluppatore potrebbe preferire l'approccio 2.5D:
- Forse non conoscono o non apprezzano le API 3D (Direct3D, OpenGL, ce ne sono altre).
- Forse la piattaforma di destinazione non gestisce bene la grafica 3D (vecchi computer desktop, console 2D).
- Il tuo team può fare sprite sorprendenti ma non modelli 3D.
Quanto puoi approssimare i risultati della grafica 3D usando 2.5D?
C'è un orizzonte di complessità della programmazione e delle prestazioni. Quando ti avvicini a quell'orizzonte, inizi a dubitare che il tuo progetto sia davvero possibile in 2.5D o se devi passare al 3D. Ad esempio, puoi utilizzare il buffering z in 2.5D (in teoria), ma puoi pagare il costo della memoria video (vecchio computer desktop con grafica integrata, non potenti dispositivi mobili)? Vuoi pagare il costo di archiviazione di avere un'immagine extra per salvare la maschera z di ogni sprite?
I buoni candidati per la 2.5D sono i giochi di ruolo, pensa la serie Baldur's Gate, o RTS, pensa Age of Empires 1 e 2 (AoE 3 è completamente 3D e facilmente distinguibile).
Riferimenti utili:
Z-Buffering: http://en.wikipedia.org/wiki/Z-buffering
Proiezioni ortografiche: http://glasnost.itcarlow.ie/~powerk/GeneralGraphicsNotes/projection/orthographicprojection.html