黃爸爸狗園

本園只有sanitizer,沒有狗籠

0%

GBA圖形處理邏輯模擬 - Object Attribute Memory(OAM)

cover

相較於BG在渲染時會依照Map memory中的Map data進行渲染,Object在渲染時則是依照OAM中的資訊來進行,本文將會對OAM特性進行說明

OAM layout

  • 我們的OAM位於0x0700'0000 ~ 0x0700'03ff,總共可以分成128塊,每一塊為6 bytes oam_layout

  • 每一個6 bytes的實體又分為三部分

    • Attribute 0 attr0
    • Attribute 1 attr1
      • x-coordinate: 描述此obj在螢幕上的x座標
      • Rotation/scaling parameter selection: 若此obj有啟用rotation/scaling功能,則可透過此field指定要使用的旋轉縮放矩陣,詳見下方說明
      • Horizontal/Vertical flip flag: 若此obj沒有啟用rotation/scaling功能,則可利用此flag標明需要水平/垂直相反繪製,需要注意的是這兩個flag剛好與Rotation/scaling parameter重疊
      • OBJ Size: 與OBJ shape配合,用於決定obj的size,見下表說明 obj_sizetb
    • Attribute 2 attr2
      • Character name: 如同map data,這裡個character name也是一個offset number,將其乘上0x20後即為此obj的tile data起始位置,要特別注意的是在DISPCNT(0x0400'0000)中的OBJ Character VRAM Mapping Format控制著obj tile在memory裡投排列的方式,詳見GBA圖形處理邏輯模擬 - Object tile memory

OBJ Rotation/Scaling Parameters

就如同先前在講Affine background時候提到的,OBJ也可以透過仿射矩陣來做旋轉與縮放,矩陣位於OAM之中,但是排列方式比較特殊,我們來回顧一下這張圖

oam_layout

我們可以發現運算所需要的PA、PB、PC、PD以6 bytes為間隔,分散存放,而旋轉方法大致上與GBA圖形處理邏輯模擬 - Affine background說明的一樣,但有幾點需要注意: - OBJ的旋轉是以自身中心點作為旋轉的基準,而非左上角