Condividi tramite


Grafica 2D per i giochi DirectX

Si descrive l'uso degli effetti e della grafica bitmap 2D e si spiega come usarli nel gioco.

La grafica 2D è un sottoinsieme della grafica 3D inerente a bitmap o primitive 2D. Più in generale, non usa una coordinata z nel modo in cui farebbe un gioco 3D, poiché il gioco è solitamente limitato al piano x-y. Talvolta usa tecniche di grafica 3D per creare componenti visivi e lo sviluppo è in genere più semplice. Se non si ha esperienza con i giochi, un gioco 2D è un ottimo punto di partenza e lo sviluppo di grafica 2D può essere un'opportunità per acquisire familiarità con DirectX.

È possibile sviluppare grafica per giochi 2D in DirectX usando Direct2D o Direct3D o una combinazione di entrambi. Molte delle classi più utili per lo sviluppo di giochi 2D sono in Direct3D, ad esempio la classe Sprite. Direct2D è un insieme di API destinate principalmente alle interfacce utente e alle app che richiedono il supporto per le primitive di disegno, ad esempio cerchi, linee e forme poligonali piatte. Detto questo, offre un insieme potente ed efficiente di classi e metodi per la creazione di grafica per giochi, soprattutto per creare sovrimpressioni, interfacce e display HUD o per creare una varietà di giochi 2D, da semplici a ragionevolmente dettagliati. L'approccio più efficace alla creazione di giochi 2D, tuttavia, consiste nell'usare elementi di entrambe le librerie ed è proprio questo approccio che si userà per sviluppare grafica 2D in questo argomento.

Concetti generali

Prima dell'avvento della grafica 3D moderna e dell'hardware che la supporta, i giochi erano principalmente 2D e molte delle relative tecniche grafiche implicavano il movimento di blocchi di memoria, in genere matrici di dati di colore che venivano tradotti o trasformati in pixel sullo schermo in modalità 1:1.

In DirectX la grafica 2D fa parte della pipeline 3D. Esiste una varietà molto più ampia di risoluzioni dello schermo e hardware grafico disponibili e il motore grafico 2D deve essere in grado di supportarli senza compromettere la fedeltà.

Ecco alcuni dei concetti di base con cui è necessario acquisire familiarità prima di iniziare a sviluppare grafica 2D.

  • Pixel e coordinate raster. Un pixel è un singolo punto su uno schermo raster e ha una propria coppia di coordinate (x, y) che ne indica la posizione sullo schermo. Il termine "pixel" viene spesso usato in modo intercambiabile tra i pixel fisici che costituiscono il display e gli elementi di memoria indirizzabili usati per contenere i valori colore e alfa dei pixel prima che vengano inviati allo schermo. Il raster viene considerato dalle API come una griglia rettangolare di elementi pixel, spesso con una corrispondenza 1:1 con la griglia di pixel fisici di uno schermo. I sistemi di coordinate raster iniziano dall'angolo in alto a sinistra, con il pixel in corrispondenza del punto (0,0) nell'angolo in alto più a sinistra della griglia.
  • La grafica bitmap (talvolta denominata grafica raster) è data da elementi grafici rappresentati come una griglia rettangolare di valori pixel. Le classi sprite, matrici di pixel calcolate gestite indipendentemente dal raster, sono un tipo di elemento grafico bitmap comunemente usato per i caratteri attivi o oggetti animati indipendenti dallo sfondo in un gioco. I vari frame di animazione per una classe sprite sono rappresentati come raccolte di bitmap denominate "fogli" o "batch". Gli sfondi sono oggetti bitmap più grandi con una risoluzione uguale o maggiore di quella dello schermo raster e spesso fungono da sfondo per il campo del gioco.
  • La grafica vettoriale è grafica che usa primitive geometriche, ad esempio punti, linee, cerchi e poligoni per definire oggetti 2D. È rappresentata non come matrici di pixel, ma come equazioni matematiche che la definiscono in uno spazio 2D. Non ha necessariamente una corrispondenza 1:1 con la griglia di pixel dello schermo e deve essere trasformata dal sistema di coordinate di cui è stato eseguito il rendering nel sistema di coordinate raster dello schermo.
  • La conversione avviene quando si prende un punto o un vertice e si calcola la sua nuova posizione nello stesso sistema di coordinate.
  • Il ridimensionamento consiste nell'ingrandire o ridurre un oggetto di un determinato fattore di scala. Con un'immagine vettoriale, si riducono e si ingrandiscono i vertici dei componenti; con una bitmap si ingrandiscono o si riducono gli elementi pixel. Con le immagini bitmap, si perdono i dati pixel quando si riduce l'immagine e si ingrandiscono i singoli pixel quando si avvicina l'immagine. Nell'ultimo caso, è possibile usare le operazioni di interpolazione dei colori dei pixel, ad esempio il filtro bilineare, per uniformare i limiti di colore irregolari tra i pixel ingranditi.
  • La rotazione consiste nel ruotare un oggetto intorno a uno o più assi specificati. Con un'immagine vettoriale, i vertici della geometria vengono moltiplicati rispetto a una matrice di rotazione per ottenere il vertice ruotato; con un'immagine bitmap, è possibile usare algoritmi diversi, ognuno con un grado di fedeltà minore o maggiore nei risultati. Come per il ridimensionamento e la conversione, esistono API specifiche per le operazioni di rotazione.
  • La trasformazione avviene quando si prende un punto o un vertice in un sistema di coordinate e si calcola il punto o il vertice corrispondente in un altro sistema di coordinate. Sono inclusi traslazione, ridimensionamento e rotazione, nonché altre operazioni di calcolo delle coordinate.
  • Il ritaglio avviene quando si rimuovono parti di bitmap o geometria non comprese nell'area visualizzabile dello schermo o nascoste da oggetti con priorità di visualizzazione superiore.
  • Il buffer del frame è un'area in memoria, spesso nella memoria dell'hardware grafico stesso, che contiene la mappa raster finale che verrà disegnata sullo schermo. La catena di scambio è una raccolta di buffer, in cui si disegna in un buffer nascosto e, quando l'immagine è pronta, la si "scambia" con la parte anteriore e la si visualizza.

Considerazioni relative alla progettazione

Lo sviluppo di grafica 2D è un ottimo modo per acquisire familiarità con lo sviluppo con Direct3D e permette di dedicare più tempo ad altri aspetti critici dello sviluppo di giochi: audio, controlli e meccanismi del gioco.

Disegnare sempre in un buffer nascosto. Disegnando direttamente nel buffer del frame, l'immagine verrà visualizzata alla ricezione del segnale per la visualizzazione (in genere ogni 1/60 di secondo), anche se l'operazione di disegno non è stata completata.

Progettare il motore grafico per supportare una buona selezione di risoluzioni, da 1024x600 a 1920x1080 (o superiore). Il pubblico beneficerà del supporto per la risoluzione nativa del monitor LCD, in particolare con la grafica 2D.

L'ottima grafica sarà la risorsa visiva più importante. Anche se la grafica bitmap può essere meno attraente degli oggetti visivi fotorealistici 3D che usano le funzionalità del modello shader più recenti, un'ottima grafica ad alta risoluzione può spesso trasmettere più stile e personalità senza compromettere le prestazioni.

Riferimento