我正在VisualStudioCommunity2019中开发我的第一个DirectX 12 C++应用程序,并且在从Visual输出窗口中的调试日志输出中获取有用信息时遇到了困难。
我的问题是,我试图通过调用CreateSwapChain创建一个交换链,但是对这个函数的调用失败了,因为HRESULT会产生以下错误消息:
应用程序发出了无效的调用。调用的参数或某些对象的状态都不正确。启用D3D调试层,以便通过调试消息查看详细信息。
除此之外,我还可以在“输出”窗口中看到来自Visual的标准调试输出。它显示了加载了哪些.dll文件以及抛出了一个异常。我不相信这些输出都来自DirectX。
为了启用调试层,我尝试以下代码,从我的WinMain函数的第一行开始:
#if defined(DEBUG) || defined(_DEBUG)
Microsoft::WRL::ComPtr<ID3D12Debug> debugController;
ThrowIfFailed(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)));
debugController->EnableDebugLayer();
#endif此外,我运行dxcpl.exe来打开DirectX控制面板,将我的可执行文件添加到范围列表中,并为Direct3D/DXGI调试层选项选择“应用程序控制”单选按钮。
我再次通过选择Debug->启动调试来执行代码,在Visual输出窗口中,我现在可以看到从"D3D12“中报告的信息消息,例如:
...
D3D12 INFO: Create ID3D12CommandAllocator: Addr=0x0C3CBD78, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #558: CREATE_COMMANDALLOCATOR]
D3D12 INFO: Create ID3D12GraphicsCommandList: Addr=0x0C42EA78, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #560: CREATE_COMMANDLIST12]
D3D12 INFO: Create ID3D12GraphicsCommandList: Addr=0x0C479C68, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #560: CREATE_COMMANDLIST12]
Exception thrown at 0x7705B5B2 in D3DX12.exe: Microsoft C++ exception: _com_error at memory location 0x003ADDC8.
Exception thrown at 0x7705B5B2 in D3DX12.exe: Microsoft C++ exception: _com_error at memory location 0x003ADDC8.
Exception thrown at 0x7705B5B2 in D3DX12.exe: Microsoft C++ exception: D3DAppException at memory location 0x003AE670.
D3D12 INFO: Destroy ID3D12GraphicsCommandList: Name="unnamed", Addr=0x0C479C68 [ STATE_CREATION INFO #586: DESTROY_COMMANDLIST12]
D3D12 INFO: Destroy ID3D12GraphicsCommandList: Name="unnamed", Addr=0x0C42EA78 [ STATE_CREATION INFO #586: DESTROY_COMMANDLIST12]
D3D12 INFO: Destroy ID3D12CommandAllocator: Name="unnamed", Addr=0x0C3CBD78 [ STATE_CREATION INFO #584: DESTROY_COMMANDALLOCATOR]
...注意,在一系列异常消息之前的最后一个INFO消息是用来创建一个命令列表的。命令列表是我在创建交换链之前立即创建的。我的怀疑是,我传递给交换链的窗口有问题,但我的怀疑并不是真正重要的。我认为DirectX 12应该确切地告诉我问题是什么。“错误:您的窗口句柄无效"),因为我相信这就是调试层的目的,以及为什么它告诉我启用它。我相信我已经根据上面的代码启用了调试层,但是,我并没有收到比启用之前更有用的信息。
因此,这里真正的问题是为什么只有DirectX 12信息日志而没有错误、警告或任何其他类型的消息,说明为什么创建交换链的调用失败?
谢谢你提前提供帮助。
发布于 2021-10-04 22:27:36
这花费了几个小时的搜索时间,但我找到了为什么我没有收到DirectX 12应用程序的错误日志的原因。
我使用以下内容创建了我的DXGI工厂:
ThrowIfFailed(CreateDXGIFactory1(IID_PPV_ARGS(&factory)));这为DXGI 1.1版创建了一个DXGI工厂。相反,函数CreateDXGIFactory2 2的第一个参数接受一个用于调试的标志:
ThrowIfFailed(CreateDXGIFactory2(DXGI_CREATE_FACTORY_DEBUG, IID_PPV_ARGS(&factory)));现在使用它来显示错误日志:
D3D12 INFO: Create ID3D12CommandAllocator: Addr=0x0D6D1D18, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #558: CREATE_COMMANDALLOCATOR]
D3D12 INFO: Create ID3D12GraphicsCommandList: Addr=0x0D7358C8, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #560: CREATE_COMMANDLIST12]
D3D12 INFO: Create ID3D12GraphicsCommandList: Addr=0x0D777D40, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #560: CREATE_COMMANDLIST12]
DXGI ERROR: IDXGIFactory::CreateSwapChain: Flip model swapchains (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL and DXGI_SWAP_EFFECT_FLIP_DISCARD) do not support multisampling. DXGI_SWAP_CHAIN_DESC{ SwapChainType = ..._HWND, BufferDesc = DXGI_MODE_DESC1{Width = 1920, Height = 1080, RefreshRate = DXGI_RATIONAL{ Numerator = 144, Denominator = 1 }, Format = R8G8B8A8_UNORM, ScanlineOrdering = ..._UNSPECIFIED, Scaling = ..._UNSPECIFIED, Stereo = FALSE }, SampleDesc = DXGI_SAMPLE_DESC{ Count = 4, Quality = 1 }, BufferUsage = 0x20, BufferCount = 2, OutputWindow = 0x001C0808, Scaling = ..._STRETCH, Windowed = TRUE, SwapEffect = ..._FLIP_DISCARD, AlphaMode = ..._IGNORE, Flags = 0x2 } [ MISCELLANEOUS ERROR #102: ]
Exception thrown at 0x7705B5B2 in D3DX12.exe: Microsoft C++ exception: _com_error at memory location 0x012FDD00.
DXGI ERROR: IDXGIFactory::CreateSwapChain: Flip model swapchains (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL and DXGI_SWAP_EFFECT_FLIP_DISCARD) do not support multisampling. DXGI_SWAP_CHAIN_DESC{ SwapChainType = ..._HWND, BufferDesc = DXGI_MODE_DESC1{Width = 1920, Height = 1080, RefreshRate = DXGI_RATIONAL{ Numerator = 144, Denominator = 1 }, Format = R8G8B8A8_UNORM, ScanlineOrdering = ..._UNSPECIFIED, Scaling = ..._UNSPECIFIED, Stereo = FALSE }, SampleDesc = DXGI_SAMPLE_DESC{ Count = 4, Quality = 1 }, BufferUsage = 0x20, BufferCount = 2, OutputWindow = 0x001C0808, Scaling = ..._STRETCH, Windowed = TRUE, SwapEffect = ..._FLIP_DISCARD, AlphaMode = ..._IGNORE, Flags = 0x2 } [ MISCELLANEOUS ERROR #102: ]
Exception thrown at 0x7705B5B2 in D3DX12.exe: Microsoft C++ exception: _com_error at memory location 0x012FDD00.
Exception thrown at 0x7705B5B2 in D3DX12.exe: Microsoft C++ exception: D3DAppException at memory location 0x012FE5A8.
D3D12 INFO: Destroy ID3D12GraphicsCommandList: Name="unnamed", Addr=0x0D777D40 [ STATE_CREATION INFO #586: DESTROY_COMMANDLIST12]
D3D12 INFO: Destroy ID3D12GraphicsCommandList: Name="unnamed", Addr=0x0D7358C8 [ STATE_CREATION INFO #586: DESTROY_COMMANDLIST12]
D3D12 INFO: Destroy ID3D12CommandAllocator: Name="unnamed", Addr=0x0D6D1D18 [ STATE_CREATION INFO #584: DESTROY_COMMANDALLOCATOR]我不确定DXGI API的历史,但我希望这能帮助其他人解决这个问题,因为这对我来说是个大麻烦。我目前正在学习DirectX 12的3D游戏编程介绍,他让你启用了调试层,但我在他的例子中没有看到这个标志的任何设置。我克隆了他的示例项目目录,试图在他的应用程序中造成错误,我发现没有报告错误日志。只有一个消息对话框会提供与我之前发布的相同的HRESULT错误(这也说明应该启用调试层)。
谢谢。
https://stackoverflow.com/questions/69439389
复制相似问题