2017-08-11 25 views
0

我目前在Vulkan中實現了一個帶有多線程的基本延遲渲染器。由於我的G緩衝區應該與最終圖像具有相同的分辨率,所以我們希望根據this演示文稿在幻燈片44(第138頁)中的說明,在單次渲染過程中使用多次子循環執行此操作。它說:多線程着色傳遞Vulkan

  • vkCmdBeginCommandBuffer
  • vkCmdBeginRenderPass
  • vkCmdExecuteCommands
  • vkCmdNextSubpass
  • vkCmdExecuteCommands
  • vkCmdEndRenderPass
  • vkCmdEndCommandBuffer

我在第一個子過程中得到了這個結果,您可以迭代場景圖併爲每個實體/網格記錄一個輔助命令緩衝區。我沒有得到的是你應該如何使用輔助命令緩衝區進行陰影傳遞。你是否將屏幕分成幾部分,並將每個部分渲染到一個單獨的線程中,或者只是爲整個第二個子通道記錄一個輔助命令緩衝區?

回答

1

我不明白的是你應該如何使用輔助命令緩衝區進行陰影傳遞。

陰影通(assumably第二subpass)將可能採取由第一subpass作爲輸入附件創建的G-緩衝器。然後,使用G緩衝區中的數據和一組燈光中的數據(或任何延遲着色器試圖推遲的數據)繪製尺寸相同的屏幕大小的四元組。

您鏈接的演示文稿嘗試提示從第13頁開始的結構樣式(標記爲「頁面107」)。

第一步就是讓它工作。使用例如這SW example。然後將其優化爲單個渲染通道的下一步應該更容易。

+0

我知道,第二subpass被渲染到從G-Buffer的全屏幕四邊信息,但我的問題是,如果將有任何理智/有用的應用程序多線程通過這個通道,或者如果我應該開始第二個子通道'VK_SUBPASS_CONTENTS_INLINE' – Dynamitos

+0

正如我在我的回答中所說,我想使用VK_SUBPASS_CONTENTS_INLINE進行着色傳遞yes) –

+0

@Dynamitos哦。那麼你可以像演示文稿中的第14頁那樣做,這需要3 cmdbuffers(可以用多線程方式構建),但對我來說聽起來像是不必要地尋找過早的優化。我認爲cmdbuffer的構建是相對較快的,即使它們只有少數幾個是單線程的。 – krOoze

3

對我來說,就像你說的那樣,你可能需要多線程你的命令緩衝區來「建立g-buffer子通道」。然而,對於陰影通過,它必須取決於你如何做事。對我來說(再次),你不需要多線程你的陰影子路徑。但是,你必須考慮到你可以有一個「按地區依賴」。

所以,我鼓勵你這樣做。 在開始RenderPass之前,使用計算着色器在屏幕上劃出所有燈光(這裏有一個「四邊形」陣列)。

由splatting我的意思是這種事情。你有一個點光源(例如),這個想法是計算受光線影響的屏幕空間的四邊形。這樣你就可以將4個頂點(代表一個四邊形)放入SSBO中,並且可以將它用作着色子通道中的頂點緩衝區。

現在開始渲染過程。

  1. MT場景圖渲染,如果需要的話。並做你的vkCmdExecuteCommands();
  2. NextSubpass
  3. 使用「四邊形陣列」你從早期的計算着色器創建(別忘了VK_SUBPASS_EXTERNAL依賴)。
  4. NextSubpass等

不過,你說的

您遍歷場景圖,並記錄每個實體/網眼一個二次commandbuffer。

我不知道我真的明白你的意思,但是如果你打算爲一個網格有一個輔助命令緩衝區,我真的建議你改變你的方式。您必須使用批處理。假設你有64 000個不同的網格來繪製。你可以例如創建64個命令緩衝區(你在4個線程上調度),每個命令緩衝區有1000個網格來繪製。 (這個號碼是隨機抽取的,因此可以描述你的應用)。

因此,要回答你的問題的陰影subpass,我不會用命令緩衝區或只有極少數(由那種燈(準時的,定向))

+0

我不太明白你的意思是「將你所有的燈光分解在屏幕上」,你能否把這個更詳細地描述一下? – Dynamitos

+0

我做了一個編輯來解釋我的意思 –

+0

我認爲使用計算着色器進行光計算對我而言會有點複雜和過度,因爲我已經很難理解基本的延遲方法,但我會嘗試一次,並且如果我曾經來過那麼多 – Dynamitos