PSPでプログラミング
秒以内にはわかるPSPプログラミング講座。長くなったので非表示化。
main()
関数の話とか
実際のところ、[参考1]のリンクをたどるともう僕が説明すること、残ってないんじゃないか。
main()
関数はふつうにエントリポイントしてます。普通です。中で適当にループをまわして、終了時はsceKernelExitGame()
関数を呼んでやります*2。
Graphics Utility Library
PSPSDKの目玉の一つではないかな。これまでは自分で座標変換とか計算してVRAMにがりがりコピーするしかなかった描画関連が急に楽に。WindowsのDirectXのような存在。こういうのをみてるとPSPの凄さがわかる。
たまにはここに解説かこうかと思うけど、とりあえず初期化コードだけ載せてみる*3。ほとんどサンプルコード(PSPSDKに付属)。
/*バッファとスクリーンの大きさとか*/ #define BUF_WIDTH 512 /*通常512*/ #define SCR_WIDTH 480 #define SCR_HEIGHT 272 /*ディスプレイリストと呼ばれているもの(詳細不明)*/ static long __attribute__((aligned(16))) dlist[262144]; int initgraphics() { /*描画バッファのオフセット*/ void* fbp0 = GetVRAMOffset(BUF_WIDTH,SCR_HEIGHT,GU_PSM_8888); /*表示バッファ*/ void* fbp1 = GetVRAMOffset(BUF_WIDTH,SCR_HEIGHT,GU_PSM_8888); /*Zバッファ*/ void* zbp = GetVRAMOffset(BUF_WIDTH,SCR_HEIGHT,GU_PSM_4444); /*初期化*/ sceGuInit(); /*設定するディスプレイリストを選択*/ sceGuStart(GU_DIRECT,dlist); /*描画バッファを設定*/ sceGuDrawBuffer(GU_PSM_8888,fbp0,BUF_WIDTH); /*表示バッファ*/ sceGuDispBuffer(SCR_WIDTH,SCR_HEIGHT,fbp1,BUF_WIDTH); /*Zバッファ*/ sceGuDepthBuffer(zbp,BUF_WIDTH); /*仮想描画領域の中央に持ってくる(よくわからない)*/ sceGuOffset(2048 - (SCR_WIDTH/2),2048 - (SCR_HEIGHT/2)); /*仮想描画領域の中央から描画するように設定*/ sceGuViewport(2048,2048,SCR_WIDTH,SCR_HEIGHT); /*深度の幅を設定する*/ sceGuDepthRange(65535,0); /*クリップ?この場合は画面全域。*/ sceGuScissor(0,0,SCR_WIDTH,SCR_HEIGHT); /*クリッピングを有効に*/ sceGuEnable(GU_SCISSOR_TEST); /*よくわからないが、設定が完了したということなのではないか?*/ sceGuFinish(); /*こちらもよくわからない。多分、設定の遅延待ちだね。*/ sceGuSync(0,0); /*垂直同期をあれこれ?*/ sceDisplayWaitVblankStart(); /*GUを有効にする*/ sceGuDisplay(GU_TRUE); return 0; }
GetVRAMOffset()
関数はサンプルコードの\gu\common\vram.cなんかに定義されているgetStaticVramBuffer()
関数の流用。まだ仕組みがよくわかっていないけれど、VRAMのバッファに使える領域のポインタを返すのだと思う。
ディスプレイリストが何なのかは、まだわからない。ドキュメント読むのしんどい…