PSPでプログラミング

3%5Ctimes 10^{30}秒以内にはわかるPSPプログラミング講座。長くなったので非表示化。

準備しないといけないもの

まぁ、この辺はGoogle先生にお尋ねするとたいてい幸せになれますよ、っと*1

main()関数の話とか

実際のところ、[参考1]のリンクをたどるともう僕が説明すること、残ってないんじゃないか。
main()関数はふつうにエントリポイントしてます。普通です。中で適当にループをまわして、終了時はsceKernelExitGame()関数を呼んでやります*2

Graphics Utility Library

PSPSDKの目玉の一つではないかな。これまでは自分で座標変換とか計算してVRAMにがりがりコピーするしかなかった描画関連が急に楽に。WindowsDirectXのような存在。こういうのをみてると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のバッファに使える領域のポインタを返すのだと思う。
ディスプレイリストが何なのかは、まだわからない。ドキュメント読むのしんどい…

GU_PSM系の定数の意味

ピクセルフォーマット。いくつか種類があるが、GU_PSM_の後に四桁の数字がつく奴は、色ごとのビット深度*4を表している。ほかは知らない。
一応、一覧。先頭の`GU_PSM_'は省略している。

名前
5650 0
5551 1
4444 2
8888 3
T4 4
T8 5
T16 6
T32 7
DXT1 8
DXT3 9
DXT5 10

*1:参考1,参考2

*2:呼ばないとPSPに戻ってこないらしい

*3:ソースコード表示のテストも兼ねている

*4:たぶんRed-Green-Blue-Alphaの順