コードスペランカー

ゲーム開発日誌など

ゲーム内でのポリゴンをGPUベースで描画する2

ゲーム内でのポリゴンをGPUベースで描画する」のつづき
下準備が終わったところで、具体的な手順をメモしておく
まずは頂点情報バッファをVRAM上に確保する

public static int CreateVertexBuffer(int VertexNum, int VertexType)

VertexNumは頂点情報の数、VertexTypeは頂点情報の形でDX.DX_VERTEX_TYPE_NORMAL_3Dを指定すればDX.VERTEX3Dが使える。戻り値は成功ならばハンドルが、失敗ならば-1が返る。
次に、実際にVRAMにデータを転送する

public static int SetVertexBufferData(int SetIndex, out VERTEX3D Vertex, int VertexNum, int VertexBufHandle)

SetIndexは開始位置、Vertexは頂点データ配列の先頭、VertexNumは配列の長さ、VertexBufHandleは確保した頂点バッファのハンドル、慣例に従えば戻り値が-1であれば失敗、それ以外で成功となる。
さらにインデックスバッファも同じように確保する

public static int CreateIndexBuffer(int IndexNum, int IndexType)

IndexNumはインデックスバッファの大きさ、IndexTypeはインデックスのタイプでDX.DX_INDEX_TYPE_16BITを指定できる。戻り値は-1であれば失敗、それ以外の場合は確保されたインデックスバッファのハンドルになる。
インデックスバッファも同じようにVRAMに転送する必要がある

public static int SetIndexBufferData(int SetIndex, out ushort IndexData, int IndexNum, int IndexBufHandle)

SetIndexは開始位置、IndexDataはインデックスバッファ配列の先頭、IndexNumは配列の数、IndexBufHandleに確保したインデックスバッファのハンドルを指定する。戻り値はおそらくいつものとおりだろう。
ここまでくれば、描画をおこなうことができる

public static int DrawPolygonIndexed3D_UseVertexBuffer(int VertexBufHandle, int IndexBufHandle, int GrHandle, int TransFlag)

VertexBufHandleは頂点バッファのハンドル、IndexBufHandleはインデックスバッファのハンドル、GrHandleはテクスチャのハンドル、TransFlagは透過フラグになる。戻り値は(以下略)
実際に描画するに当たって、移動や回転、変形を加えたい場合は

public static int SetTransformToWorld(out MATRIX Matrix)

を使う。Matrixには行列を指定する。
実際に使うときは

DX.SetTransformToWorld(out Matrix);
DX.DrawPolygonIndexed3D_UseVertexBuffer(VertexBufHandle, IndexBufHandle, GrHandle, DX.TRUE);

の様にして書くことになる。
VRAMに確保したバッファを開放するには

public static int DeleteVertexBuffer(int VertexBufHandle)
public static int DeleteIndexBuffer(int IndexBufHandle)

を使うことになる、引数に開放するバッファのハンドルを指定すればよい。
一括で全て開放するには

public static int InitVertexBuffer()
public static int InitIndexBuffer()

が使えるようだ、