[英]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 要求對此進行處理。 這也是您的混合不需要同步(在子通道內)的原因。
所以你有很多選擇(從最快到最慢的順序):
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.