在D3D12中,渲染目标视图可以是任何缓冲区吗



到目前为止,在我查看的示例中,有些命令类似于:

  1. D3D12_DESCRIPTOR_HEAP_DESC与D3D12_DESCRIPTOR_HEAP_TYPE::D3D12_DESCRIPTOR-HEAP_TYPE_RTV
  2. ID3D12设备::CreateDescriptorHeap
  3. 具有ID3D12DescriptorHeap::GetCPUDescriptorHandleForHeapStart的D3D12_CPU_DESCRIPTOR_HANDLE(可能还有ID3D12Device::GetDescriptorHandleIncrementSize)
  4. (可选?)ID3D12设备::CreateRenderTargetView
    1. (可选?)IDXGISwapChain3::GetBuffer
  5. 将渲染内容安排到命令列表中,注意OMSetRenderTargets和DrawInstanced,然后关闭命令列表
  6. ID3D12CommandQueue::ExecuteCommandLists
    1. (可选?)IDXGISwapChain3::存在
  7. 使用ID3D12CommandQueue::围栏上的信号安排信号
  8. 等待GPU使用ID3D12Fence::SetEventOnCompletion和WaitForSingleObjectEx完成

如果可能,如何用所选的缓冲液替换步骤4.1?也就是说,如何创建一个ID3D12Resource*并对其进行渲染,然后从中读取std::vector?(如果可能的话,我认为步骤6.1可以忽略,因为交换链没有呈现目标视图。在这种情况下,步骤4可能也没有必要?也许只有OMSetRenderTargets很重要?)

渲染目标的确切位置取决于视频内存体系结构。在某些系统中,它位于专用视频存储器中,只有视频卡才能访问。在一些系统中,它位于通过总线共享的视频存储器中,CPU和GPU都可以访问。在统一内存体系结构中,一切都在系统内存中。

因此,您对渲染目标的确切位置有限制。这就是为什么在创建计划绑定为渲染目标的ID3D12Resource时必须使用D3D12_HEAP_TYPE_DEFAULT并指定D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET(这也是DXGI在创建交换链渲染目标时隐式完成的)。

一般来说,您不能也不应该使用低级DXGI曲面创建API来创建Direct3D资源。它们大多是为系统使用而存在的,而不是由应用程序使用。

除非您碰巧在UMA系统上,否则应尽量减少对渲染目标的CPU访问,否则将需要昂贵的副本。即使在UMA系统上,也需要去平铺才能将结果转化为线性形式

Direct3D 12还提供了"放置的资源"方法,可以更好地控制内存的确切分配位置(或者更具体地说,虚拟内存地址的分配位置),但您仍然必须遵守底层体系结构的限制。根据内存体系结构的不同,您可以使用相同的内存"别名"多个不同的ID3D12Resource实例(例如渲染目标被别名为无序访问资源),但您有责任将所需的资源屏障插入命令列表(并对其进行测试),以确保它在所有DX12硬件上可靠工作。请参阅MSDN。

如果不需要用户查看结果,则不必Present渲染目标。

内存管理策略

UMA优化:CPU可访问纹理和标准Swizzle

Direct3D 12 入门

如果您是DirectX 12的新手,您应该参阅DirectX工具包的DirectX 12教程。如果您还不熟悉DirectX 11,您应该等待DirectX 12,然后开始使用DirectX 11工具包。

相关内容

最新更新