我是圖形編程和Vulkan的新手。 我知道我們需要將緩衝區綁定到描述符集,但是我想知道是否需要爲每個緩衝區設置一個新的描述符集,或者我可以將descriptorSet集綁定2個或更多個緩衝區? 如果是的話,這是什麼經驗法則?我是否需要爲每個緩衝區創建一個新的描述符集?
1
A
回答
1
每個描述符集可能有多個相同或不同類型的資源。在描述符集佈局中定義了哪些類型的資源可以通過描述符集進行綁定。在那裏,通過VkDescriptorSetLayoutBinding結構,您可以指定給定類型的資源(例如採樣器,存儲器映像或統一緩衝區)以及作爲着色器內數組訪問的此類資源數。但是,您也可以指定多個相同類型的資源作爲單獨的佈局條目(在創建佈局時指定多個VkDescriptorSetLayoutBinding條目)。每個這樣的描述符都必須使用不同的綁定。而同樣的約束力,必須內部着色器可以用來訪問給定的資源:
layout(set=S, binding=B) uniform <variable_type> <variable_name>;
至於你的問題的第二部分 - 它依賴。每種情況,繪製場景,渲染資源類型,資源數量,內存使用情況,甚至圖形硬件供應商都會影響渲染過程中用於創建和綁定描述符集的方法。一般規則是,您應該儘量減少渲染過程中的狀態變化。所以你應該保持vkCmdBindDescriptorSets()函數調用的數量儘可能小。但是這限制了你場景的靈活性和動態性。因此,在許多情況下,您需要更改描述符,或者每次使用多個描述符綁定多個描述符。但是,正如我寫的,這一切都取決於特定的情況。
1
不,您不需要爲每個資源設置單獨的描述符。
VkDescriptorSetLayout的文檔似乎清楚發生了什麼。在同一章中還有很好的代碼示例。
因此,綜上所述,高達:
- 可以有一個單一的描述符類型
- 可以有幾個「綁定」,其每一個可以保存任何描述符類型資源的(同質的)陣列(或他們的陣列)
- 而作爲一個間接層以上,你可以有幾個描述符設置各有其綁定
憑經驗大概是「少即是多」。如果您不需要資源具有不同的類型或名稱,請使用數組。如果你不需要單獨設置,只使用一組。
相關問題
- 1. 每個Unix文件描述是否都有自己的讀/寫緩衝區?
- 2. 我是否需要爲每個遊戲級別創建一個新的活動?
- 3. 我是否需要爲每個請求創建一個新的Struts Action類?
- 4. Zend緩存我們是否需要每次都創建一個新對象?
- 5. 描述每個ZF2路線 - 是否真的需要?
- 6. C#我需要爲每個患者創建一個新表格
- 7. 錯誤:unpack_from需要一個緩衝區
- 8. 我是否需要爲C++中的每個新建使用delete?
- 9. 我是否需要爲每個測試重新創建我的驅動程序?
- 10. 我需要緩衝區嗎?
- 11. 我是否需要爲EF中的每個表創建一個類
- 12. 我是否需要爲每個頁面創建路線? (node.js中)
- 13. 我們是否需要爲每個ViewModel創建induvidual ViewModelLocators?
- 14. 每次我是否需要在循環中新建一個ArrayList?
- 15. 我們是否需要爲每個圖像創建一個HttpHandler(ashx)?
- 16. fopen是否創建文件描述符?
- 17. 我是否需要爲每個線程創建新的Callable對象?
- 18. 是否需要緩衝TextReader?
- 19. 是否需要雙緩衝
- 20. 我是否需要觀察每個創建的NSManagedObjectContext的NSManagedObjectContextDidSaveNotification?
- 21. 我是否需要爲UITextField創建一個控制器?
- 22. 我是否需要爲has_many:through關聯創建一個關聯表?
- 23. 爲什麼在創建緩衝區時需要分配內存?
- 24. 爲什麼iconv函數需要一個非常量緩衝區?
- 25. 爲什麼需要連續多次綁定一個緩衝區?
- 26. 我是否需要在此測試中創建每個對象?
- 27. WCF代理:我是否需要爲每個綁定創建一個新的和不同的代理?
- 28. 爲什麼在創建輸出緩衝區時需要刷新輸出緩衝區?
- 29. 我必須爲每個webgl程序創建單獨的緩衝區嗎?
- 30. 我是否需要爲每個productFlavor添加一個新的google-services.json?