ゲーム内でのポリゴンを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ライブラリに引渡しをされる。