> 質問1
ポリゴンで完全な円を表現するのは非効率です。
点ごとに頂点を指定すると、膨大な個数になりやすく、重くなりやすいです。
正多角形の形でポリゴンを構成すれば円に見せることができます。
以下は正多角形のポリゴン位置を構成する関数のサンプルです。
/*!
* @brief 正多角形ポリゴンを構成する関数。
* @param outVtx [out] 構成する頂点配列。最低 inCount + 1 の個数が必要。
* @param inCount [in] 構成する角数。
* @param inHalfSize [in] 半径。
*/
void GenerateCirclePolygon( Vertex* outVtx, UINT inCount, float inHalfSize ){
outVtx->x = outVtx->y = 0.0f;
++outVtx;
for(UINT i = 0;i < inCount;++i){
float rad = D3DX_PI * 2.0f * i / inCount;
outVtx->x = cosf(rad) * inHalfSize;
outVtx->y = sinf(rad) * inHalfSize;
++outVtx;
}
}
これは、最初の点を原点に置き、そのあとに角数分の点を円に沿って配置しています。
このように構成したポリゴンは D3DPT_TRIANGLEFAN を指定して描画することで正しく表示できます。
これを 3D に応用すれば正多角錐を構成することもできます。
> 質問2
DrawPrimitive 関数の第二引数には、描画に使う頂点データのオフセットを指定できます。
これを利用すれば、頂点バッファに複数のポリゴンデータを持たせ、個別に描画させることができます。
ただし、一括して(一回の呼び出しで)描画する場合は第一引数で指定したプリミティブ構成によっては
形が崩れますので注意してください。
なお、インデックスバッファも併用すれば、比較的楽に一括描画はできるかと思います。
> 質問3
メモリ使用量が膨れ上がっていくのはきちんと解放されていないせいです。
DirectX で作成された全てのデータは、使用が済んだら Release() を呼び出して解放しなければならない決まりがあります。
これは、各データには参照カウントが存在し、参照カウントが 0 になると解放される仕組みになっているからです。
そのため、複数の場所で同じデータを扱う場合は、 AddRef() を呼び出して参照カウントを増やしておく必要もあります。
なお、DirectX 関数群でセットする場合は AddRef() は呼び出す必要はありません。
また、DirectX 関数群でデータを取得する場合は、使用が済んだらRelease() を呼び出して解放する必要があります。
(これらの正確な情報は MSDN ライブラリや SDK リファレンスに載っています)
頂点バッファは、当然のことながら頂点データを格納しているだけのものです。
なので、1頂点を構成する情報が変われば、作成しなおす必要がありますし、
余分な頂点データが混じっていても、DrawPrimitive 関数などで必要な部分だけ描画することもできます。
あと、これらとは関係ないですが、下記のページの文章を一読しておくといいと思います。
リソースの管理 (Direct3D 9)
http://msdn.microsoft.com/ja-jp/library ... 85%29.aspx
専門用語も混じっていますが、その中で「リソース管理は頻繁に変更されるリソースには推奨されない」旨の
説明も含まれてます。