RTX2060下VK_KHR光线追踪扩展可见但无法获取,创建设备报错
首先明确:在Vulkan 1.3中,VK_KHR_acceleration_structure和VK_KHR_raytracing_pipeline已经被提升为核心功能,因此它们不会出现在vkEnumerateDeviceExtensionProperties返回的设备扩展列表中——这是正常现象,不是问题。你遇到的创建设备错误,大概率是因为仍在尝试将这两个已核心化的扩展添加到设备扩展列表中导致的。
以下是针对性的解决步骤:
移除设备扩展列表中的两个KHR扩展
创建设备时,不要再把VK_KHR_acceleration_structure和VK_KHR_raytracing_pipeline加入VkDeviceCreateInfo::enabledExtensionNames数组。强行添加已核心化的扩展会触发Vulkan驱动报错。正确配置核心功能结构
创建设备时,通过pNext链传入对应的核心功能结构,启用所需特性:// 加速结构功能 VkPhysicalDeviceAccelerationStructureFeatures accelStructFeatures = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES, .accelerationStructure = VK_TRUE }; // 光线追踪管线功能 VkPhysicalDeviceRayTracingPipelineFeatures rayTracingFeatures = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES, .pNext = &accelStructFeatures, .rayTracingPipeline = VK_TRUE }; VkDeviceCreateInfo deviceCreateInfo = { .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, .pNext = &rayTracingFeatures, // 其他必要参数(队列族、基础功能等)... };若你的代码仍在使用带KHR后缀的功能结构(比如
VkPhysicalDeviceAccelerationStructureFeaturesKHR),也可以继续使用,但核心版本的结构更推荐(无需依赖扩展头文件)。确认实例创建时的API版本请求
确保VkApplicationInfo中指定的apiVersion为VK_API_VERSION_1_3,这样驱动才会启用1.3的核心功能集:VkApplicationInfo appInfo = { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, .apiVersion = VK_API_VERSION_1_3, // 其他参数(应用名称、引擎名称等)... };若需要兼容旧版本,至少要为加速结构请求1.2版本,为光线追踪管线请求1.3版本。
Volk相关配置检查
使用Volk时,确保你已经正确初始化Volk(调用volkInitialize()),并且项目中包含了Volk对Vulkan 1.3核心功能的支持。Volk会自动加载核心功能对应的函数,无需手动通过扩展方式加载。验证支持性的正确方式
不要通过设备扩展列表判断这两个特性是否可用,而是应该查询对应的功能结构:VkPhysicalDeviceAccelerationStructureFeatures accelFeatures = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES }; VkPhysicalDeviceFeatures2 features2 = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, .pNext = &accelFeatures }; vkGetPhysicalDeviceFeatures2(physicalDevice, &features2); // 检查accelFeatures.accelerationStructure是否为VK_TRUE光线追踪管线特性的检查方式完全类似。
内容的提问来源于stack exchange,提问作者TioT2

