在我看过的样本中,到目前为止,一些命令是这样的:
如果可能,如何用选择的缓冲区替换步骤4.1?即如何创建一个ID3D12Resource *并呈现给它,然后从中读取到一个std :: vector? (我假设是否可以忽略步骤6.1,因为交换链没有呈现目标视图。在这种情况下,步骤4也是不必要的?也许只有OMSetRenderTargets很重要?)
答案 0 :(得分:4)
取决于视频内存架构,渲染目标的确切位置。在某些系统上,它只在视频卡可以访问的专用视频内存中。在某些系统中,它在CPU和GPU都可以访问的总线上共享的视频内存中。在统一内存架构中,一切都在系统内存中。
因此,您可以限制渲染目标的确切位置。这就是为什么在创建计划绑定为渲染目标的ID3D12Resource时必须使用D3D12_HEAP_TYPE_DEFAULT
并指定D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET
的原因(这也是在创建交换链渲染目标时由DXGI隐式完成的)。
一般来说,您不能并且不应该使用低级DXGI表面创建API来创建Direct3D资源。它们主要用于系统使用而不是应用程序。
除非您恰好位于UMA系统上,否则应尽量减少对渲染目标的CPU访问,否则将需要昂贵的副本。即使在UMA系统上,也需要去除平铺以使结果成线性形式。
Direct3D 12还提供了#34; Placed Resource"这些方法还可以提供对内存分配位置的更多控制(或者更具体地说,分配虚拟内存地址的位置),但您仍然必须遵守底层架构限制。根据内存架构,您可以使用"别名"多个不同的ID3D12Resource实例都使用相同的内存(例如渲染目标被别名为无序访问资源),但是您负责将所需的资源障碍插入命令列表(并对其进行测试)以确保其有效可靠地安装在所有DX12硬件上。请参阅MSDN。
如果您不需要用户查看结果,则无需Present
渲染目标。
UMA Optimizations: CPU Accessible Textures and Standard Swizzle
Getting Started with Direct3D 12
如果您不熟悉DirectX 12,则应该看到DirectX Tool Kit for DirectX 12教程。如果您还不熟悉DirectX 11,则应等待DirectX 12并以DirectX Tool Kit for DirectX 11开头。