# How can I draw many objects on screen instead of just one?

Like many beginner graphics programmers I followed a tutorial which showed me how to set up buffer descriptions and fill out the vertex buffer etc... - the steps involved in drawing a simple indexed cube on the screen. There is a leap however when it comes to drawing more than one of these cubes. My code below is the original cube drawing code, if called more than once, each call overwrites the vertex buffer and only one object is drawn - the last one.

So what are the options for drawing many of these cubes?

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));
}

• This is a really localized question, and it's missing a lot of information to answer it (how pBuffer and iBuffer are defined, what Update does, how objects are rendered, et cetera). – user1430 Oct 13 '11 at 16:26
• That said, creating one set of buffers per cube is not the way to go. You generally would want to have one buffer representing a cube at the origin, and each cube instance has a model-to-world transformation matrix that positions/rotates the cube in the world. – user1430 Oct 13 '11 at 16:27
• @JoshPetrie I don't see a reason to DV. Debugging tricky situations is something we should be able to help each other out with. Someone might have C++ DX10 experience who ran into something similar before. – ashes999 Oct 13 '11 at 16:28
• Related discussion: meta.gamedev.stackexchange.com/questions/641/… – user1430 Oct 13 '11 at 16:29
• In case I wasn't clear, I downvoted because I don't believe there's enough information here to provide an answer that isn't conjecture or speculation. – user1430 Oct 13 '11 at 16:39