Я следую учебным пособиям Rastertek по Direct3D12, которые можно найти Вот.
Я дважды проверил, чтобы убедиться, что весь мой код такой же, как у него, но у меня проблемы с списком команд. Когда я закрываю список команд только после очистки заднего буфера, метод 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()
возвращает ошибку — я проверил, чтобы интерфейс работал правильно, так как сообщения делать появляются, когда возникают другие ошибки.
Задача ещё не решена.
Других решений пока нет …