「DrawIndexedInstanced()がおかしい?」
Direct3D10 では ID3D10Device::Draw 系命令が5つあります。
Draw()/DrawIndexed() は従来の DrawPrimitive()/DrawIndexedPrimitive()
に非常に近くほとんどの描画はこの2つを使います。
Draw(
UINT VertexCount, // 描画する頂点数
UINT StartVertexLocation // 頂点の開始位置
)
DrawIndexed(
UINT IndexCount, // 描画するインデックス数
UINT StartIndexLocation, // インデックスの開始位置
INT BaseVertexLocation // インデックス指定する頂点の開始位置
)
DrawInstanced()/DrawIndexedInstanced() は同じデータを指定回数分
繰り返し描画することができます。この Geometry Instancing については
以前こちらの方でも書きました。
・D3D10 Geometry Instancing の問題と
DrawInstanced(
UINT VertexCountPerInstance, // 描画する頂点数
UINT InstanceCount, // 繰り返し描画回数
UINT StartVertexLocation, // 頂点の開始位置
UINT StartInstanceLocation, // インスタンスの開始位置
)
DrawIndexedInstanced(
UINT IndexCountPerInstance, // 描画するインデックス数
UINT InstanceCount, // 繰り返し描画回数
UINT StartIndexLocation, // インデックスの開始位置
INT BaseVertexLocation, // インデックス指定する頂点の開始位置
UINT StartInstanceLocation // インスタンスの開始位置
)
これらの命令は Instance の描画回数を指定する引数が追加されています。
同時に Instance に対するオフセットも指定できるようになっています。
DrawIndexedInstanced() でこのオフセットである StartInstanceLocation を
使うとなぜかきちんと描画してくれません。
描画されなかったりポリゴンが飛んだり。
DrawInstanced() ではうまく行っており、こちらは意図通りに動作しています。
指定した値の分だけ Instance バッファをずらしてそこから描画してくれます。
実行は GeForce8800GTS ForceWare 158.24 ですが、Reference Driver でも
RADEON HD 2900XT でも全く同じ描画になるので、使い方を勘違いしている
だけかもしれません。もうしばらく検証してみます。
ちなみに Indexed 系の命令は BaseVertexLocation だけ INT 型で、負の値を
受け付けるようです。
考えられる用途としては、例えばもともと1つの巨大な頂点バッファを複数の
バッファに分割したとき、Index バッファの値を書き換えなくても描画可能な
ことでしょうか。
後ろにずらすだけなら IASetVertexBuffers() でもできますが、前方にずらす
ことは今まで確かにこれまでできなかったかもしれません。