我正在關注vulkan-tutorial.com教程和即時通訊驗證層步驟。在Alexander Overvoorde教程中,作者將用於創建實例的可用擴展集合移至其自己的函數中。爲什麼從方法中獲得vulkan擴展失敗了vulkan實例創建?
std::vector<const char*> getRequiredExtensions()
此前我已經收集這些信息有點不同,因爲我使用SDL2代替GLFW,但我的程序運行與實例創建並沒有驗證錯誤。問題是當我將代碼移到這個函數時,我不能再獲取實例創建。
這個工作得很好:
unsigned int extensionCount = 0;
vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL);
std::vector<VkExtensionProperties> extensionProperties(extensionCount);
vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, extensionProperties.data());
std::vector<const char*> extensionNames;
std::cout << "available extensions:" << std::endl;
int i = 0;
while (i < extensionCount) {
extensionNames.push_back(extensionProperties[i].extensionName);
std::cout << extensionNames[i] << std::endl;
i++;
}
if (enableValidationLayers) {
extensionNames.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
}*/
createInfo.enabledExtensionCount = extensionCount;
createInfo.ppEnabledExtensionNames = extensionNames.data();
但這種失敗,即使函數使用完全相同的代碼,並返回extensionNames,然後我用這樣的:
std::vector<const char*> extensionNames = getRequiredExtensions();
createInfo.enabledExtensionCount = static_cast<uint32_t>(extensionNames.size());
createInfo.ppEnabledExtensionNames = extensionNames.data();
那麼,爲什麼不這項工作?我有一個正式的Java教學背景,但已經用C++編寫了一年,所以它可能就像我發送錯誤的語法錯誤或指針。此外
reateInfo.enabledExtensionCount = static_cast<uint32_t>(getRequiredExtensions().size());
作品就好因此返回向量的大小是正確的:5我相信,因爲我有4個擴展加上調試之一。
你能否告訴我最好的方法來通過這個?將使用'std :: vector> getRequiredExtensions()'工作?因爲我不能獲得'createInfo.ppEnabledExtensionNames = extensionNames.data();'採取'std :: vector << std :: shared_ptr >' –
iv嘗試使用共享ptr,它不會工作,我真的想保留在這種情況下,函數 –
@MatthewBuchanan的本地擴展屬性,我會說不要爲此付出汗水,並將您的API作爲優先級進行清理。返回一個'std :: vector',並且在實際需要分配'createInfo.ppEnabledExtensionNames'的函數中爲這個任務創建一個'std :: vector '。 –
Quentin