Я пытаюсь преобразовать массив с значениями xyz в вершины и индексы для рендеринга.
Но, к сожалению, я ничего не вижу.
Это та часть, где я начинаю все:
....
WORD size = 40;
XMFLOAT3* m_heightMap = new XMFLOAT3[size * size];
for (WORD i = 0; i < size; i++)
{
for (WORD j = 0; j < size; j++)
{
WORD index = size * i + j;
m_heightMap[index].x = (FLOAT)i;
m_heightMap[index].y = (FLOAT)0;
m_heightMap[index].z = (FLOAT)j;
}
}
WORD vicount = (size - 1) * (size - 1) * 12;
SimpleVertex* vertices = new SimpleVertex[vicount];
WORD* indices = new WORD[vicount];
WORD index = 0;
// Load the vertex and index array with the terrain data.
for (WORD j = 0; j<(size - 1); j++)
{
for (WORD i = 0; i<(size - 1); i++)
{
WORD index1 = (size * j) + i; // Bottom left.
WORD index2 = (size * j) + (i + 1); // Bottom right.
WORD index3 = (size * (j + 1)) + i; // Upper left.
WORD index4 = (size * (j + 1)) + (i + 1); // Upper right.
// Upper left.
vertices[index].Pos = XMFLOAT3(m_heightMap[index3].x, m_heightMap[index3].y, m_heightMap[index3].z);
vertices[index].Color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
indices[index] = index;
index++;
// Upper right.
vertices[index].Pos = XMFLOAT3(m_heightMap[index4].x, m_heightMap[index4].y, m_heightMap[index4].z);
vertices[index].Color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
indices[index] = index;
index++;
// Upper right.
vertices[index].Pos = XMFLOAT3(m_heightMap[index4].x, m_heightMap[index4].y, m_heightMap[index4].z);
vertices[index].Color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
indices[index] = index;
index++;
// Bottom left.
vertices[index].Pos = XMFLOAT3(m_heightMap[index1].x, m_heightMap[index1].y, m_heightMap[index1].z);
vertices[index].Color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
indices[index] = index;
index++;
// Bottom left.
vertices[index].Pos = XMFLOAT3(m_heightMap[index1].x, m_heightMap[index1].y, m_heightMap[index1].z);
vertices[index].Color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
indices[index] = index;
index++;
// Upper left.
vertices[index].Pos = XMFLOAT3(m_heightMap[index3].x, m_heightMap[index3].y, m_heightMap[index3].z);
vertices[index].Color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
indices[index] = index;
index++;
// Bottom left.
vertices[index].Pos = XMFLOAT3(m_heightMap[index1].x, m_heightMap[index1].y, m_heightMap[index1].z);
vertices[index].Color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
indices[index] = index;
index++;
// Upper right.
vertices[index].Pos = XMFLOAT3(m_heightMap[index4].x, m_heightMap[index4].y, m_heightMap[index4].z);
vertices[index].Color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
indices[index] = index;
index++;
// Upper right.
vertices[index].Pos = XMFLOAT3(m_heightMap[index4].x, m_heightMap[index4].y, m_heightMap[index4].z);
vertices[index].Color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
indices[index] = index;
index++;
// Bottom right.
vertices[index].Pos = XMFLOAT3(m_heightMap[index2].x, m_heightMap[index2].y, m_heightMap[index2].z);
vertices[index].Color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
indices[index] = index;
index++;
// Bottom right.
vertices[index].Pos = XMFLOAT3(m_heightMap[index2].x, m_heightMap[index2].y, m_heightMap[index2].z);
vertices[index].Color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
indices[index] = index;
index++;
// Bottom left.
vertices[index].Pos = XMFLOAT3(m_heightMap[index1].x, m_heightMap[index1].y, m_heightMap[index1].z);
vertices[index].Color = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
indices[index] = index;
index++;
}
}
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
// Create vertex buffer
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(SimpleVertex)* vicount;
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA InitData;
ZeroMemory(&InitData, sizeof(InitData));
InitData.pSysMem = vertices;
hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pVertexBuffer);
if (FAILED(hr))
return hr;
// Set vertex buffer
UINT stride = sizeof(SimpleVertex);
UINT offset = 0;
g_pImmediateContext->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset);
// Create index buffer
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(WORD) * vicount;
bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
bd.CPUAccessFlags = 0;
InitData.pSysMem = indices;
hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pIndexBuffer);
if (FAILED(hr))
return hr;
// Set index buffer
g_pImmediateContext->IASetIndexBuffer(g_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0);
// Set primitive topology
g_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
// Create the constant buffer
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(ConstantBuffer);
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = 0;
hr = g_pd3dDevice->CreateBuffer(&bd, nullptr, &g_pConstantBuffer);
if (FAILED(hr))
return hr;
// Initialize the world matrix
g_World = XMMatrixIdentity();
// Initialize the view matrix
XMVECTOR Eye = XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f);
XMVECTOR At = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
XMVECTOR Up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
g_View = XMMatrixLookAtLH(Eye, At, Up);
// Initialize the projection matrix
g_Projection = XMMatrixPerspectiveFovLH(XM_PIDIV2, (FLOAT)width / (FLOAT)height, 0.01f, 100.0f);
....
Спасибо за чтение и оправдания за плохой английский :(
Кажется, вы пытались создать сетку/ландшафт 40 X 40, сначала вам нужно рассчитать, сколько вершин и индексов.
Для карты сетки X n, если вы хотите нарисовать ее как список треугольников, у вас есть (n X n X 2 X 3) индексы, где n X n - количество ячеек на карте, и каждая ячейка была составлена на 2 треугольники, каждый треугольник составлял 3 индекса. и (n + 1) X (n + 1) вершин. например, сетка 2 X 2, как показано ниже, требует 16 индексов и 9 вершин.
-------------
| | |
| | |
-------------
| | |
| | |
-------------
Создайте буфер индексов
-------------
| | |
| | |
-------------
| |(i,j)|
| | |
-------------(i+1, j+1)
// Fill the index array
for (DWORD i = 0; i < numCellsperRow; ++i)
{
for (DWORD j = 0; j < numCellsperCol; ++j)
{
indices[k] = i * numVertexperCol + j; // 0
indices[k + 1] = i * numVertexperCol + (j + 1); // 1
indices[k + 2] = (i + 1) * numVertexperCol + j; // 2
indices[k + 3] = (i + 1) * numVertexperCol + j; // 3
indices[k + 4] = i * numVertexperCol + (j + 1); // 4
indices[k + 5] = (i + 1) * numVertexperCol + (j + 1); // 5
// next quad
k += 6;
}
}