难以创建 vulkan 实例
difficulty creating a vulkan instance
im 开始重建游戏引擎 我开始为 openGL 编写,这次图形框架是基于 Vulkan 的,但由于访问冲突,我无法创建我的第一个 Vkinstance。 我按照 vulkan-tutorial.com 的教程,实例部分。 我声明一个
Vkinstance instance;
然后后来我打电话
vkCreateInstance(&createInfo, nullptr, &instance)
我的程序因访问违规而中断。
我尝试将实例设置为指针并对其进行设置
instance = new Vkinstance();
但这并不能解决问题。 我仍然有访问冲突。 这很令人沮丧,因为在教程中看到的 iv Vkinstance 创建且未初始化,然后在下一行将 strait 发送到 vkCreateInstance。 那么为什么我会收到此错误?
另外:实例是属于调用 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!");
}
它破坏了 vkCreateInstance(&createInfo, nullptr, &instance) 在 &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;
扩展计数很可能大于 2,这就是实例创建失败的原因(因为它期望的扩展名称超过两个)。
因此,也可以像处理扩展计数一样查询并传递所有可用的扩展名称(如果您确实要启用所有),或者createInfo.enabledExtensionCount
设置为预定义扩展列表数组的大小。
相关文章:
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 使用Vulkan hpp vk::enumerateInstanceVersion()会导致segfault
- 建议在运行时将带有类实例的列表从c++导入qml
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 为什么自删除的全局 Vulkan 实例仅在添加层时才导致段错误?
- vulkan vulkan.hpp从对象实例中获取opbject类型
- 难以创建 vulkan 实例
- 创建 Vulkan 实例会导致访问冲突
- VULKAN创建实例vk_out_of_host_memory
- Vulkan-加载扩展时实例创建失败