【问题标题】:COM method returning HRESULT value 0x80070057COM 方法返回 HRESULT 值 0x80070057
【发布时间】:2021-11-11 06:23:30
【问题描述】:

我正在运行 VS 项目(使用 VS 2015 开发)以及 VS 2019 中的 DirectX 12 3D 游戏编程简介。 但它抛出了一个 HRESULT 值为 -2147024809 的异常,如下所示:

mCommandList->Close() failed in 
E:\programs\cpp_codes\d3d12\Common\d3dApp.cpp;line 213; HRESULT:-2147024809

-2147024809 表示参数不正确。但是可以看出,没有任何参数传递给ID3D12GraphicsCommandList::Close() 方法,这让我很困惑。

这行代码几个月前没有抛出异常。

另一个 COM 方法在d3dApp.cpp 中抛出了类似的异常,即

ThrowIfFailed(md3dDevice->CreateCommittedResource(
    &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
    D3D12_HEAP_FLAG_NONE,
    &depthStencilDesc,
    D3D12_RESOURCE_STATE_COMMON,
    &optClear,
    IID_PPV_ARGS(mDepthStencilBuffer.GetAddressOf()))); failed in 
E:\programs\cpp_codes\d3d12\Common\d3dApp.cpp;line 203; HRESULT:-2147024809

但只要我将第五个参数从&optClear 更改为nullptr,这个异常就不会出现。此外,几个月前对CreateCommittedResource 的调用也没有引发异常。

【问题讨论】:

标签: visual-studio directx directx-12


【解决方案1】:

我认为是因为清除颜色变量不匹配,请尝试在所有 clearColor 变量用法中设置相同的清除颜色...

【讨论】:

    【解决方案2】:

    我的问题下方的评论表明调试层在这种情况下最有帮助。我实际上是在Visual Studio 2019的菜单栏中点击Debug->Graphics->Start Graphics Debugging。然后,详细的调试信息出现在Visual Studio 2019的输出窗口中,它运行D3D12 ERROR: ID3D12Device::CreateCommittedResource: pOptimizedClearValue must be NULL when D3D12_RESOURCE_DESC::Dimension is not D3D12_RESOURCE_DIMENSION_BUFFER and neither D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET nor D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL are set in D3D12_RESOURCE_DESC::Flags. [ STATE_CREATION ERROR #815: CREATERESOURCE_INVALIDCLEARVALUE]

    这就是重点,因为我在D3D12_RESOURCE_DESC::Flags 中设置了D3D12_RESOURCE_FLAG_NONE。 难怪在我将nullptr 传递给CreateCommittedResource 的第五个参数后,CreateCommittedResource 不再抛出这个异常。在我设置了D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL 之后,一切都运行良好,没有抛出任何异常。

    这是sn-p遇到问题的代码:

        D3D12_RESOURCE_DESC depthStencilDesc;
        depthStencilDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
        //Assignments to other members of depthStencilDesc
    
        //This line caused the problem.
        depthStencilDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
    
        D3D12_CLEAR_VALUE optClear;
    
        //Assignments to the members of optClear
    
        ThrowIfFailed(md3dDevice->CreateCommittedResource(
            &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
            D3D12_HEAP_FLAG_NONE,
            &depthStencilDesc,
            D3D12_RESOURCE_STATE_COMMON,
            &optClear,
            IID_PPV_ARGS(mDepthStencilBuffer.GetAddressOf())));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 2013-04-09
      • 2010-11-16
      • 2023-03-13
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多