vulkan & Qt

如果還堅持看這個系列文章的同學應該已經有一定的vulkan基礎了吧。不過相信大家也應該明白,glfw作為學習的庫還不錯,但是貌似用來做點東西就有些力不從心。這次就講講Qt接vulkan的方法。
Qt 5.10在版本添加了官方的vulkan支持。雖然其實舊版本Qt也能用vulkan,但是function loader,surface之類的都需要自行維護,用Qt的時候拿window的句柄也確實不太好。現(xiàn)在,終于有更high level的方法來處理這些雜事了。
對于畫三角形的方法,我不在贅述,只簡述一下Qt和glfw的不同,讓大家感受一下Qt開發(fā)vulkan到底有多簡單。
首先,Qt提供了QVulkanInstance對象,instance的方法可以用此對象直接獲取,無需手工查詢。并且QVulkanInstance提供了setLayers方法,可以簡單直接的啟用驗證層。并且順便幫大家直接設置了驗證信息向命令行輸出,可以不自己實現(xiàn)用來顯示驗證信息的callback。
接下來,創(chuàng)建一個QVulkanWindow的子類,并將QVulkanInstance示例作為參數(shù)傳給你的QVulkanWindow的子類的示例。如果你用在Qt5中使用QOpenGLWindow的經驗,你會發(fā)現(xiàn)兩者的設計思想上的高度一致。
實現(xiàn)QVulkanWindow的子類時,只要重寫createRenderer()方法即可,該方法返回一個QVulkanWindowRenderer指針。所以接下來,實現(xiàn)你的QVulkanWindowRenderer。
編寫QVulkanWindowRenderer的子類,在這個子類中,你需要重寫initResources(),initSwapChainResources(),releaseSwapChainResources(),releaseResources(),startNextFrame()這5個方法。這幾個重寫函數(shù)名是死的,不能像glfw那樣自由起,但是你能得到的是qt幫忙管理surface還有swapchain這個小福利。
順便提一下Qt的vulkan demo代碼中,各種VkXXXCreateInfo都使用如下的初始化形式:
VkXXXCreateInfo xxxInfo;
memset(&xxxInfo, 0, sizeof(xxxInfo));
但是,如果你自己開發(fā)的話,我更建議直接使用:
VkXXXCreateInfo xxxInfo = {};
的形式來完成各種Vk對象的初始化,更簡潔,也更高效。
代碼示例在:
https://github.com/THISISAGOODNAME/vulkan-tutorial-code/tree/master/QtVulkanTest
示意圖

自己開發(fā)的時候請使用64位的MSVC編譯器吧,直接使用release模式,debug模式不行,32位的mingw也不行。
Qt + vulkan的組合,我第一次見,就是PS3模擬器RPCS3。vulkan模式下比openGL流暢很多,真的是令人嘆為觀止。最近,lunarG發(fā)布了最新的vulkan SDK中,添加了mac的支持。至此,vulkan已經可以正式宣布,又重新跨了全平臺。相信在日后vulkan一定是一個新的風潮吧。