Это несколько связано с вопросом, который я ранее задавал относительно рисования индексированных примитивов .
Моя проблема заключалась в том, что я рисовал только один куб, когда хотел нарисовать много. Мне сказали, что проблема была в том, что я перезаписывал буферы вершин и индексов с каждым новым созданием экземпляра, Cube
и вместо этого я должен создать один в источнике, а затем нарисовать много, проходя через матрицу преобразования к шейдеру, который заставляет его появляться в разных мест. Это работало прекрасно.
Теперь у меня появилась новая проблема: как бы я нарисовал много разных типов примитивов?
Вот мой код из предыдущего вопроса:
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));
}
Ясно, что если бы я продублировал и изменил код, чтобы он стал другим объектом или формой, последняя инициализируемая форма перезапишет буфер вершин, не так ли?
Я использую многократные буферы вершины? Должен ли я добавить новый буфер вершин к старому и использовать соответствующие индексы для их рисования? Могу ли я сделать либо? Обе?
источник