我正在关注 Direct3D12 上的 Rastertek 教程,可在此处找到。
我已经仔细检查以确保我的所有代码都与他的相同,但我遇到了命令列表的问题。当我在清除后台缓冲区后关闭命令列表时,该方法ID3D12GraphicsCommandList::Close()
返回E_INVALIDARG
,这意味着我在记录命令列表期间做错了什么。但是,我所做的一切似乎都没有错。
D3D12_RESOURCE_BARRIER Barrier;
hr = CommandAllocator->Reset(); HANDLE_HR(__LINE__);
hr = CommandList->Reset (
CommandAllocator,
nullptr
); HANDLE_HR(__LINE__);
Barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
Barrier.Transition.pResource = RenderTargetResource[BufferIndex];
Barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT;
Barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET;
Barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
Barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
CommandList->ResourceBarrier(1, &Barrier);
RenderTargetViewPtr.ptr = RenderTargetViewHandle.ptr + BufferIndex * RenderTargetBytes;
CommandList->OMSetRenderTargets(1, &RenderTargetViewPtr, FALSE, nullptr);
FLOAT color[] = { 1.0, 1.0, 1.0, 1.0 };
CommandList->ClearRenderTargetView(RenderTargetViewHandle, color, 0, nullptr);
Barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
Barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT;
CommandList->ResourceBarrier(1, &Barrier);
hr = CommandList->Close(); HANDLE_HR(__LINE__);
我的整个项目都可以在这个 github 分支上找到。
这段代码有什么问题?
似乎资源障碍是问题所在,但它们相当无害。注释掉OMSetRenderTargets()
并ClearRenderTargetView()
仍然导致E_INVALIDARG
从Close()
.
我还尝试使用该ID3D12InfoQueue
界面找出问题所在。返回错误时队列中没有消息Close()
- 我已检查以确保接口正常工作,因为当发生其他错误时确实会显示消息。