2017-02-04 20 views
0

在我看過迄今爲止命令的一些樣品是一樣的東西:在D3D12中,渲染目標視圖可以是任何緩衝區嗎?

  1. D3D12_DESCRIPTOR_HEAP_DESC與D3D12_DESCRIPTOR_HEAP_TYPE :: D3D12_DESCRIPTOR_HEAP_TYPE_RTV
  2. ID3D12Device :: CreateDescriptorHeap
  3. D3D12_CPU_DESCRIPTOR_HANDLE與ID3D12DescriptorHeap :: GetCPUDescriptorHandleForHeapStart(也許ID3D12Device :: GetDescriptorHandleIncrementSize)
  4. (可選?)ID3D12Device :: 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很重要?)

回答

3

它取決於視頻內存架構,以確定渲染目標的確切位置。在某些系統中,只有視頻卡可以訪問的是專用視頻內存。在某些系統中,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您的呈現目標。

Memory Management Strategies

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開始。

+0

你寫道,我不能也不應該使用低級別的DXGI函數,但是當它們工作時 - 你的意思是ID3D12Device中的CreateCommittedResource,CreatePlacedResource,CreateReservedResource之一還是有更低級別的I還沒找到? – Emil

+1

澄清:使用Direct3D界面創建資源,而不是DXGI界面。 DXGI的使用應限於創建和管理交換鏈。 –

相關問題