vkGetInstanceProcAddr获取vkCreateDebugUtilsMessengerEXT返回空求助
问题分析与解决方案
你的代码核心问题出在createInstance函数中,扩展配置被错误覆盖,导致VK_EXT_debug_utils扩展没有被实际启用,因此vkGetInstanceProcAddr无法找到vkCreateDebugUtilsMessengerEXT函数地址。
错误代码片段
在createInstance里,你先正确获取了包含调试扩展的完整列表,但随后直接用GLFW的扩展覆盖了实例创建信息的扩展配置:
auto extensions = getRequiredExtensions(); createInfo.enabledExtensionCount = static_cast<uint32_t>(extensions.size()); createInfo.ppEnabledExtensionNames = extensions.data(); // 这段代码覆盖了上面的扩展配置,丢失了VK_EXT_debug_utils uint32_t glfwExtensionCount = 0; const char** glfwExtensions; glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount); createInfo.enabledExtensionCount = glfwExtensionCount; createInfo.ppEnabledExtensionNames = glfwExtensions;
修复方法
删除覆盖扩展配置的代码段,直接使用getRequiredExtensions()返回的、已经包含GLFW必要扩展和调试扩展的合并列表即可:
void createInstance() { if (enableValidationLayers && !checkValidationLayerSupport()) { throw std::runtime_error("validation layers requested, but not available!"); } VkApplicationInfo appInfo{}; appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; appInfo.pApplicationName = "Hello Triangle"; appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0); appInfo.pEngineName = "No Engine"; appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0); appInfo.apiVersion = VK_API_VERSION_1_0; VkInstanceCreateInfo createInfo{}; createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.pApplicationInfo = &appInfo; // 直接使用合并了GLFW扩展和调试扩展的完整列表 auto extensions = getRequiredExtensions(); createInfo.enabledExtensionCount = static_cast<uint32_t>(extensions.size()); createInfo.ppEnabledExtensionNames = extensions.data(); VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo{}; if (enableValidationLayers) { createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size()); createInfo.ppEnabledLayerNames = validationLayers.data(); populateDebugMessengerCreateInfo(debugCreateInfo); createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT*) &debugCreateInfo; } else { createInfo.enabledLayerCount = 0; createInfo.pNext = nullptr; } if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) { throw std::runtime_error("failed to create instance!"); } }
额外说明
你的getRequiredExtensions()函数已经正确将GLFW的必要扩展和调试扩展合并到同一个列表中,因此不需要单独处理GLFW的扩展配置,直接使用这个合并后的列表就能完成实例创建时的扩展启用。
内容的提问来源于stack exchange,提问作者Valon_Inc
相关产品推荐
相关产品推荐

