前文提到GBA的圖形繪製總共有兩種模式: Tile mode與Bitmap mode,這兩種繪圖模式雖然使用相同的記憶體區段但是工作原理大不相同,因此我們可以將其視為兩個獨立的邏輯分別開發
我們緊接著就要來探討GBA tile mode的基礎知識
如何生成一幀畫面
背景與物件
先來看一個在Tile mode下繪製而成的遊戲畫面
Castlevania-Aria of sorrow, render by NO$GBA |
畫面中所有看的到的東西基本上是由兩種東西疊合而成: 1. 背景(background, BG) 2. 物件(Object, OBJ)
他們之間的關係看起來會像是這樣:
你會注意到背景與物件各有四層圖層,我們可以將剛剛的遊戲畫面分層來看
BG_0 | BG_1 |
---|---|
BG_2 | BG_3 |
OBJ(我疊合成一層了) | |
Tile & map
我們現在知道在Tile mode下,每一個畫面都是由背景跟物件所組成的了,那這些背景和物件又是如何被建構的呢?
要回答這個問題,我們必須從兩個方向來做分析:
用什麼東西組合 Tile mode下所有的東西基本上都是由Tile所組合而成的,我們這裡所說的tile,是一塊一塊由8*8個pixel所組成的圖形資料,類似這種(仔細看,這是骷髏騎士的劍柄)
Tile的格式請參閱GBA圖形處理邏輯模擬 - Tile format
如何組合 另外一個需要釐清的問題是,我們該如何組合這些8*8的tile來產生我們想要的圖形,這就牽涉到我們現在是要繪製背景圖層還是物件,兩者的組合邏輯有些差異,詳細說明請參閱以下文章:
Mode 0, Mode 1, Mode 2
Tile mode實質意義上指的是Mode 0, 1, 2這三個模式,因為這三種模式都使用tile建構畫面的基礎,因此統稱為tile mode
那這些mode有哪些特點呢,讓我們來仔細看一下這個表格:
根據表格,我們可以得知以下數點不同之處:
- 是否有支援Affine(Rotation & Scaling)功能
- 最大可支援的Screen數量以及尺寸
- 最大可使用的Character(就是Tile)以及調色盤格式(palette)
BG control register
前面有提到Tile mode下總共會有4層背景圖層,這四層圖層會受到當前的mode number影響,決定是否能夠被使用
- text與rotation/scaling是?
- 如表格所示,BG0與BG1這兩個圖層僅支援Text mode
- 換言之就是沒有旋轉跟縮放的mode
- 而BG2與BG3則除了text mode之外,還可支援旋轉縮放
- 我會將rotation/scaling稱呼為affine
- 如表格所示,BG0與BG1這兩個圖層僅支援Text mode
另外,這四層背景繪製時也會有一些可控的參數,描述如下,你可以依照下面給出的連結查閱他們的詳細資訊
- 對應四層圖層的register分別被mapping在(2 bytes each):
- BG0CNT(0x0400'0008)
- BG1CNT(0x0400'000A)
- BG2CNT(0x0400'000C)
- BG3CNT(0x0400'000E)
- 各欄位的詳細說明請參照:
- Priority Specification
- Character Base Block
- Mosaic
- Color Mode
- Screen Base Block
- Area Overflow Processing Flag
- 要注意這個flag對BG0與BG1無效
- 詳細請參考GBA圖形處理邏輯模擬 - Affine background
- Screen Size