黃爸爸狗園

本園只有sanitizer,沒有狗籠

0%

GBA圖形處理邏輯模擬 - Tile format

cover

本文會專門針對GBA tile mode下所使用的tile format做詳細的說明

VRAM layout

GBA的視訊記憶體VRAM總共有96KBytes,但是其中的佈局會根據當前的BG mode而有所改變,見下圖: vram_layout

本系列文會以map data來稱呼任天堂官方手冊上的screen data,tile data稱呼character data

我們可以看到總共有四種不同的data:

  1. OBJ Character data
    • 為存放組成obj所用的tile的記憶體位置,要注意的是tile mode下與bitmap mode下的OBJ tile area大小並不相同,這將會影響到最多能夠使用的tile數量
  2. BG Screen data
    • 描述一個背景圖層中所有tile的組成以及屬性,要注意此區域與BG tile共用,詳細規則見下方描述
  3. BG Character data
    • 存放組成BG圖層所用的tile的記憶體位置
  4. Frame buffer
    • bitmap mode下的繪製區域

VRAM layout under tile mode

BG tile data以及BG map data在VRAM中的排列規則如下圖所述:

tile_data_layout

我們可以看到除了OBJ tile data之外,BG的map data跟tile data是混在一起的,而每一個BG layer的tile data base address為 - 0x0600'0000 + BGXCNT中的Character base block欄位數值 0x4000

Tile data layout

讓我們使用一個8 8的tile來當作範例

tile_sample

這個tile的pixel在GBA中會有兩種可能的色彩表示方式:

  1. 16色模式 data16_layout
  • 在這個模式下,1 byte可以表示2個pixel,也就是說每個pixel的palette color index範圍是種,而每個完整的tile為32 bytes
  • 在此模式下可以透過修改Map data(或者是OAM)中的Color Palette field來實現調色盤切換,也就是各位十分熟悉的-2P色
  1. 256色模式 data256_layout
  • 在此模式下,每一個pixel所佔的記憶體空間為1 byte,也就是說可以有 = 256種顏色,另外一個完整的tile為64 bytes
  • 由於每一個pixel的color index都完全覆蓋住palette,因此不能夠調整palette number了

Palette memory

上面有提到tile data中存放的是color index,用於在調色盤(palette)中索引出正確的顏色,palette memory的特性如下:

  • 位於0x0500'0000,共0x400(1024 bytes)
  • 被分為兩部分,各512 bytes
    • 前512 bytes為BG palette,bg tile data中的color index會對應到此
    • 後512 bytes為OBJ palette, OBJ tile data的color index會對應到此
  • 每一個顏色為2 bytes,故兩個palette都是512/2 = 256色,其色彩格式如下所述

Pixel format

眾所周知,如果你想要在電腦系統中顯示顏色,必定要利用一些格式來描述你最終顯示在螢幕上的每一個pixel的顏色,常見的格式有RGB、YUV、HSV等系統

而GBA所使用的色彩系統為RGB,讓我們從binary的角度來觀察每一個pixel的資料:

pixel format

上圖很清楚地描述了GBA所使用的色彩格式,R、G、B是如何被儲存的,我們可以得出以下數點結論: 1. 每個顏色(我們叫他Color channel)的寬度為5bit,總共可以有種變化 2. 每個pixel為了記錄RGB,會消耗2 bytes的空間,並且最高位元是沒有作用的 3. 這種RGB各占5bit的格式有一個特殊的名字-BGR555

這裡一定要特別提,我沒有打錯!! 是BGR沒有錯 我們講RGB***指的是從MSB到LSB的排列方式為RGB,反之亦然 附上RGB565的示意圖以供參考

RGB565