コードスペランカー

ゲーム開発日誌など

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

DrawPolygonIndexed3D_UseVertexBufferという関数がある。この関数をつかうとGPUベースでのポリゴンの描画が可能だ。DrawPolygonIndexed3DではCPUベースなのでGUPベースより処理速度が劣る感がある。実際には頂点シェーダ2.0に対応したグラボが必要なようで、未対応だったりするとCPUベースの計算になるということらしい。
で、使い方だが、C#で使う場合そのままでは、いくつかのコードがunsafe指定されているので使いにくい。なので先に通常の関数に直しておくことにする。
DxDLL.csにある関数の

[DllImport("DxLib.dll", EntryPoint="dx_SetVertexBufferData")]
extern unsafe static int  dx_SetVertexBufferData( int  SetIndex, void *  VertexData, int  VertexNum, int  VertexBufHandle);
public unsafe static int  SetVertexBufferData( int  SetIndex, void *  VertexData, int  VertexNum, int  VertexBufHandle)
{
	return dx_SetVertexBufferData( SetIndex , VertexData , VertexNum , VertexBufHandle );
}
[DllImport("DxLib.dll", EntryPoint="dx_SetIndexBufferData")]
extern unsafe static int  dx_SetIndexBufferData( int  SetIndex, void *  IndexData, int  IndexNum, int  IndexBufHandle);
public unsafe static int  SetIndexBufferData( int  SetIndex, void *  IndexData, int  IndexNum, int  IndexBufHandle)
{
	return dx_SetIndexBufferData( SetIndex , IndexData , IndexNum , IndexBufHandle );
}

この2つが今回使う関数になる。ここで指定されている「void*」は複数の型が指定できる配列の先頭アドレスを表している。この場合は利用方法を限定することでunsafeをはずすことができる

[DllImport("DxLib.dll", EntryPoint = "dx_SetVertexBufferData")]
extern static int dx_SetVertexBufferData(int SetIndex, out VERTEX3D Vertex, int VertexNum, int VertexBufHandle);
public static int SetVertexBufferData(int SetIndex, out VERTEX3D Vertex, int VertexNum, int VertexBufHandle)
{
    return dx_SetVertexBufferData(SetIndex, out Vertex, VertexNum, VertexBufHandle);
}
[DllImport("DxLib.dll", EntryPoint = "dx_SetIndexBufferData")]
extern static int dx_SetIndexBufferData(int SetIndex, out ushort IndexData, int IndexNum, int IndexBufHandle);
public static int SetIndexBufferData(int SetIndex, out ushort IndexData, int IndexNum, int IndexBufHandle)
{
    return dx_SetIndexBufferData(SetIndex, out IndexData, IndexNum, IndexBufHandle);
}

ここでvoid*の代わりに指定されたout VERTEX3Dやout ushortはそれぞれVERTEX3Dとushortの先頭アドレスとしてDXライブラリに引渡しをされる。