Introduzione alla grafica
Eccomi di ritorno con un nuovo capitolo. Oggi vi do un'infarinatura generale sulla grafica. È un argomento teorico, procederemo poco per volta.
Come dicevo nell’introduzione il GBA ha uno schermo di 60 fps largo 240 pixel e alto 160, capace di rappresentare 327 568 colori.
Ha 5 layer che contengono grafica di cui 4 sono per gli sfondi e 1 per gli sprite.
Il GBA ha a disposizione 96kb totali utilizzati per la memoria video (che inizia all’indirizzo 0600:0000h), la memoria della palette di colori (all’indirizzo 0500:0000h) e la OAM (Object Attribute Memory) all’indirizzo 0700:0000h.
Dopo che una scanline è stata disegnata (letteralmente una riga dello schermo ossia 240 pixel) c’è una pausa di 68 pixel detta Horizontal Blank (Hblank) prima che ricominci.
Allo stesso modo dopo 160 scanline (Vertical Draw o Vdraw) c’è una pausa di 68 scanline prima che ricominci a disegnare (Vertical Blank o Vblank), come illustrato nell’imagine qui sotto.
Per evitare che l’immagine si stiri, la posizione degli sprite viene aggiornata durante il Vblank, per questo i giochi girano a 60 o 30 fps.
Per quanto riguarda i colori il GBA sfrutta il formato 5.5.5; sarebbe a dire 5 bit per il blu, 5 per il verde e 5 per il rosso: “xbbbbbgggggrrrrr” (dei 16 bit, il primo bit a sinistra non viene utilizzato).
Bitmap, tiled backgrounds e sprite
Il GBA conosce 3 tipi di rappresentazioni grafiche: bitmap, tiled backgrounds e gli sprite.
I tipi bitmap e tiled backgrounds hanno effetto sull’intero schermo e pertanto non possono essere attivate in contemporanea.
Nella modalità bitmap la memoria video considera lo schermo come se fosse un grafico cartesiano (o una matrice se preferite) di dimensione L x H, dove L è la larghezza e H è l’altezza. Per disegnare un pixel ci si posiziona nel punto di coordinate (x, y) e si colora.
I tiled backgrounds funzionano in modo completamente diverso. Prima si salvano dei tile grandi 8 x 8 pixel in una parte della memoria video e poi, in un’altra parte della memoria si costruisce una tile-map che contiene gli indici che dicono al GBA quali tile mostrare sullo schermo.
Infine abbiamo gli sprite, che possono essere grandi da 8 x 8 pixel fino a 64 x 64 pixel e sono oggetti grafici che possono essere trasformati in modo indipendente l’uno dall’altro.
N. B. In realtà nei giochi useremo solo i tiled background, poiché sono più efficienti. Ma poiché le modalità bitmap sono più semplici da capire, vedremo prima quelle.
Vsync
Come detto, sfruttiamo il Vblank per aggiornare le posizioni degli sprite.
Per fare ciò sfruttiamo una funzione che è costituita da due cicli while dove aspettiamo prima il Vdraw e poi il Vblank.
void vid_sync()
{
while(REG_VCOUNT >= 160); // Aspetta il Vdraw.
while(REG_VCOUNT < 160); // Aspetta il Vblank.
}
Dove REG_VCOUNT è il registro che conta a quale scanline ci troviamo e che abbiamo definito nel capitolo precedente.
Questo codice in realtà è incompleto, perché sfruttando questi cicli while consumiamo moltissima batteria visto che il processore lavora comunque in questo modo. Vedremo come completare il codice quando parleremo delle interrupt, in quanto è necessario mettere il GBA in low-power mode per minimizzare il consumo di batteria e "risvegliarlo" al momento del Vdraw.
Per oggi è tutto, ci vediamo presto con il prossimo capitolo dove vi parlerò nel dettaglio delle modalità bitmap.
Come sempre, se avete domande non esitate a chiedere.
fonte: https://gbadev.net/tonc/video.html
Tag: @evilespeon @ZedeFire @VincyDarkHeart @Macca