难以创建 vulkan 实例
difficulty creating a vulkan instance
我开始重建我开始为 openGL 编写的游戏引擎,这次图形框架是基于 Vulkan 的,但由于访问冲突,我无法创建我的第一个 Vkinstance。我正在学习有关 vulkan-tutorial.com 的教程,实例部分。我声明一个
Vkinstance instance;
然后我打电话给
vkCreateInstance(&createInfo, nullptr, &instance)
我的程序因访问冲突而中断。
我试过使实例成为指针并设置它
instance = new Vkinstance();
但这并不能解决问题。我仍然有访问冲突。这是令人沮丧的,因为 iv 在教程中看到 Vkinstance 创建但未初始化,然后在下一行将 strait 发送到 vkCreateInstance。那为什么我会收到这个错误?
另外:instance 是属于 class vkCreateInstance 调用的私有变量。
编辑:
这里有一个更完整的代码段,您可以测试一下
#define VK_USE_PLATFORM_WIN32_KHR
#include <vulkan/vulkan.h>
int main(int argc, char* argv[]) {
VkInstance instance;
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;
unsigned int extensionCount = 0;
const char* extensionNames[] = {
VK_KHR_SURFACE_EXTENSION_NAME,
VK_KHR_WIN32_SURFACE_EXTENSION_NAME
};
vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL);
createInfo.enabledExtensionCount = extensionCount;
createInfo.ppEnabledExtensionNames = extensionNames;
createInfo.enabledLayerCount = 0;
if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) {
throw std::runtime_error("failed to create instance!");
}
它在 &instance 中断 vkCreateInstance(&createInfo, nullptr, &instance) : 访问冲突读取位置 0xCCCCCCCC
您的实例扩展名称列表固定为两个条目:
const char* extensionNames[] = {
VK_KHR_SURFACE_EXTENSION_NAME,
VK_KHR_WIN32_SURFACE_EXTENSION_NAME
};
但是您读取了所有可用扩展的总数并将其传递给创建信息:
vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL);
createInfo.enabledExtensionCount = extensionCount;
createInfo.ppEnabledExtensionNames = extensionNames;
很可能 extensionCount 大于 2,这就是实例创建失败的原因(因为它期望超过两个扩展名)。
因此,要么也查询并传递所有可用的扩展名称(如果您真的想启用全部),就像您对扩展计数所做的那样,或者将 createInfo.enabledExtensionCount
设置为预定义扩展列表的数组大小。
我开始重建我开始为 openGL 编写的游戏引擎,这次图形框架是基于 Vulkan 的,但由于访问冲突,我无法创建我的第一个 Vkinstance。我正在学习有关 vulkan-tutorial.com 的教程,实例部分。我声明一个
Vkinstance instance;
然后我打电话给
vkCreateInstance(&createInfo, nullptr, &instance)
我的程序因访问冲突而中断。
我试过使实例成为指针并设置它
instance = new Vkinstance();
但这并不能解决问题。我仍然有访问冲突。这是令人沮丧的,因为 iv 在教程中看到 Vkinstance 创建但未初始化,然后在下一行将 strait 发送到 vkCreateInstance。那为什么我会收到这个错误?
另外:instance 是属于 class vkCreateInstance 调用的私有变量。
编辑:
这里有一个更完整的代码段,您可以测试一下
#define VK_USE_PLATFORM_WIN32_KHR
#include <vulkan/vulkan.h>
int main(int argc, char* argv[]) {
VkInstance instance;
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;
unsigned int extensionCount = 0;
const char* extensionNames[] = {
VK_KHR_SURFACE_EXTENSION_NAME,
VK_KHR_WIN32_SURFACE_EXTENSION_NAME
};
vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL);
createInfo.enabledExtensionCount = extensionCount;
createInfo.ppEnabledExtensionNames = extensionNames;
createInfo.enabledLayerCount = 0;
if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) {
throw std::runtime_error("failed to create instance!");
}
它在 &instance 中断 vkCreateInstance(&createInfo, nullptr, &instance) : 访问冲突读取位置 0xCCCCCCCC
您的实例扩展名称列表固定为两个条目:
const char* extensionNames[] = {
VK_KHR_SURFACE_EXTENSION_NAME,
VK_KHR_WIN32_SURFACE_EXTENSION_NAME
};
但是您读取了所有可用扩展的总数并将其传递给创建信息:
vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL);
createInfo.enabledExtensionCount = extensionCount;
createInfo.ppEnabledExtensionNames = extensionNames;
很可能 extensionCount 大于 2,这就是实例创建失败的原因(因为它期望超过两个扩展名)。
因此,要么也查询并传递所有可用的扩展名称(如果您真的想启用全部),就像您对扩展计数所做的那样,或者将 createInfo.enabledExtensionCount
设置为预定义扩展列表的数组大小。