簡體   English   中英

如何在Direct3D 11中從CPU訪問framebuffer?

[英]How to access framebuffer from CPU in Direct3D 11?

我正在創建一個簡單的框架,用於在C ++ / D3D11下教授基礎圖形概念。 該框架需要通過簡單的接口函數(例如Putpixel( x,y,r,g,b ) )直接操作屏幕柵格內容。

在D3D9下,這是一個相對簡單的目標,它通過在堆上分配表面緩沖區來實現CPU組成表面。 然后將鎖定后備緩沖區,並將堆緩沖區的內容傳輸到后備緩沖區。 據我了解,不可能直接從D3D11下的CPU訪問后備緩沖區。 必須准備一個紋理資源,然后通過一些全屏幾何圖形將其繪制到后台緩沖區。

我考慮過這種程序的兩個系統。 第一個包含D3D11_USAGE_DEFAULT紋理和D3D11_USAGE_STAGING紋理。 首先映射分段紋理,然后從CPU繪制。 當場景完成時,分段紋理被取消映射並使用CopyResource (如果我沒有記錯的話使用GPU執行復制)將其復制到默認紋理,然后通過全屏紋理四邊形將默認紋理繪制到后備緩沖區。

第二個系統包括D3D11_USAGE_DYNAMIC紋理和堆上分配的幀緩沖區。 組合場景時,映射動態紋理,堆緩沖區的內容通過CPU復制到動態紋理,動態紋理未映射,然后通過全屏紋理四邊形繪制到后緩沖區。

我的印象是,使用讀寫訪問和D3D11_USAGE_STAGING創建的紋理將駐留在系統內存中,但我運行的性能測試似乎表明情況並非如此。 也就是說,通過CPU繪制一個簡單的200x200填充矩形,使用分段紋理比使用堆緩沖區慢大約3倍(對於兩種情況完全相同的反匯編(緊密的rep stos循環)),強烈暗示分段紋理駐留在圖形適配器中記憶。

我更喜歡使用分段紋理系統,因為它允許渲染到后備緩沖區的工作以及從系統內存復制到圖形內存的工作都被卸載到GPU上。 但是,我想在任何情況下優先考慮CPU訪問速度超過這種能力。

那么對於這種用例,哪種方法最佳? 我將非常感謝任何提示,對我的兩種方法的修改或完全不同方法的建議。

動態和分段都可能在系統內存中,但是你的問題很可能是寫入組合內存。 這是一種緩存模式,其中單個寫入被合並在一起,但是如果您嘗試讀取,因為它是未緩存的,每個加載都要支付完全內存訪問的代價。 你甚至必須非常小心,因為c ++ *data=something; 有時可能會導致不必要的讀取。

動態紋理沒有任何問題,GPU可以讀取系統內存,但是您需要小心,創建其中的一些,並使用map_nooverwrite循環每個幀,以禁止丟棄的昂貴的驅動程序緩沖區重命名。 當然,永遠不要在讀寫中做地圖,只寫,否則你會引入gpu / cpu sync並殺死並行性。

最后,如果你想要一個持久的表面,只有幾個putpixel一個幀(甚至很多),我會選擇無序的訪問視圖和一個計算着色器,它使用像素位置的緩沖區,顏色要更新。 該緩沖區將再次成為具有nooverwrite映射的動態緩沖區。 使用該解決方案,主表面將駐留在視頻存儲器中。

在個人方面,我甚至不願意教cpu表面操作,這幾乎總是一個不好的做法和性能殺手,而不是現代gpu架構的方式。 這不是十年前的基本圖形概念。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM