ブレンドはBGやスプライトから2つのグループを選択し、一定の割合で色を混ぜて表示します。アルファブレンド、フェード(白)、フェード(黒)があります。
#define REG_BLDCNT *((vu16 *)(REG_BASE + 0x50)) #define BLEND_TOP_BG0 (1<<0) //TOP #define BLEND_TOP_BG1 (1<<1) #define BLEND_TOP_BG2 (1<<2) #define BLEND_TOP_BG3 (1<<3) #define BLEND_TOP_OBJ (1<<4) #define BLEND_TOP_BD (1<<5) #define BLEND_LOW_BG0 (1<<8) //LOW #define BLEND_LOW_BG1 (1<<9) #define BLEND_LOW_BG2 (1<<10) #define BLEND_LOW_BG3 (1<<11) #define BLEND_LOW_OBJ (1<<12) #define BLEND_LOW_BD (1<<13)
一番目のグループと二番目のグループに、どのBGやスプライトを割り当てるかの設定を行います。TOPのほうは一番目のグループに、LOWのほうは二番目のグループに割り当てます。両方のグループに同じものを割り当てることも可能です。BG0-BG3はその番号のBG、OBJはスプライトすべて、BDは背景(詳細は不明)です。フェードモードのときはTOPに設定したものだけが対象になります。スプライトはスプライト同士の色の混ぜ合わせは行われないようです。
#define BLEND_MODE_OFF (0<<6) //MODE #define BLEND_MODE_ALPHA (1<<6) #define BLEND_MODE_LIGHT (2<<6) #define BLEND_MODE_DARK (3<<6)
MODEはブレンドの種類です。OFFは何もしません。
#define REG_BLDALPHA *((vu16 *)(REG_BASE + 0x52)) #define BLEND_LOW(n) ((n)<<0) #define BLEND_HIGH(n) ((n)<<8) #define BLEND_LEVEL(n) (BLEND_LOW(n) | BLEND_HIGH(n)) #define BLEND_BALANCE(n) (BLEND_LOW(n) | BLEND_HIGH(16-n))
アルファブレンドを選んだ場合のそれぞれのグループの色を混ぜる割合です。LOWが2番目のグループ、HIGHが1番目のグループの割合になります。数値は0-16が設定できます。0が全くそのグループの色を発色せず、数値が大きくなるとその色が濃くなりますが、16が最高の割合で、それ以上の数値になっても変化しません。LEVELは2つのグループの発色を同じにします。BALANCEは2つのグループの値の合計が16(100%)になるようにします。
#define REG_BLDY *((vu16 *)(REG_BASE + 0x54)) #define BLEND_DEPTH(n) ((n)<<0)
こちらはフェードを選んだ場合の黒または白と混ぜ合わせる割合となります。値は0が元の画像と同じ、16が最高(真っ黒または真っ白)で、それ以上は変化なしです。
#include "lib/gba.h" #include "bg.h" #include "irq.arm.h" #include "key.h" //--------------------------------------------------------------------------- int main(void) { BgInit(); IrqInit(); KeyInit(); s32 bld = 10; u16 cnt; for(;;) { VBlankIntrWait(); REG_BLDALPHA = BLEND_BALANCE(bld); KeyExec(); cnt = KeyGetCnt(); if(cnt & KEY_UP ) bld--; if(cnt & KEY_DOWN) bld++; if(bld < 0) bld = 0; if(bld > 16) bld = 16; } }
上記のコードにはないですが、bg.c内でブレンドを表示させています。
REG_DISPCNT = (MODE_0 | BG0_ON | BG1_ON); REG_BLDCNT = (BLEND_TOP_BG0 | BLEND_LOW_BG1 | BLEND_MODE_ALPHA);