C++ Direct3D 11-绘制三角形

C++ Direct3D 11-绘制三角形,c++,directx,draw,pipeline,direct3d11,C++,Directx,Draw,Pipeline,Direct3d11,我已经初始化了所有Direct3D 11,但是当我开始绘制一些几何图形时,几何图形没有显示出来 我已经创建了管道、几何体,并为要绘制的几何体创建了绘制函数。我的主要问题是,有人能帮我理解为什么这个三角形不在窗口中绘制吗 void cSystem::Draw(UINT count) { // draw stuff... UINT stride = sizeof(Vertex); UINT offset = 0; p_D3D11DeviceContext-&g

我已经初始化了所有Direct3D 11,但是当我开始绘制一些几何图形时,几何图形没有显示出来

我已经创建了管道、几何体,并为要绘制的几何体创建了绘制函数。我的主要问题是,有人能帮我理解为什么这个三角形不在窗口中绘制吗

void cSystem::Draw(UINT count)
{
    // draw stuff...    
    UINT stride = sizeof(Vertex);
    UINT offset = 0;
    p_D3D11DeviceContext->IASetVertexBuffers(0, 1, &p_VertextBuffer, &stride, &offset);

    p_D3D11DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

    p_D3D11DeviceContext->Draw(3, 0);

    if (count == 0)
    {
        INFO(L"Draw() Complete");
    }   
}

void cSystem::InitGeometry() // initialise the geometry for the scene
{   
    Vertex vertices[] =
    {
        { D3DXVECTOR3(0.0f, 0.5f, 0.5f), D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f) },
        { D3DXVECTOR3(0.5f, -0.5f, 0.5f), D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f) },
        { D3DXVECTOR3(-0.5f, -0.5f, 0.5f), D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f) }
    };

    D3D11_BUFFER_DESC bdsc;
    ZeroMemory(&bdsc, sizeof(D3D11_BUFFER_DESC));
    bdsc.Usage = D3D11_USAGE_IMMUTABLE;
    bdsc.ByteWidth = sizeof(Vertex) * 3;
    bdsc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    bdsc.CPUAccessFlags = 0;
    bdsc.MiscFlags = 0;
    D3D11_SUBRESOURCE_DATA vinitdata;
    ZeroMemory(&vinitdata, sizeof(D3D11_SUBRESOURCE_DATA));
    vinitdata.pSysMem = vertices;

    p_D3D11Device->CreateBuffer(&bdsc, &vinitdata, &p_VertextBuffer);   

    /*D3D11_MAPPED_SUBRESOURCE ms;
    p_D3D11DeviceContext->Map(p_VertextBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);
    memcpy(ms.pData, vertices, sizeof(Vertex));
    p_D3D11DeviceContext->Unmap(p_VertextBuffer, NULL);*/

    INFO(L"InitGeometry() Complete");
}

void cSystem::InitPipeline(void)
{   
#if defined(DEBUG) || (_DEBUG)
    DWORD shaderflags = 0;
#endif
    //p_D3D11Device->GetFeatureLevel() == D3D_FEATURE_LEVEL_11_0;
    ID3D10Blob *VS_, *PS_ = NULL;
    D3DX11CompileFromFile(L"Shader.shader", 0, 0, "VS", "vs_5_0", 0, 0, 0, &VS_, 0, 0);
    D3DX11CompileFromFile(L"Shader.shader", 0, 0, "PS", "ps_5_0", 0, 0, 0, &PS_, 0, 0);

    p_D3D11Device->CreateVertexShader(VS_->GetBufferPointer(), VS_->GetBufferSize(), NULL, &p_VS);
    p_D3D11Device->CreatePixelShader(PS_->GetBufferPointer(), PS_->GetBufferSize(), NULL, &p_PS);

    p_D3D11DeviceContext->VSSetShader(p_VS, 0, 0);
    p_D3D11DeviceContext->PSSetShader(p_PS, 0, 0);

    D3D11_INPUT_ELEMENT_DESC layout[] =
    {
        { "POSITION", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    };
    UINT NumElements = ARRAYSIZE(layout);

    p_D3D11Device->CreateInputLayout(layout, NumElements, VS_->GetBufferPointer(),
    VS_->GetBufferSize(), &p_InputLayout);

    p_D3D11DeviceContext->IASetInputLayout(p_InputLayout);

    VS_->Release();
    PS_->Release();

    INFO(L"InitPipeline() Complete");
}

void cSystem::D3D11RenderFrame_(void)
{
    // clear the back buffer
    p_D3D11DeviceContext->ClearRenderTargetView(p_D3D11RenderTargetView, m_BackBufferColour[0]);
    // clear the depth buffer
    p_D3D11DeviceContext->ClearDepthStencilView(p_D3D11DepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0.0f);  

    // draw 
    Draw(count++);

    // switch the back buffer and the front buffer
    p_D3D11SwapChain->Present(0, 0);
}
着色器(或.fx文件)是

以下是该计划的图片链接:

调用在程序执行过程中正确进行,但没有显示。。 为了防止我的问题从顶部被遗忘,为什么三角形不显示

我希望有人能帮忙……)

我不是DirectX11的大师(事实上我最近才开始),但似乎即使顶点着色器将为顶点的位置提供一个
D3DXVECTOR3
,您也在告诉它
position

一种四分量、32位无符号标准化整数格式,包括alpha在内,每个通道支持8位

在输入布局中。现在这太令人困惑了

您应该使用
DXGI\u格式\u R32G32B32\u浮点


感谢您的阅读。

这可能不是确切的答案,但希望能有所帮助。有时,仅仅通过查看代码就很难判断为什么有些东西没有画出来。原因可能是多方面的,有时可能是隐藏的

通常,当我遇到这个问题时,我会加载一个图形调试器,就像VisualStudio中包含的调试器一样,我会查看发送到GPU的每一个状态,找出哪里出了问题。然而,这在一开始可能很困难,因为你不知道每一个状态到底是什么,它应该是什么。但是,最终你学会了,你需要猜测出哪里出了问题

另一件通常有用的事情是在
id3d11设备上启用调试模式。为此,请将
D3D11CreateDevice
D3D11CreateDeviceAndSwapChain
Flags
参数设置为
D3D11\u创建设备\u调试
。如果出现问题,这将输出警告

最终,您会想学习如何使用图形调试器,但在达到这一点之前,我建议您首先完全按照教程进行操作,然后返回并根据您的喜好对其进行更改。对于您所做的每一个重大更改,运行您的程序以确保它仍然有效。如果没有,你知道哪里出了问题

解决你的问题。我看到的一个问题是,您没有在输入布局中声明颜色元素。您需要在position元素后添加以下内容:

{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }
否则,着色器不知道在顶点流中的何处查找颜色。请注意,如Nard的回答中所述,位置也必须是
DXGI\u格式\u R32G32B32\u浮点值。如果没有这两件事,
CreateInputLayout
将返回空输入布局,因为它与顶点着色器的输入签名不匹配

还要确保您正在设置视口


可能还有其他问题,但如果不查看每个API调用,就很难判断。请注意,您实际上没有在顶点着色器中执行任何变换,根据我的经验,向顶点着色器添加三个变换矩阵应该可以完成这项工作

 cbuffer Transform
 {
     matrix mWorld;
     matrix mView;
     matrix mProjection;
 }
然后在顶点着色器中执行此操作

output.position= mul(position, mWorld);
output.position= mul(output.position, mView);
output.position= mul(output.position, mProjection);
您需要为它创建一个D3D11_BIND_CONSTANT_buffers,并使用
ID3D11DeviceContext::VSSetConstantBuffers
绑定它

您可以使用
#include
来控制矩阵,例如,使用
xmmatrixtransation
XMMatrixRotation
来更改mWorld,使用
XMMatrixLookAtLH
来更改mView,使用
XMMatrixPerspective
来更改mProjection


在cpu内存中获取矩阵后,需要使用
ID3D11DeviceContext::UpdateSubresource
将数据更新到gpu内存中(上面创建的常量缓冲区)。在传递矩阵之前,请记住执行
XMMatrixTranspose

感谢您的重播,我已将格式更改为DXGI\u格式\u R32G32B32\u浮点。不过还是没什么,不过谢谢你,我会坚持下去,直到成功。没问题。编程图形时很难进行调试,因为您只知道它看起来是错误的,所以您必须特别确定自己在做什么(例如数据类型和渲染管道)。我承认,我没有完全按照我正在阅读的教程进行操作,并且是按照我的方式进行操作的。我认为最好的做法是不折不扣地照本宣科。是的,gfx编程很难,我仍然无法获得与输出设备相关的显示模式列表。我到那儿去别担心。每个人都有自己喜欢的学习方式。我也喜欢摆弄东西请注意,D3DX的所有版本都已弃用。我建议您避免使用遗留的D3DXMath库,而是使用。您不需要使用D3DX11来编译着色器,因为您可以直接使用。您可能也想查看一下。谢谢,我使用了调试宏,但在输出窗口中看得不够。。图形调试器是指dxdiag吗?或者还有什么我可以用做im的工具吗?你是否尝试过像我提到的那样将颜色元素添加到输入布局并设置视口?图形调试器是Visual Studio中“调试->图形->启动诊断”下的一项功能。它允许您捕获一帧,然后分析D3D状态。它在专业版,但我不确定它是否在免费快车版。是的,我添加了它,我也严格按照教程。这是个谜。。我设置了D3D11_APPEND_ALIGNED_元素,它已经设置为debug,我下载了图形调试器的免费试用版,但仍然没有成功。明天我将拿出所有的几何数据,重新启动管道,希望一切顺利,因为我已经在这个小项目上投入了很多
output.position= mul(position, mWorld);
output.position= mul(output.position, mView);
output.position= mul(output.position, mProjection);