Почему порядок вершин меняет поведение рендеринга - PullRequest
0 голосов
/ 10 января 2020

Я следую инструкциям DirectX для начинающих. Я понял, что порядок, в котором я помещаю вершины в буфер вершин, выполняет или прерывает рендеринг. Например, этот доктор aws треугольник

myVertex vertices[] = {
    XMFLOAT3(0.0f, 0.4f, 0.5f),
    XMFLOAT3(0.4f, -0.4f, 0.5f),
    XMFLOAT3(-0.4f, -0.4f, 0.5f),
};

, в то время как этот доктор aws ничего,

myVertex vertices[] = {
    XMFLOAT3(-0.4f, -0.4f, 0.5f),
    XMFLOAT3(0.4f, -0.4f, 0.5f),
    XMFLOAT3(0.0f, 0.4f, 0.5f)
};
  • Должен ли он работать в обоих случаях?
  • Если нет, как я могу определить правильный порядок вершин для рисования Directx?

1 Ответ

0 голосов
/ 10 января 2020

Это зависит от настроек растеризатора, который позволяет отбирать треугольники в зависимости от того, расположены ли они по часовой стрелке или против часовой стрелки, когда они находятся в пространстве экрана.

По умолчанию D3D11_RASTERIZER_DES C имеет свойство: D3D11_CULL_MODE, которое имеет 3 варианта: * D3D11_CULL_NONE * D3D11_CULL_FRONT * D3D11_CULL_BACK

Чтобы определить, какие треугольники являются лицевыми или обратными, вы используете свойство: FrontCounterClockwise

1008 *1007* 1007 * Треугольник обращен назад, если он против часовой стрелки, а фронт - по часовой стрелке.

Если true, то будет наоборот.

Настройки растеризатора по умолчанию (если вы не создаете состояние и назначить его конвейеру), это D3D11_CULL_BACK и FrontCounterClockwise = FALSE

Поэтому по умолчанию треугольники по часовой стрелке не будут отображаться.

Если вы хотите нарисовать каждый треугольник независимо от него, вы можете создать Состояние и использование растеризатора: D3D11_CULL_NONE

Для создания в растеризаторе, используйте ID3D11Device :: CreateRasterizerState

Чтобы присоединить полученное состояние к конвейеру, используйте ID3D11DeviceContext :: RSSetState

...