簡體   English   中英

Vulkan 中的多個透明繪圖調用之間是否需要同步?

[英]Is synchronization needed between multiple draw calls with transparency in Vulkan?

我正在學習 Vulkan,我剛剛使用原始 ImGui 存儲庫中的 Vulkan-GLFW 示例將 ImGui 集成到我的代碼中,並且效果很好。

現在我想在屏幕上同時渲染 GUI 和我的 3D model,由於 GUI 和 model 肯定需要不同的着色器,我需要使用多個管道命令並提交多個着色器。 GUI 是部分透明的,所以我希望它在 model 之后呈現。 Vulkan 規范指出命令的執行順序不太可能是我記錄命令的順序,因此我需要某種同步。 這篇 Reddit 帖子中,提出了幾種完全實現我的目標的方法,我曾經認為我必須使用多個子通道(連同子通道依賴)或屏障或其他類似的同步方法來解決這個問題。

然后我看了一下SaschaWillems 的 Vulkan 示例,雖然在 ImGui 示例中,我看到兩個繪制調用之間沒有同步,它只是記錄了先繪制 model 的命令,然后是繪制 GUI 的命令。

我很困惑。 在這種情況下真的需要同步,還是我誤解了命令重新排序或混合的一些內容? 謝謝。

想一想你在做什么。 為什么你認為兩組命令之間需要同步? 因為第二組命令需要和第一組的數據混合,對吧? 因此,它需要進行讀/修改/寫(RMW),它必須能夠讀取上一組命令寫入的數據。 讀取的數據必須已經寫入,這通常需要同步。

但請多想想這意味着什么。 混合必須從幀緩沖區中讀取來完成它的工作。 但是......深度測試也是如此,對嗎? 它必須讀取現有樣本的深度值,將其與傳入的片段進行比較,然后根據深度測試是否丟棄片段。 所以基本上每個使用深度測試的繪圖調用都包含一個幀緩沖區讀取/修改/寫入。

然而......你的深度測試有效。 它們不僅可以在沒有顯式同步的繪圖調用之間工作,而且還可以繪圖調用中工作。 如果繪制調用中的兩個三角形重疊,則通過頂部看到底部的三角形沒有任何問題,對嗎? 您不必進行三角形間同步以確保先前三角形的寫入在讀取之前完成。

因此,不知何故,深度測試的 RMW 無需任何顯式同步即可工作。 那么...為什么您認為混合階段的 RMW 不正確?

Vulkan 規范規定命令和命令中的階段將以基本上無序的方式執行,但有幾個例外。 最明顯的是存在顯式執行障礙/依賴關系。 但它也表示,固定功能的每個樣本測試和混合階段將始終(好像)按提交順序(在子通道內)執行。 不僅如此,它還要求命令中生成的三角形也(好像)以特定的、明確定義的順序執行這些階段。

這就是您的深度測試不需要同步的原因; Vulkan 要求對此進行處理。 這也是您的混合不需要同步(在子通道內)的原因。

所以你有很多選擇(從最快到最慢的順序):

  • 在與非 UI 相同的子通道中渲染您的 UI。 只需根據需要更改管道即可。
  • 在子通道中渲染您的 UI,顯式依賴於非 UI 子通道的幀緩沖區圖像。 雖然這在技術上較慢,但如果有的話,它可能不會慢很多。 此外,這對於延遲渲染很有用,因為您的 UI 需要在您的光照通道之后發生,這無疑是它自己的子通道。
  • 在不同的渲染通道中渲染您的 UI。 僅當您需要執行一些全屏工作 (SSAO) 時才需要這樣做,這將強制您的非 UI 渲染過程無論如何都終止。

暫無
暫無

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

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