Преобразование карты в индексы вершин не работает

0

Я пытаюсь преобразовать массив с значениями 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);
    ....

Спасибо за чтение и оправдания за плохой английский :(

  • 0
    примечание стороны - Вы должны исправить те утечки памяти, если эта функция возвращает ошибку. Лучше использовать std :: vector вместо всех этих вызовов new [].
  • 0
    Я предлагаю попробовать сделать что-то более простое, а затем расширить этот код для рендеринга ландшафта, проверяя его каждый раз, когда вы что-то меняете. Я сомневаюсь, что кто-нибудь пройдет через весь этот код.
Показать ещё 1 комментарий
Теги:
directx
directx-11

1 ответ

0

Кажется, вы пытались создать сетку/ландшафт 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;
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню