DirectX中初始化变量BUG

新手上路,请多包涵

问题描述

刚开始接触Directx 12,按照龙书自学到第七章。现在根据LandAndWave程序自己动手实现,但是发现自己写的程序给变量赋值部分不能和书中保持一直,导致做不出理想的效果。

具体内容是在创建渲染项部分给ComPtr<ID3D10Blob> VertexBufferCPUComPtr<ID3D12Resource> VertexBufferGPU赋值的长度(8位)与书中(16位)不一样,但是代码实现部分完全一样。这导致渲染的时候读不出数据没有内容可展示。

问题出现的平台版本及自己尝试过哪些方法

编译环境:
SDK版本 Windows SDK 10.0.17763.0
显卡 NVIDIA GTX 1060
IDE VS2017

相关代码

申明部分

    
struct MeshGeometry
{
    std::string Name;

    ComPtr<ID3DBlob> VertexBufferCPU = nullptr;
    ComPtr<ID3DBlob> IndexBufferCPU = nullptr;

    ComPtr<ID3D12Resource> VertexBufferGPU = nullptr;
    ComPtr<ID3D12Resource> IndexBufferGPU = nullptr;

    ComPtr<ID3D12Resource> VertexBufferUpload = nullptr;
    ComPtr<ID3D12Resource> IndexBufferUpload = nullptr;

    UINT VertexBufferByteSize = 0;
    UINT VertexBufferStride = 0;
    UINT IndexBufferByteSize = 0;
    DXGI_FORMAT IndexFormat = DXGI_FORMAT_R16_UINT;

    std::unordered_map<std::string, SubmeshGeometry> DrawArgs;

    D3D12_VERTEX_BUFFER_VIEW getVertexBufferView()
    {
        D3D12_VERTEX_BUFFER_VIEW vbv;
        vbv.BufferLocation = VertexBufferGPU->GetGPUVirtualAddress();
        vbv.SizeInBytes = VertexBufferByteSize;
        vbv.StrideInBytes = VertexBufferStride;
        return vbv;
    }

    D3D12_INDEX_BUFFER_VIEW getIndexBufferView()
    {
        D3D12_INDEX_BUFFER_VIEW ibv;
        ibv.BufferLocation = IndexBufferGPU->GetGPUVirtualAddress();
        ibv.Format = IndexFormat;
        ibv.SizeInBytes = IndexBufferByteSize;
        return ibv;
    }

    void disposeUpload()
    {
        VertexBufferUpload = nullptr;
        IndexBufferUpload = nullptr;
    }
};

初始化部分

    auto geo = std::make_unique<MeshGeometry>();
    geo->Name = "camp";
    

    D3DCreateBlob(vbByteSize, &geo->VertexBufferCPU);
    CopyMemory(geo->VertexBufferCPU->GetBufferPointer(), vertices.data(), vbByteSize);

    D3DCreateBlob(ibByteSize, &geo->IndexBufferCPU);
    CopyMemory(geo->IndexBufferCPU->GetBufferPointer(), indices.data(), ibByteSize);

    geo->VertexBufferGPU = DXUtil::createDefaultBuffer(mDevice.Get(),
        mCmdList.Get(), vertices.data(), vbByteSize, geo->VertexBufferUpload);

    geo->IndexBufferGPU = DXUtil::createDefaultBuffer(mDevice.Get(),
        mCmdList.Get(), indices.data(), ibByteSize, geo->IndexBufferUpload);

你期待的结果是什么?实际看到的错误信息又是什么?

DEBUG时候发现Buffer的数据长度不一样,最后没有渲染效果。

自己运行的结果
自己运行的结果
正确的结果
正确的结果

程序基本上就是从书上拷贝过来但是结果却不一样,而且后台没有任何报错。请教各位大神能否看一下,谢谢!

阅读 1.4k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题