【问题标题】:D3D12 project: dereferencing a nullptrD3D12 项目:取消引用 nullptr
【发布时间】:2016-05-04 01:08:45
【问题描述】:

我正在使用他们 GitHub 页面上的 Microsoft 示例,即使我的代码基于他们的代码,我也没有达到相同的结果。 这两个项目都有这些 ComPtr,但在我的项目中它们都为空 (0x0000000000000000),而在示例中它们工作得很好。

ComPtr<IDXGISwapChain3> m_swapChain;
ComPtr<ID3D12Device> m_device;
ComPtr<ID3D12Resource> m_renderTargets[FrameCount];
ComPtr<ID3D12CommandAllocator> m_commandAllocator;
ComPtr<ID3D12CommandQueue> m_commandQueue;
ComPtr<ID3D12DescriptorHeap> m_rtvHeap;
ComPtr<ID3D12PipelineState> m_pipelineState;
ComPtr<ID3D12GraphicsCommandList> m_commandList;

特别是这一行会导致调试器中断。

ThrowIfFailed(m_device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&m_commandQueue)));

编辑:我的代码错误地创建了导致错误的 m_device。

【问题讨论】:

  • 您只显示了变量声明,任何人都无法知道为什么它们没有被设置为非空值。您需要展示更多代码。
  • 在调用m_device-&gt;CreateCommandQueue()之前初始化m_device的代码在哪里?

标签: c++ wrl directx-12


【解决方案1】:

我的猜测是,您从 CreateCommandQueue 收到了失败的 HRESULT。您应该将调试器设置为中断异常(请参阅MSDN)。或者,您可以将其重写为:

HRESULT hr = m_device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&m_commandQueue));
ThrowIfFailed(hr);

并在HRESULT hr = ... 行设置调试断点。

正如有人指出的那样,请确保您在此之前检查了所有可能的故障情况。有关创建 Direct3D 12 设备的健壮代码,请参阅DeviceResourcesVS Direct3D 12 Game templates

【讨论】:

  • 这假设 m_device 被初始化为一个非空值开始。
  • 确实如此。正如我在许多 SO 线程中所述,您必须使用 SUCCEDEDFAILED 宏或类似 ThrowIfFailed 的东西检查任何具有 HRESULT 的返回值是否失败。你不能忽略返回值。
猜你喜欢
  • 2016-12-01
  • 2020-05-12
  • 2011-08-20
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多