C++ 应用投影矩阵后对象消失

C++ 应用投影矩阵后对象消失,c++,math,matrix,directx,direct3d,C++,Math,Matrix,Directx,Direct3d,我正在尝试使用DirectX显示三维立方体。我创建了一个x64 C++窗口应用程序,下面的顶点和索引描述了立方体(注意立方体没有目的的底部)< /p> 我没有深度/模具视图,因为我假设我不需要它,因为它只是一个简单的立方体。 我创造了一个康斯坦布弗 struct ConstantBuffer { DirectX::XMMATRIX model; DirectX::XMMATRIX view; DirectX::XMMATRIX projection; }; 这个缓冲区是

我正在尝试使用DirectX显示三维立方体。我创建了一个x64 C++窗口应用程序,下面的顶点和索引描述了立方体(注意立方体没有目的的底部)< /p> 我没有深度/模具视图,因为我假设我不需要它,因为它只是一个简单的立方体。 我创造了一个康斯坦布弗

struct ConstantBuffer {
    DirectX::XMMATRIX model;
    DirectX::XMMATRIX view;
    DirectX::XMMATRIX projection;
};
这个缓冲区是根据我从SDK的DirectXMath库中使用的方法填充的

    // 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和窗口的大小为1920x1080像素

我的顶点着色器如下所示:

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;
}
我不知道会出什么问题。屏幕上没有绘制任何内容,尽管我的像素着色器输出红色,如果我将所有矩阵设置为标识矩阵,我会看到渲染的立方体的红色正面。我假设它是透视矩阵(正交也不起作用)的东西

你知道如何进一步调试这个程序,或者有什么问题吗

更新: 作为补充,这是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)

我只是在看了MicrosoftsGithub页面上的一些示例后才明白这一点。出于某种原因,他们使用XMMatrixTranspose。在应用后,它会起作用


但是,如果它是相同的技术,即纯DirectX和HLSL着色器,我不知道为什么要使用它。我认为它们都是列/行专业,没有什么不同。但是,矩阵函数似乎返回了另一种格式。

看起来您的三角形使用了不一致的惯用手。当直视时,有些是顺时针(0,1,2),另一些是逆时针(4,5,6)。使用背面剔除,这可能会导致您无法渲染任何内容。您应该更改三角形的索引顺序,以便它们都以相同的方式进行(或者关闭背面消隐,但这可能会导致性能损失)。我也有同样的想法,因此我通过设置光栅化器状态来关闭消隐。但是,我还发现,当我使用nvidia nsight进行调试时,当我单击DrawIndexed调用时,它应该高亮显示它试图在RenderTargetView中绘制的顶点。但是什么都没有。。。如果我回到单位矩阵,我可以看到绘制的对象。
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)