←3DSのHBL用アプリ開発 トップへ

フレームバッファを取得して画面に描画する

画面にいろいろ描画します。

最終更新:2017/09/24

初版:2017/09/23




はじめに


いままではコンソール画面でプログラミングをしてきましたが、文字だけの画面だと飽きるので画面にいろいろ描画したいと思います。

方法


gfxSetDoubleBuffering関数で描画する画面をダブルバッファリング(描画の途中経緯が見えてしまわないようにする技術)の有効無効を設定しますが、今回は使いませんのでdoubleBufferingfalseを指定します。
void gfxSetDoubleBuffering(
    gfxScreen_t Screen, //ダブルバッファリングを切り替えるための画面(GFX_TOP/GFX_BOTTOM)。
    bool doubleBuffering, //ダブルバッファリングを使用するかどうか。
)

そして次に、gfxGetFramebuffer関数でフレームバッファを取得します。
//フレームバッファへのポインタが返ります。
u8* gfxGetFramebuffer(
    gfxScreen_t Screen, //取得する画面(GFX_TOP/GFX_BOTTOM)。
    gfx3dSide_t Side, //右目用か左目用か(GFX_LEFT/GFX_RIGHT)。(3Dが無効の場合はGFX_LEFTを指定すること)
    u16* width, //フレームバッファの幅。(NULL指定可)
    u16* width, //フレームバッファの高さ。(NULL指定可)
)
※gfxSwapBuffers関数を呼び出すたびにフレームバッファへのポインタが変わります。

フレームバッファを操作する


フレームバッファには、連続して各ドットの色情報が入っています。
ポインターで参照するとき、3DSの画面の左下が基準となり、赤緑青赤緑青...とだんだん上に進んでいきます。
image

(0, 239)の赤ドットを操作したいときは、0Byte目
(0, 239)の青ドットを操作したいときは、2Byte目
(0, 0)の赤ドットを操作したいときは、717Byte目
(1, 0)の赤ドットを操作したいときは、1437Byte目
のようにX軸とY軸が逆で原点も上下逆なので注意しましょう。
PCなどの座標と違うのは、3DSの液晶画面は、横向き(右90度回転)で固定してあるためだと思われます。

下のマクロは、左上を基準とした座標からポインタ参照用のオフセットに変換するものです。
#define XY(x,y) ((239-y)*3+(x*720))

操作する時は、memcpyなどでコピーします。
●画面左上に黄色の点を表示させる。
//初期化処理は省略してあります。
gfxSetDoubleBuffering(GFX_TOP, false);
u8* fb = gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL);
unsigned long brg = 0xFFFF00; //黄色(RGB 255, 255 0)
memcpy(fb + XY(0, 0), &brg, sizeof(u8)*3); //フレームバッファにコピー
//このあとのメインループは省略してあります。
左上に小さな黄色の点が見えたかと思います。

gfxFlushBuffers関数とgfxSwapBuffers関数について


よく出てくるgfxFlushBuffers関数とgfxSwapBuffers関数ですが、この2つの関数は画面の描画にとって大事なものです。

●gfxFlushBuffers関数
フレームバッファの内容を反映します。
大きな変更がない限り、実行する必要はありません。(オーバーヘッドになります。)
image1
※リファレンスには、「現在のフレームバッファを更新します。」としか書いていないため、どのフレームを更新するのかはっきり分かりません。

●gfxSwapBuffers関数
フレームバッファを入れ替えます。
この関数があるおかげで、見えないフレームに描画し、そのフレームを入れ替えて表示することでちらつきや、描画の途中経緯が見えなくなります。
image1

関数の挙動についてあいまいな部分が多いので、詳しくわかる方はご連絡をお願いします。




[前へ] [次へ]

(C)2017 InoueSoftware / 無断転載禁止