vulkan & Qt

如果还坚持看这个系列文章的同学应该已经有一定的vulkan基础了吧。不过相信大家也应该明白,glfw作为学习的库还不错,但是貌似用来做点东西就有些力不从心。这次就讲讲Qt接vulkan的方法。
Qt 5.10在版本添加了官方的vulkan支持。虽然其实旧版本Qt也能用vulkan,但是function loader,surface之类的都需要自行维护,用Qt的时候拿window的句柄也确实不太好。现在,终于有更high level的方法来处理这些杂事了。
对于画三角形的方法,我不在赘述,只简述一下Qt和glfw的不同,让大家感受一下Qt开发vulkan到底有多简单。
首先,Qt提供了QVulkanInstance对象,instance的方法可以用此对象直接获取,无需手工查询。并且QVulkanInstance提供了setLayers方法,可以简单直接的启用验证层。并且顺便帮大家直接设置了验证信息向命令行输出,可以不自己实现用来显示验证信息的callback。
接下来,创建一个QVulkanWindow的子类,并将QVulkanInstance示例作为参数传给你的QVulkanWindow的子类的示例。如果你用在Qt5中使用QOpenGLWindow的经验,你会发现两者的设计思想上的高度一致。
实现QVulkanWindow的子类时,只要重写createRenderer()方法即可,该方法返回一个QVulkanWindowRenderer指针。所以接下来,实现你的QVulkanWindowRenderer。
编写QVulkanWindowRenderer的子类,在这个子类中,你需要重写initResources(),initSwapChainResources(),releaseSwapChainResources(),releaseResources(),startNextFrame()这5个方法。这几个重写函数名是死的,不能像glfw那样自由起,但是你能得到的是qt帮忙管理surface还有swapchain这个小福利。
顺便提一下Qt的vulkan demo代码中,各种VkXXXCreateInfo都使用如下的初始化形式:
VkXXXCreateInfo xxxInfo;
memset(&xxxInfo, 0, sizeof(xxxInfo));
但是,如果你自己开发的话,我更建议直接使用:
VkXXXCreateInfo xxxInfo = {};
的形式来完成各种Vk对象的初始化,更简洁,也更高效。
代码示例在:
https://github.com/THISISAGOODNAME/vulkan-tutorial-code/tree/master/QtVulkanTest
示意图

自己开发的时候请使用64位的MSVC编译器吧,直接使用release模式,debug模式不行,32位的mingw也不行。
Qt + vulkan的组合,我第一次见,就是PS3模拟器RPCS3。vulkan模式下比openGL流畅很多,真的是令人叹为观止。最近,lunarG发布了最新的vulkan SDK中,添加了mac的支持。至此,vulkan已经可以正式宣布,又重新跨了全平台。相信在日后vulkan一定是一个新的风潮吧。