Ландшафт только отображается снизу

Я пытаюсь визуализировать карту, но, к сожалению, отображается только нижняя сторона.

Я думаю, что я делаю что-то не так при настройке буфера вершин и индексов.

Это часть, которую я инициализирую буферами вершин и индексов:

// Initialize vertices and indices
SimpleVertex* vertices = new SimpleVertex[(dimension + 1) * (dimension + 1)];
WORD* indices = new WORD[dimension * dimension * 6];

for (WORD i = 0; i < dimension + 1; ++i)
{
for (WORD j = 0; j < dimension + 1; ++j)
{
vertices[i * (dimension + 1) + j].Pos = XMFLOAT3(i, rand() % 2, j);
vertices[i * (dimension + 1) + j].Color = XMFLOAT4(rand() % 2, rand() % 2, rand() % 2, 1.0f);
}
}

for (WORD i = 0; i < dimension; i++)
{
for (WORD j = 0; j < dimension; j++)
{
indices[(i * dimension + j) * 6] = (WORD)(i * (dimension + 1) + j);
indices[(i * dimension + j) * 6 + 2] = (WORD)(i * (dimension + 1) + j + 1);
indices[(i * dimension + j) * 6 + 1] = (WORD)((i + 1) * (dimension + 1) + j + 1);
indices[(i * dimension + j) * 6 + 3] = (WORD)(i * (dimension + 1) + j);
indices[(i * dimension + j) * 6 + 5] = (WORD)((i + 1) * (dimension + 1) + j + 1);
indices[(i * dimension + j) * 6 + 4] = (WORD)((i + 1) * (dimension + 1) + j);
}
}

// Create vertex buffer
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(SimpleVertex)* (dimension + 1) * (dimension + 1);
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);
delete vertices;
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 indices buffer
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(WORD)* dimension * dimension * 6;
bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
bd.CPUAccessFlags = 0;
InitData.pSysMem = indices;
hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pIndexBuffer);
delete indices;
if (FAILED(hr))
return hr;

Извините за мой плохой английский :(. Спасибо за чтение!

0

Решение

Первое, что пришло мне в голову, это то, что вы можете объявить свои вершины в неправильном порядке. Если ваш контекст Direct3D ожидает, что вершины будут против часовой стрелки, а ваши вершины определены по часовой стрелке, «отбраковка задней стороны» сделает ваши полигоны невидимыми, если они не видны с другой стороны.

В частности, D3D11_RASTERIZER_DESC :: FrontCounterClockwise устанавливает направление. (увидеть http://msdn.microsoft.com/en-us/library/windows/desktop/ff476198%28v=vs.85%29.aspx)

В коде, в котором вы устанавливаете описание своего растеризатора, попробуйте установить CullMode = D3D11_CULL_NONE, и если ландшафт появляется, то это была ваша проблема.

1

Другие решения

Скорее всего, подбор лица не был настроен должным образом.

Теоретически (спасибо Google за предоставление ссылок;)):

На практике:

  1. Вы решаете, в каком порядке расположить свои вершины в треугольниках (на самом деле вы манипулируете индексами, так как ваши буферы индексируются) — по часовой стрелке или против часовой стрелки.
  2. Принимая решение № 1, вы теперь решаете, какие лица следует рассматривать как «передние»:

    D3D11_RASTERIZER_DESC rd = {};
    rd.FrontCounterClockwise = true; // counterclockwise are front
    
  3. и вы решаете, какие грани растеризатора должны отбраковывать: задние, передние или нет:

    rd.CullMode = D3D11_CULL_BACK; // back faced primitives will be stripped out
    // during rasterization
    // (clockwise ones in our example)
    

Таким образом, вы можете изменить параметры намотки геометрии и / или намотки DirectX и / или выбраковки DirectX.

Замечания: По умолчанию DirectX 11 использует false а также D3D11_CULL_BACK для параметров выше. Таким образом, он рассматривает примитивы по часовой стрелке как передние, и отбирает против часовой стрелки, считающиеся задними.

Замечания: Чтобы лучше понять выбраковку, нарисуйте треугольник на обеих сторонах листа бумаги, как если бы это был один и тот же треугольник, если смотреть с разных сторон. Поместите индексы возле каждой вершины (то же самое на обеих сторонах листа). Нарисуйте круговую стрелку, показывающую порядок намотки. Сравните это с вашей сеткой. Тогда будет очевидно, какой порядок намотки и выбраковки вы должны использовать.

Источники:

Справочные страницы MSDN DirectX:

1

По вопросам рекламы [email protected]