これは、インデックス付きプリミティブの描画に関して以前に私が尋ねた質問にいくぶん関連しています。
私の問題は、たくさんを描きたかったのに、1つの立方体しか描いていなかったことです。問題は、それぞれの新しいインスタンス化で頂点バッファーとインデックスバッファーを上書きするCube
ことであり、代わりに原点に1つ作成してから多数を描画し、変換マトリックスを介してシェーダーに渡し、異なるように見えるようにする必要があるということです。場所。これは美しく機能しました。
しかし、今は新しい問題があります。どのようにして多くの異なるタイプのプリミティブを描画するのでしょうか。
これが前の質問からの私のコードです:
Cube::Cube(D3DXCOLOR colour, D3DXVECTOR3 min, D3DXVECTOR3 max)
{
// create eight vertices to represent the corners of the cube
VERTEX OurVertices[] =
{
{D3DXVECTOR3(min.x, max.y, max.z), colour},
{D3DXVECTOR3(min.x, max.y, min.z), colour},
{D3DXVECTOR3(min.x, min.y, max.z), colour},
{min, colour},
{max, colour},
{D3DXVECTOR3(max.x, max.y, min.z), colour},
{D3DXVECTOR3(max.x, min.y, max.z), colour},
{D3DXVECTOR3(max.x, min.y, min.z), colour},
};
// create the vertex buffer
D3D10_BUFFER_DESC bd;
bd.Usage = D3D10_USAGE_DYNAMIC;
bd.ByteWidth = sizeof(VERTEX) * 8;
bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
bd.MiscFlags = 0;
device->CreateBuffer(&bd, NULL, &pBuffer);
void* pVoid; // the void pointer
pBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, &pVoid); // map the vertex buffer
memcpy(pVoid, OurVertices, sizeof(OurVertices)); // copy the vertices to the buffer
pBuffer->Unmap();
// create the index buffer out of DWORDs
DWORD OurIndices[] =
{
0, 1, 2, // side 1
2, 1, 3,
4, 0, 6, // side 2
6, 0, 2,
7, 5, 6, // side 3
6, 5, 4,
3, 1, 7, // side 4
7, 1, 5,
4, 5, 0, // side 5
0, 5, 1,
3, 7, 2, // side 6
2, 7, 6,
};
// create the index buffer
// D3D10_BUFFER_DESC bd; // redefinition
bd.Usage = D3D10_USAGE_DYNAMIC;
bd.ByteWidth = sizeof(DWORD) * 36;
bd.BindFlags = D3D10_BIND_INDEX_BUFFER;
bd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
bd.MiscFlags = 0;
device->CreateBuffer(&bd, NULL, &iBuffer);
iBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, &pVoid); // map the index buffer
memcpy(pVoid, OurIndices, sizeof(OurIndices)); // copy the indices to the buffer
iBuffer->Unmap();
//this is simply a single call to the update method that sets up the scale, rotation
//and translation matrices, in case the cubes are static and you don't want to have to
//call update every frame
Update(D3DXVECTOR3(1, 1, 1), D3DXVECTOR3(0, 0, 0), D3DXVECTOR3(0, 0, 0));
}
明らかに、コードを複製して別のオブジェクトまたはシェイプになるように変更した場合、初期化される最後のシェイプが頂点バッファーを上書きしますね。
複数の頂点バッファーを使用しますか?新しい頂点バッファーを古いものに追加し、適切なインデックスを使用してそれらを描画しますか?どちらでもいいですか?どちらも?