画面モード
さっきの英語サイトに書いてある事を書き出してみることにする。日本語の資料が欲しいんじゃー(ノД`、)
Graphic Modes
graphic modes
mode | main screen | sub screen |
---|---|---|
MODE_0_2D MODE_0_3D |
BG0: text / 3D BG1: text BG2: text BG3: text |
BG0: text BG1: text BG2: text BG3: text |
MODE_1_2D MODE_1_3D |
BG0: text / 3D BG1: text BG2: text BG3: rotation |
BG0: text BG1: text BG2: text BG3: rotation |
MODE_2_2D MODE_2_3D |
BG0: 3D BG1: text BG2: rotation BG3: rotation |
BG0: text BG1: text BG2: rotation BG3: rotation |
MODE_3_2D MODE_3_3D |
BG0: text / 3D BG1: text BG2: text BG3: extended rotation |
BG0: text BG1: text BG2: text BG3: extended rotation |
MODE_4_2D MODE_4_3D |
BG0: text / 3D BG1: text BG2: rotation BG3: extended rotation |
BG0: text BG1: text BG2: rotation BG3: extended rotation |
MODE_5_2D MODE_5_3D |
BG0: text / 3D BG1: text BG2: extended rotation BG3: extended rotation |
BG0: text BG1: text BG2: extended rotation BG3: extended rotation |
MODE_6_2D MODE_6_3D |
BG0: 3D BG1: - BG2: large bitmap BG3: - |
not available |
MODE_FB0 MODE_FB1 MODE_FB2 MODE_FB3 |
framebuffer | not available |
これらのモードはvideoSetMode( ),videoSetModeSub( )によって選択が可能。
videoSetMode(MODE_5_2D | DISPLAY_BG2_ACTIVE | DISPLAY_BG3_ACTIVE);
videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE);
引数として4つのバックグラウンド全てを有効にすることも可能。
デフォルトでメイン画面は上の液晶になっている。これが気に入らなければ
lcdSwap( );
を使用することで上下の液晶画面を入れ替えることができる。
もし画面を使わないならば引数に0を入れると良い。
Background Types
We have six types of backgrounds:
- framebuffer
画面に表示されるメモリへ直接描画が可能なモード。16bitのみ。
It is 256*192 pixels in size and has 16 bit/pixel color (5 bits red, green and blue - bit 15 gets ignored). - 3D
OpenGLに似たコマンドで3D描画が可能なモード。
その為、直接描画はできません。 - text
テキスト表示モード。
タイル構造になっていると言うことができる(?)。最大サイズは64*64block(512*512pixels)。地図は32*32blockに整列されます。
→画面表示は32*32block?それ以上のサイズはスクロール等で使用かな。 - rotation
textに似たモード。但し回転が可能。
最大128*128blockが指定可能。and use 8bit maps instead of 16bit maps like text backgrounds. Rotation maps are arranged sequentially.(ノД`、) - extended rotation
フレームバッファのように使えるモード。8bit,16bitが使用可能。
ここで指定できるバッファサイズよりも画面解像度の方が大きかったり小さかったりするが、回転拡大縮小スクロールを駆使してなんとかすることが可能だ。16bit color使用時、15bit目はalphaになっています。 - large bitmap
512*1024又は1024*512の8bit image。(これでもう既に512kb使用している!これを使うにはVRAMのbank A〜Dが必要になるでしょう!)
text variants
Resolution | Defined | Map Size | Layout |
---|---|---|---|
256x256 | BG_32x32 | 2kb | 32x32 |
256x512 | BG_32x64 | 4kb | 32x64 |
512x256 | BG_64x32 | 4kb | (32x32)+(32x32) |
512x512 | BG_64x64 | 8kb | (32x32)+(32x32)+(32x32)+(32x32) |
rotation variants
Resolution | Defined | Map Size | Layout |
---|---|---|---|
128x128 | BG_RS_16x16 | 256bytes | 16x16 |
256x256 | BG_RS_32x32 | 1kb | 32x32 |
512x512 | BG_RS_64x64 | 4kb | 64x64 |
1024x1024 | BG_RS_128x128 | 16kb | 128x128 |
extended rotation variants
Resolution | Size@8bit/pixel | Size@16bit/pixel |
---|---|---|
128x128 | 16kb BG_BMP8_128x128 |
32kb BG_BMP16_128x128 |
256x256 | 64kb BG_BMP8_256x256 |
128kb BG_BMP16_256x256 |
512x256 | 128kb BG_BMP8_512x256 |
256kb BG_BMP16_512x256 |
512x512 | 256kb BG_BMP8_512x512 |
512kb BG_BMP16_512x512 |
(このdefineをどうやって使うのかはまた後ほど)
VRAM
VRAM
bank | control register | size | what it can be used for |
---|---|---|---|
VRAM VRAM_A |
VRAM_A_CR | 128kb | VRAM_A_LCD VRAM_A_MAIN_BG_0x6000000 = VRAM_A_MAIN_BG VRAM_A_MAIN_BG_0x6020000 VRAM_A_MAIN_BG_0x6040000 VRAM_A_MAIN_BG_0x6060000 VRAM_A_MAIN_SPRITE VRAM_A_TEXTURE_SLOT0 = VRAM_A_TEXTURE VRAM_A_TEXTURE_SLOT1 VRAM_A_TEXTURE_SLOT2 VRAM_A_TEXTURE_SLOT3 |
VRAM_B | VRAM_B_CR | 128kb | VRAM_B_LCD VRAM_B_MAIN_BG_0x6000000 VRAM_B_MAIN_BG_0x6020000 = VRAM_B_MAIN_BG VRAM_B_MAIN_BG_0x6040000 VRAM_B_MAIN_BG_0x6060000 VRAM_B_MAIN_SPRITE VRAM_B_TEXTURE_SLOT0 VRAM_B_TEXTURE_SLOT1 = VRAM_B_TEXTURE VRAM_B_TEXTURE_SLOT2 VRAM_B_TEXTURE_SLOT3 |
VRAM_C | VRAM_C_CR | 128kb | VRAM_C_LCD VRAM_C_MAIN_BG_0x6000000 VRAM_C_MAIN_BG_0x6020000 VRAM_C_MAIN_BG_0x6040000 = VRAM_C_MAIN_BG VRAM_C_MAIN_BG_0x6060000 VRAM_C_ARM7 VRAM_C_SUB_BG_0x6200000 = VRAM_C_SUB_BG VRAM_C_SUB_BG_0x6220000 VRAM_C_SUB_BG_0x6240000 VRAM_C_SUB_BG_0x6260000 VRAM_C_TEXTURE_SLOT0 VRAM_C_TEXTURE_SLOT1 VRAM_C_TEXTURE_SLOT2 = VRAM_C_TEXTURE VRAM_C_TEXTURE_SLOT3 |
VRAM_D | VRAM_D_CR | 128kb | VRAM_D_LCD VRAM_D_MAIN_BG_0x6000000 VRAM_D_MAIN_BG_0x6020000 VRAM_D_MAIN_BG_0x6040000 VRAM_D_MAIN_BG_0x6060000 = VRAM_D_MAIN_BG VRAM_D_ARM7 VRAM_D_SUB_SPRITE VRAM_D_TEXTURE_SLOT0 VRAM_D_TEXTURE_SLOT1 VRAM_D_TEXTURE_SLOT2 VRAM_D_TEXTURE_SLOT3 = VRAM_D_TEXTURE |
VRAM_E | VRAM_E_CR | 64kb | VRAM_E_LCD VRAM_E_MAIN_BG VRAM_E_MAIN_SPRITE VRAM_E_TEX_PALETTE VRAM_E_BG_EXT_PALETTE VRAM_E_OBJ_EXT_PALETTE |
VRAM_F | VRAM_F_CR | 16kb | VRAM_F_LCD VRAM_F_MAIN_BG VRAM_F_MAIN_SPRITE VRAM_F_TEX_PALETTE VRAM_F_BG_EXT_PALETTE VRAM_F_OBJ_EXT_PALETTE |
VRAM_G | VRAM_G_CR | 16kb | VRAM_G_LCD VRAM_G_MAIN_BG VRAM_G_MAIN_SPRITE VRAM_G_TEX_PALETTE VRAM_G_BG_EXT_PALETTE VRAM_G_OBJ_EXT_PALETTE |
VRAM_H | VRAM_H_CR | 32kb | VRAM_H_LCD VRAM_H_SUB_BG VRAM_H_SUB_BG_EXT_PALETTE |
VRAM_I | VRAM_I_CR | 16kb | VRAM_I_LCD VRAM_I_SUB_BG VRAM_I_SUB_SPRITE VRAM_I_SUB_SPRITE_EXT_PALETTE |
私達はDSに、どのVRAM bankを使用するのか指定しなければならない。
656kbのVRAMは異なる用途とサイズを持った9つのバンクメモリにアクセスができる。もしあなたがVRAMに大きなサイズを要求するなら、複数のバンクを同時に使用が可能です。
Note:"VRAM"定義は"VRAM_A"のエイリアスです。決して特別なバンクメモリではありません。"VRAM"バンクを使用すると、0x60000000から始まるアドレスをマップされるでしょう。
VRAM bank指定には10の関数があります:
void vramSetBankA(VRAM_A_TYPE a);
(...省略)
void vramSetBankI(VRAM_I_TYPE i);
uint32 vramSetMainBanks(VRAM_A_TYPE a, VRAM_B_TYPE b, VRAM_C_TYPE c, VRAM_D_TYPE d);
vramSetMainBanks(a,b,c,d);はvramSetBankA(a);…B,C,D…と同じです。しかしリターン値として以前に使用された設定値が(ハンドル形式で)取得できます。この引数を使用すると、以下の方法で簡単に4つのbankが復元できます。
void vramRestoreMainBanks(uint32 vramTemp);
VRAM_x_TYPE定義がテーブルの最後のカラムに記述されています。しかしこれらの値は何を意味しているのでしょうか?
- VRAM_x_LCD
3D,framebufferモードであることの指定する。 - VRAM_x_MAIN_BG_0x60n0000
メイン画面としてこのVRAMを使用することを指定する。
もし256kbの領域を要求するなら、0x6000000〜0x6020000で1枚のスクリーンを作らなければなりません。 - VRAM_x_SUB_BG_0x62n0000
サブ画面。詳細はメインと同様。 - VRAM_x_MAIN_SPRITE
スプライトの為にこのVRAMを使用する。bank Aに0x06400000、bank Bに0x06420000が指定される。さらに上にbank Dが定義される。 - VRAM_x_SUB_SPRITE
サブ画面スプライト指定。
0x06600000〜0x06660000をbankA〜Dにマップされる。 - VRAM_X_TEXTURE_SLOT
- VRAM_X_ARM7
- VRAM_X_TEX_PALETTE
- VRAM_X_BG_EXT_PALETTE
- VRAM_X_SUB_BG_EXT_PALETTE
- VRAM_X_OBJ_EXT_PALETTE
- VRAM_X_SUB_SPRITE_EXT_PALETTE
最後の方は原文に書いていなかった(ノД`、)
VRAM_x_ARM7ってなんなんじゃー(ノД`、)
Background Control Register
各々のBGのための1つのCR
DSには8つのBGコントロールレジスタがあります。メイン画面、サブ画面各々のBGに1つずつCRがあります。メイン画面はBGn_CR、サブ画面はSUB_BGn_CRで呼び出します。
BG_CRはBG0_CRのエイリアスで、同様にSUB_BG_CRはSUB_BG0_CRのエイリアスです。これらのCRを任天堂DSで使用する場合、どんなイメージフォーマットやバックグラウンドイメージを置けば見つけられるのでしょうか。
videoSetMode(MODE_5_2D | DISPLAY_BG3_ACTIVE);
vramSetBankA(VRAM_A_MAIN_BG_0x6000000);
BG3_CR = BG_BMP16_256x256 | BG_WRAP_ON;
ここではMODE_5をメイン画面としました。しかしBG3(extended rotation)のみを有効としています。この場合、VRAM bankAに0x6000000がマップされ、その結果メイン画面が使用可能となります。
上にある例の最終行は、任天堂DSに対してBG3をサイズ256x256の16bit画像、そしてwrap around(なにこれ)指定しています。
Parameters for the CR
Here is a list of parameters for BGn_CR:
- BG_{32x32|32x64|64x32|64x64}
テキストBGで使用。 - BG_RS_{16x16|32x32|64x64|128x128}
rotation BGで使用。 - BG_BMP{8|16}_{128x128|256x256|512x256|512x512}
extended rotation BGで使用。bitの深さと解像度を指定。 - BG_BMP8_1024x512 and BG_BMP8_512x1024
MODE 6でのみ使用。 - BG_WRAP_ON
ラップを指定した場合、画像が最後まで移動したときにスクロールするでしょう(?)。これで「永遠にスクロール」させることができます。 - BG_PRIORITY(n) or BG_PRIORITY_n
BGの優先度指定。0が最も高く、3が最も低い。優先順位が高いBGは優先順位の低いBGの上で描画されます。同じ優先順位のスプライトの場合、BGの上で描画されるでしょう。 - BG_TILE_RAM(n)
メイン画面のみ!RAM上に0x6000000から開始される各々16kbの16blockのタイルデータを保持できる。このパラメータはどのブロックを使いたいかを選択します。 - BG_TILE_RAM_SUB(n)
サブ画面のみ!0x6200000から始まる以外はBG_TILE_RAMと同じ。 - BG_MOSAIC_ON
このフラグをセットするとモザイクエフェクトが使用できる。 - BG_MAP_RAM(n)
メイン画面のみ!RAM上に0x6000000から開始される各々2kbの32blockのタイルデータを保持できる。このパラメータはどのブロックを使いたいかを選択します。 - BG_MAP_RAM_sub(n)
サブ画面のみ!0x6200000から始まる以外はBG_MAP_RAMと同じ。
Additional register for each background
We have some more registers:
- BGn_X0
画面の左端をBGにマップする。 - BGn_Y0
画面の上端をBGにマップする。もしextended rotation BGを指定するなら、さらに以降にあるレジスタを指定できます。 - BGn_XDX
X軸スケーリング指定です。これは0.8.8の固定小数点で指定されます。特にスケーリングをしたくない場合は1.0(1<<8)を指定して下さい。例えば2倍に拡大したい場合は2.0(1<<9)を指定する事で背景は元の幅の半分しか表示されなくなるだろう。(2倍の拡大表示なのでbitmapの半分しか画面に表示ができなくなる) - BGn_XDY
回転と剪断指定。 - BGn_YDX
回転と剪断指定。 - BGn_YDY
Y軸スケーリング指定。BGn_XDXと同様です。 - BGn_CX
画面の左端をBGにマップする(0.8.8の固定小数点で)。 - BGn_CY
画面の上端をBGにマップする(0.8.8の固定小数点で)。
n=2,3やサブ画面も同様(SUB_BG2_X0等)なので省略します。
rotationやextended rotation BGを使用する場合、BGn_CX,BGn_CYがBGn_X0,BGn_Y0に取って代わります。
Special registers
We have some more registers, which aren't specific for one background:
- MOSAIC_CR / SUB_MOSAIC_CR
モザイクエフェクト指定(ピクセルが大きく見える)。これを有効にするにはBGに最初に有効にしておかなければなりません。下位4bitがX軸モザイクサイズ、bit4〜7がY軸モザイクサイズです。 - BLEND_CR / SUB_BLEND_CR
背景の合成、又はフェードイン・フェードアウト指定。 - BLEND_AB / SUB_BLEND_AB
2つのBGを合成。bit 0〜4がBG Aの合成係数、bit 8〜12がBG Bの合成係数。残り13〜15は未使用。50%合成を行いたい場合は以下のように指定。
BLEND_AB = 0x0F | (0x0F << 8); - BLEND_Y / SUB_BLEND_Y
フェードイン/アウト指定。最後の5bitがどれくらい白く/黒くするかを指定します。0x00は背景のまま、0x1Fは真っ白/真っ黒です。
例
// blend BG2 and BG3 on the main screen
BLEND_CR = BLEND_ALPHA | BLEND_SRC_BG2 | BLEND_DST_BG3;
// fade BG2 to black on the sub screen
SUB_BLEND_CR = BLEND_FADE_BLACK | BLEND_SRC_BG2;
We have the following blending defines:
- BLEND_NONE
no blending - BLEND_ALPHA
blend two backgrounds - BLEND_FADE_WHITE
fade to white - BLEND_FADE_BLACK
fade to black - BLEND_SRC_BGn
(n = 0,1,2,3) which background will be the source - BLEND_SRC_SPRITE
- BLEND_SRC_BACKDROP:
- BLEND_DST_BGn
(n = 0,1,2,3) which background will be the destination - BLEND_DST_SPRITE
- BLEND_DST_BACKDROP
Back to our registers:
- WINn_X0 / SUB_WINn_X0
(n = 0,1) - WINn_X1 / SUB_WINn_X1
(n = 0,1) - WINn_Y0 / SUB_WINn_Y0
(n = 0,1) - WINn_Y1 / SUB_WINn_Y1
(n = 0,1) - WIN_IN / SUB_WIN_IN
- WIN_OUT / SUB_WIN_OUT
例によって最後の方は原文に書いてない個所がある(ノД`、)
Side Notes:
- the source layer(s) must be over destination layer(s) to have some blending displayed. that means the priority of source layers should be numerically lower than the the priority of destination layers.
- the source layer is what is going to be translucent, the destination(s) is what is going to be seen through.
- if you have something white to be translucent (ghost, cloud, ...), make sure you pick an alpha value <15 or the white value will "eat up" the color on the other layer