黃爸爸狗園

本園只有sanitizer,沒有狗籠

0%

GBA圖形處理邏輯模擬(二) - Tile mode

cover

前文提到GBA的圖形繪製總共有兩種模式: Tile mode與Bitmap mode,這兩種繪圖模式雖然使用相同的記憶體區段但是工作原理大不相同,因此我們可以將其視為兩個獨立的邏輯分別開發

我們緊接著就要來探討GBA tile mode的基礎知識

如何生成一幀畫面

背景與物件

先來看一個在Tile mode下繪製而成的遊戲畫面

demo_frame
Castlevania-Aria of sorrow, render by NO$GBA

畫面中所有看的到的東西基本上是由兩種東西疊合而成: 1. 背景(background, BG) 2. 物件(Object, OBJ)

他們之間的關係看起來會像是這樣:

bg_and_sprite

你會注意到背景與物件各有四層圖層,我們可以將剛剛的遊戲畫面分層來看

BG_0 BG_1
BG_0 BG_1
BG_2 BG_3
BG_2 BG_3
OBJ(我疊合成一層了)
OBJ

Tile & map

我們現在知道在Tile mode下,每一個畫面都是由背景跟物件所組成的了,那這些背景和物件又是如何被建構的呢?

要回答這個問題,我們必須從兩個方向來做分析:

  1. 用什麼東西組合 Tile mode下所有的東西基本上都是由Tile所組合而成的,我們這裡所說的tile,是一塊一塊由8*8個pixel所組成的圖形資料,類似這種(仔細看,這是骷髏騎士的劍柄) tile_sample

    Tile的格式請參閱GBA圖形處理邏輯模擬 - Tile format

  2. 如何組合 另外一個需要釐清的問題是,我們該如何組合這些8*8的tile來產生我們想要的圖形,這就牽涉到我們現在是要繪製背景圖層還是物件,兩者的組合邏輯有些差異,詳細說明請參閱以下文章:

Mode 0, Mode 1, Mode 2

Tile mode實質意義上指的是Mode 0, 1, 2這三個模式,因為這三種模式都使用tile建構畫面的基礎,因此統稱為tile mode

那這些mode有哪些特點呢,讓我們來仔細看一下這個表格:

mode_table

根據表格,我們可以得知以下數點不同之處:

  1. 是否有支援Affine(Rotation & Scaling)功能
  2. 最大可支援的Screen數量以及尺寸
  3. 最大可使用的Character(就是Tile)以及調色盤格式(palette)

BG control register

前面有提到Tile mode下總共會有4層背景圖層,這四層圖層會受到當前的mode number影響,決定是否能夠被使用

layer_info
  • text與rotation/scaling是?
    • 如表格所示,BG0與BG1這兩個圖層僅支援Text mode
      • 換言之就是沒有旋轉跟縮放的mode
    • 而BG2與BG3則除了text mode之外,還可支援旋轉縮放
      • 我會將rotation/scaling稱呼為affine

另外,這四層背景繪製時也會有一些可控的參數,描述如下,你可以依照下面給出的連結查閱他們的詳細資訊

bgcnt_info