戻る 04. ハイカラー表示 次へ


これで好きな場所に点を置くことが出来ましたね。
しかしなんだか殺風景ですね...

今回は色数をフルに使って綺麗なグラデーションにしましょう。

GBAの表示色数は3万2千色です。
これは15ビットカラーでR5G5B5で表現されています。
わかりやすく並べると
fedcba9876543210
 rrrrrgggggbbbbb
と言った並びで色情報が入っています。

それでは前回の点を表示した原理を詳しく見てみましょう。

各色は変数r,g,bに代入してから使用しています。
それぞれに31を代入しています
なぜ31かと言うと各色5ビットですので最大は11111=31となります。
ということで各色は0〜31の32段階使用可能です。

モード3のメモリマップを見ると
フレームバッファ80K+スプライトキャラクタデータ16Kとなっています。
240*160*2で76800なので画面全体に描画すると
フレームバッファはほとんど使い切ってしまいます。
ですからダブルバッファの手法は残念ながら使えません。

逆にいうとVRAMは連番で並んでいるので表示するのはとても簡単だと言えます。
前回の点を描くサンプルでは
0x06000000 + (x + y * 240) * 2 = 色
となっていましたね。
VRAMの開始番地がアドレス0x06000000です。
そしてそこから240進むごとに次の行になっています。
ですからこのように点を打つ事が出来るのです。

とうことでハイカラー表示でグラデーションを描いてみましょう。

int main(void){
	int x, y;
	char r, g, b;

	*(unsigned short *)0x4000000=3 | 0x0400;

	for(y=0;y<160;y++){
		for(x=0;x<240;x++){
			*(unsigned short *)(0x06000000 + (x + y * 240) * 2)=
			((((0)>>3)<<10)+(((y)>>3)<<5)+((x)>>3));
		}
	}
	while(1){
	}
}

スクリーンショット

ループさせながら色を変えているだけですが綺麗に表示できました。
VRAMが連続しているのがこれでわかったと思います。
シフト演算がわからない人はC言語の勉強をしなおしてください。
GBAプログラムではビット単位の計算が多いのでこれが出来ないと何も出来ません。

ということは0x06000000から順番に色データを与えていくと
好きな画像が表示されますよね。次回は写真などの画像を表示してみましょう。