#c #directx
#c #directx
Вопрос:
извините, если я недостаточно конкретен, я новичок в программировании DirectX и Stack Overflow.
Проблема в том, что когда я рендерю 3D-объекты в DirectX9, мне приходится вручную добавлять буферы вершин и буферы индексов (рисовать кубы вручную). Я пытаюсь воссоздать мир, подобный «Майнкрафту», но не знаю, как бы я это сделал.
Я пытался использовать «for loops», но это просто отключило весь экран. Я также пытался использовать векторы, но я просто запутался и ничего не добился.
Это код, который у меня есть. Как вы можете видеть, именно так я бы нарисовал 2 куба. Мне интересно, есть ли другой, более эффективный способ, поскольку я хотел бы рисовать сотни кубов одновременно.
void DirectXClass::init_graphics(void)
{
// create the vertices using the CUSTOMVERTEX struct
CUSTOMVERTEX vertices[] =
{
// Square 1
{ 3.0f, 3.0f, -3.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ -3.0f, 3.0f, -3.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ 3.0f, -3.0f, -3.0f, D3DCOLOR_XRGB(255, 0, 0), },
{ -3.0f, -3.0f, -3.0f, D3DCOLOR_XRGB(0, 255, 255), },
{ 3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ -3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(255, 0, 0), },
{ 3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ -3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 255), },
{ -3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ 3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ -3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(255, 0, 0), },
{ 3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 255), },
{ -3.0f, 3.0f, 9.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ 3.0f, 3.0f, 9.0f, D3DCOLOR_XRGB(255, 0, 0), },
{ -3.0f, -3.0f, 9.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ 3.0f, -3.0f, 9.0f, D3DCOLOR_XRGB(0, 255, 255), },
};
// create a vertex buffer interface called v_buffer
// d3ddev->CreateVertexBuffer(sizeof(vertices) / sizeof(vertices[0]) * sizeof(CUSTOMVERTEX),
d3ddev->CreateVertexBuffer(sizeof(vertices) / sizeof(vertices[0]) * sizeof(CUSTOMVERTEX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
amp;v_buffer,
NULL);
VOID** pVoid;
// lock v_buffer and load the vertices into it
v_buffer->Lock(0, 0, (void**)amp; pVoid, 0);
memcpy(pVoid, vertices, sizeof(vertices));
v_buffer->Unlock();
short indices[] =
{
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,
8, 9, 10, // side 9
10, 9, 11,
12, 8, 14, // side 10
14, 8, 10,
15, 13, 14, // side 11
14, 13, 12,
11, 9, 15, // side 12
15, 9, 13,
12, 13, 8, // side 13
8, 13, 9,
11, 15, 10, // side 14
10, 15, 14,
};
// create a vertex buffer interface called v_buffer
// d3ddev->CreateIndexBuffer(sizeof(indices) / sizeof(indices[0]) * sizeof(short),
d3ddev->CreateIndexBuffer(sizeof(indices) / sizeof(indices[0]) * sizeof(short),
0,
D3DFMT_INDEX16,
D3DPOOL_MANAGED,
amp;i_buffer,
NULL);
// lock v_buffer and load the vertices into it
i_buffer->Lock(0, 0, (void**)amp; pVoid, 0);
memcpy(pVoid, indices, sizeof(indices));
i_buffer->Unlock();
}
Комментарии:
1. Если вы хотите рисовать больше кубов одновременно, вы можете использовать инстансинг. Это намного эффективнее
2. Вы выбрали сложную задачу для начала, поскольку для рендеринга большого мира Minecraft требуется много усилий, чтобы работать плавно. Но не отказывайтесь от попыток только для получения первых результатов, я бы рекомендовал просто начать рисовать кубы один за другим, поскольку создание экземпляров — это тема, которую нужно изучить после изучения основ. Для начала вы могли бы нарисовать свой vertexbuffer несколько раз в цикле for, а затем использовать мировую матрицу для перемещения кубов в нужное положение ( docs.microsoft.com/en-us/windows/desktop/direct3d9 /… , если вы используете собственные шейдеры, вам нужно будет передать ему матрицу, а затем преобразовать ее)
3. Nvm, у меня сейчас работает перевод, однако он не воспроизводит куб, он только перемещает его. pastebin.com/S9AqxQN2