Объект исчезает после применения матрицы проекции - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь отобразить 3D-куб с помощью DirectX. Я создал приложение x64 c ++ windows, и следующие вершины и индексы описывают куб (обратите внимание, что куб специально не имеет нижней части)

Vertex cube[]
{
    {-0.25f, -0.5f, 0.25f},
    {-0.25f, 0.5f, 0.25f},
    {0.25f, 0.5f, 0.25f},
    {0.25f, -0.5f, 0.25f},

    {-0.25f, -0.5f, 0.5f},
    {-0.25f, 0.5f, 0.5f},
    {0.25f, 0.5f, 0.5f},
    {0.25f, -0.5f, 0.5f}
};

unsigned short cubeIndices[]{
    0, 1, 2, // front
    0, 2, 3,

    4, 5, 6, // back
    4, 6, 7,

    1, 5, 6, // top
    1, 6, 2,

    0, 4, 5, // left
    0, 5, 1,

    3, 2, 6, // right
    3, 6, 7 
};

У меня нет представления Глубина / Трафарет, как я предполагаю, что я делаю не нужно, так как это всего лишь один простой куб. Я создал ConstantBuffer

struct ConstantBuffer {
    DirectX::XMMATRIX model;
    DirectX::XMMATRIX view;
    DirectX::XMMATRIX projection;
};

Этот буфер заполнен на основе методов, которые я использую из библиотеки DirectXMath SDK.

    // Based on MSDN, direct x uses left handed und looks in positive Z
    m_constantBufferData.model = m_constantBufferData.model * DirectX::XMMatrixTranslation(0.0f, 0.0f, 8.0f); // move it by 8 units in positive z)
    m_constantBufferData.view = DirectX::XMMatrixIdentity(); // I assume we do not need to put anything in view, because the object is in positive z and center

    m_constantBufferData.projection = DirectX::XMMatrixPerspectiveFovLH(DirectX::XMConvertToRadians(90.0f), 1920.0f/1080.0f, 0.1f, 100.0f);
    //m_constantBufferData.projection = DirectX::XMMatrixOrthographicLH(1920.0f, 1080.0f, 0.1f, 100.0f);

BackBuffer и Window имеют размер 1920x1080 пикселей.

Мой Vertex Shader выглядит следующим образом:

cbuffer simpleConstantBuffer : register(b0)
{
    matrix model;
    matrix view;
    matrix projection;
}

float4 main(float4 pos : POSITION) : SV_POSITION
{
    float4 output = pos;

    output = mul(output, model);
    output = mul(output, view);
    output = mul(output, projection);

    return output;
}

Я не знаю, что может быть не так. На экране ничего не рисуется, хотя мой пиксельный шейдер выводит красный цвет, и если я установил все матрицы на Identity Matrix, я вижу переднюю красную грань куба. Я предполагаю, что это что-то с матрицей перспективы (ортогональная тоже не работает)?

Любая идея, как отладить это дальше или что может быть не так?

ОБНОВЛЕНИЕ: Как дополнение это то, что nvidia nsight показывает мне, какие матрицы в буфере констант в случае, если это помогает:

Model:
(1.00, 0.00, 0.00, 0.00)
(0.00, 1.00, 0.00, 0.00)
(0.00, 0.00, 1.00, 8.00)
(0.00, 0.00, 0.00, 1.00)

View:
(1.00, 0.00, 0.00, 0.00)
(0.00, 1.00, 0.00, 0.00)
(0.00, 0.00, 1.00, 1.00)
(0.00, 0.00, 0.00, 1.00)

Projection:
(0.56, 0.00, 0.00, 0.00)
(0.00, 1.00, 0.00, 0.00)
(0.00, 0.00, 1.00, -0.10)
(0.00, 0.00, 1.00, 0.00)

1 Ответ

0 голосов
/ 08 февраля 2020

Я только что понял это, посмотрев несколько примеров на странице Microsoft's github. По какой-то причине они используют XMMatrixTranspose. После применения это работает.

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

...