Пример #1
0
//---------------------------------------------------------------------------//
  void RenderContextDX12::ApplyRenderTargets()
  {
    if (!myRenderTargetsDirty)
      return;

    myRenderTargetsDirty = false;

    D3D12_CPU_DESCRIPTOR_HANDLE rtDescriptors[Rendering::Constants::kMaxNumRenderTargets];
    GpuResource* rtResources[Rendering::Constants::kMaxNumRenderTargets];
    uint32 numRtsToSet = 0u;

    for (uint32 i = 0u; i < Rendering::Constants::kMaxNumRenderTargets; ++i)
    {
      Texture* rt = myRenderTargets[i];

      if (rt != nullptr)
      {
        rtResources[numRtsToSet] = rt;
        rtDescriptors[numRtsToSet] = rt->GetRtv().myCpuHandle;
        ++numRtsToSet;
      }
    }

    for (uint32 i = 0u; i < numRtsToSet; ++i)
    {
      TransitionResource(rtResources[i], D3D12_RESOURCE_STATE_RENDER_TARGET);
    }

    if (myDepthStencilTarget)
      TransitionResource(myDepthStencilTarget, D3D12_RESOURCE_STATE_DEPTH_WRITE);

    KickoffResourceBarriers();

    if (myDepthStencilTarget) 
      myCommandList->OMSetRenderTargets(numRtsToSet, rtDescriptors, false, &myDepthStencilTarget->GetDsv().myCpuHandle); 
    else 
      myCommandList->OMSetRenderTargets(numRtsToSet, rtDescriptors, false, nullptr);
  }