Ciò è in qualche modo collegato a una domanda che avevo precedentemente posto in merito al disegno di primitive indicizzate .
Il mio problema era che stavo disegnando un cubo solo quando volevo disegnarne molti. Mi è stato detto che il problema era che sovrascrivevo i buffer dei vertici e degli indici con ogni nuova istanza di Cube
e che invece dovevo crearne uno all'origine e quindi disegnarne molti, passando attraverso una matrice di trasformazione allo shader che lo fa apparire in diversi posti. Questo ha funzionato magnificamente.
Ora ho un nuovo problema: come disegnerei molti diversi tipi di primitivi?
Ecco il mio codice dalla domanda precedente:
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));
}
Chiaramente se duplicassi e modificassi il codice in un oggetto o una forma diversi, l'ultima forma da inizializzare sovrascriverebbe il buffer dei vertici, no?
Uso più buffer di vertici? Aggiungo il nuovo buffer dei vertici a quello vecchio e utilizzo gli indici appropriati per disegnarli? Posso fare una delle due? Tutti e due?