本文主要参考NVIDIA Vulkan Ray Tracing Tutorial教程,环境配置与程序均可参照此文档执行(个人水平有限,如有错误请参照原文)。
一、初始化
为了能够使用Vulkan光线追踪,我们需要VK_KHR_ACCELERATION_STRUCTURE和VK_KHR_RAY_TRACING_PIPELINE拓展,以上两个扩展还依赖于其他扩展,因此需要添加以下所有扩展程序:
// #VKRay: 激活光线追踪扩展
VkPhysicalDeviceAccelerationStructureFeaturesKHR
accelFeature{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR};
//加速结构拓展支持
contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, &accelFeature);
VkPhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR};
//vkCmdTraceRaysKHR可使拓展
contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, &rtPipelineFeature);
//光线追踪管道拓展
contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME);
此处添加的拓展会添加到contextInfo中,并根据vkEnumerateDeviceExtensionProperties获取的拓展集合判断设备是否支持光追拓展。
之后将拓展填充至VkDeviceCreateInfo的enabledExtensionCount与ppEnabledExtensionNames
上,然后调用vkCreateDevice创建vulkan设备。
调用成功之后,程序会启用Vulkan光追功能并使用相关设备光追功能的信息填充上边的两个结构体。
之后,我们需要新增一个初始化光追的函数initRayTracing()以及一个存储当前显卡光线线追踪能力的成员变量:
// #VKRay
void initRayTracing();
VkPhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR};
initRayTracing函数的具体实现如下所示:
// 初始化Vulkan光线追踪
void HelloVulkan::initRayTracing()
{
// 查询显卡支持的光追属性
VkPhysicalDeviceProperties2 prop2{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2};
prop2.pNext = &m_rtProperties;
vkGetPhysicalDeviceProperties2(m_physicalDevice, &prop2);
}
此处可以使用vkGetPhysicalDeviceProperties2来查询 GPU 支持的光线追踪功能拓展值。
其中需要注意两个数据:
- 最大递归深度:即从单个光线执行的嵌套光线追踪调用的数量。即是光线在递归路径追踪器中可以在场景中反弹的次数。出于性能目的,递归实际上应保持在最低限度,有利于循环公式。
- 着色器标头大小:在创建着色器绑定表(SBT)的时候时候需要用到。
最后在更新描述符集之后,调用initRayTracing()函数即可。