在D3D12中,渲染目标视图可以是任何缓冲区吗?
In D3D12, can the render target view be any buffer?
到目前为止,在我看过的示例中,一些命令类似于:
- D3D12_DESCRIPTOR_HEAP_DESC 与 D3D12_DESCRIPTOR_HEAP_TYPE::D3D12_DESCRIPTOR_HEAP_TYPE_RTV
- ID3D12Device::CreateDescriptorHeap
- D3D12_CPU_DESCRIPTOR_HANDLE 和 ID3D12DescriptorHeap::GetCPUDescriptorHandleForHeapStart(也许 ID3D12Device::GetDescriptorHandleIncrementSize)
- (可选?)ID3D12Device::CreateRenderTargetView
- (可选?)IDXGISwapChain3::GetBuffer
- 将渲染内容安排到命令列表,注意 OMSetRenderTargets 和 DrawInstanced,然后关闭命令列表。
- ID3D12CommandQueue::ExecuteCommandLists
- (可选?)IDXGISwapChain3::Present
- 在栅栏上安排 ID3D12CommandQueue::Signal 的信号
- 等待 GPU 完成 ID3D12Fence::SetEventOnCompletion 和 WaitForSingleObjectEx
如果可能的话,如何将步骤 4.1 替换为所选的缓冲区? IE。如何创建一个 ID3D12Resource* 并渲染它,然后从中读入一个 std::vector? (我假设如果这可能的话,步骤 6.1 可以被忽略,因为交换链没有呈现目标视图。在这种情况下,也许步骤 4 也是不必要的?也许只有 OMSetRenderTargets 重要?)
渲染目标的确切位置取决于显存架构。在某些系统上,它位于只有视频卡才能访问的专用视频内存中。在某些系统中,它位于 CPU 和 GPU 都可以访问的总线共享显存中。在统一内存架构中,一切都在系统内存中。
因此,您对渲染目标的确切位置有限制。这就是为什么在创建要绑定为渲染目标的 ID3D12Resource 时必须使用 D3D12_HEAP_TYPE_DEFAULT
并指定 D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET
(这也是在创建交换链渲染目标时由 DXGI 隐式完成的)。
一般来说,您不能也不应该使用 low-level DXGI 表面创建 API 来创建 Direct3D 资源。它们主要供系统使用而不是应用程序使用。
Unless you happen to be on a UMA system, you should minimize the CPU access to the render target as it will require expensive copies otherwise. Even on UMA systems, there's also required de-tiling as well to get the results into a linear form.
Direct3D 12 还提供了 "Placed Resource" 方法,可以更好地控制内存的确切分配位置(或更具体地说,虚拟内存地址的分配位置),但您仍然必须遵守底层架构限制。根据内存架构,您可以 "alias" 多个不同的 ID3D12Resource 实例都使用相同的内存(例如渲染目标被别名为无序访问资源),但您负责将所需的资源屏障插入到命令列表(并测试它)以确保它在所有 DX12 硬件上可靠地工作。参见 MSDN。
如果不需要用户查看结果,则不必 Present
渲染目标。
UMA Optimizations: CPU Accessible Textures and Standard Swizzle
Getting Started with Direct3D 12
If you are new to DirectX 12, you should see the DirectX Tool Kit for DirectX 12 tutorials. If you aren't already familiar with DirectX 11, you should wait on DirectX 12 and start with DirectX Tool Kit for DirectX 11.
到目前为止,在我看过的示例中,一些命令类似于:
- D3D12_DESCRIPTOR_HEAP_DESC 与 D3D12_DESCRIPTOR_HEAP_TYPE::D3D12_DESCRIPTOR_HEAP_TYPE_RTV
- ID3D12Device::CreateDescriptorHeap
- D3D12_CPU_DESCRIPTOR_HANDLE 和 ID3D12DescriptorHeap::GetCPUDescriptorHandleForHeapStart(也许 ID3D12Device::GetDescriptorHandleIncrementSize)
- (可选?)ID3D12Device::CreateRenderTargetView
- (可选?)IDXGISwapChain3::GetBuffer
- 将渲染内容安排到命令列表,注意 OMSetRenderTargets 和 DrawInstanced,然后关闭命令列表。
- ID3D12CommandQueue::ExecuteCommandLists
- (可选?)IDXGISwapChain3::Present
- 在栅栏上安排 ID3D12CommandQueue::Signal 的信号
- 等待 GPU 完成 ID3D12Fence::SetEventOnCompletion 和 WaitForSingleObjectEx
如果可能的话,如何将步骤 4.1 替换为所选的缓冲区? IE。如何创建一个 ID3D12Resource* 并渲染它,然后从中读入一个 std::vector? (我假设如果这可能的话,步骤 6.1 可以被忽略,因为交换链没有呈现目标视图。在这种情况下,也许步骤 4 也是不必要的?也许只有 OMSetRenderTargets 重要?)
渲染目标的确切位置取决于显存架构。在某些系统上,它位于只有视频卡才能访问的专用视频内存中。在某些系统中,它位于 CPU 和 GPU 都可以访问的总线共享显存中。在统一内存架构中,一切都在系统内存中。
因此,您对渲染目标的确切位置有限制。这就是为什么在创建要绑定为渲染目标的 ID3D12Resource 时必须使用 D3D12_HEAP_TYPE_DEFAULT
并指定 D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET
(这也是在创建交换链渲染目标时由 DXGI 隐式完成的)。
一般来说,您不能也不应该使用 low-level DXGI 表面创建 API 来创建 Direct3D 资源。它们主要供系统使用而不是应用程序使用。
Unless you happen to be on a UMA system, you should minimize the CPU access to the render target as it will require expensive copies otherwise. Even on UMA systems, there's also required de-tiling as well to get the results into a linear form.
Direct3D 12 还提供了 "Placed Resource" 方法,可以更好地控制内存的确切分配位置(或更具体地说,虚拟内存地址的分配位置),但您仍然必须遵守底层架构限制。根据内存架构,您可以 "alias" 多个不同的 ID3D12Resource 实例都使用相同的内存(例如渲染目标被别名为无序访问资源),但您负责将所需的资源屏障插入到命令列表(并测试它)以确保它在所有 DX12 硬件上可靠地工作。参见 MSDN。
如果不需要用户查看结果,则不必 Present
渲染目标。
UMA Optimizations: CPU Accessible Textures and Standard Swizzle
Getting Started with Direct3D 12
If you are new to DirectX 12, you should see the DirectX Tool Kit for DirectX 12 tutorials. If you aren't already familiar with DirectX 11, you should wait on DirectX 12 and start with DirectX Tool Kit for DirectX 11.