Vulkan之Instance

1)实例的概念

vulkan的层级实际上是一个挺麻烦的东西,因为它包含了太多的内容和概念。实际上对于一个应用程序来说,举个例子,一个游戏的app,它并不是直接进行图像画面的渲染,而是通过vulkan来实现的渲染,那么这里应用程序就是通过创建vulkan实例来进行图像渲染的操作。

实际上vulkan就是一个子系统的概念。应用程序把渲染的这些任务统一交给vulkan来处理,通过这种子系统的方式,app不需要知道太多的细节,但是它还是需要与vulkan子系统进行状态的追踪,信息的交互,这些必须要有一个媒介,这个就是instance。
Instance

2) 实例创建

实例用如下的函数创建:

1
2
3
4
5
// Provided by VK_VERSION_1_0
VkResult vkCreateInstance(
const VkInstanceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkInstance* pInstance);

第一个参数是指向创建instance需要传入的结构体的指针,第二个参数一般是NULL,第三个参数是指向创建的结构体的指针。

VkInstanceCreateInfo结构体如下所示:

1
2
3
4
5
6
7
8
9
10
11
// Provided by VK_VERSION_1_0
typedef struct VkInstanceCreateInfo {
VkStructureType sType;
const void* pNext;
VkInstanceCreateFlags flags;
const VkApplicationInfo* pApplicationInfo;
uint32_t enabledLayerCount;
const char* const* ppEnabledLayerNames;
uint32_t enabledExtensionCount;
const char* const* ppEnabledExtensionNames;
} VkInstanceCreateInfo;

其中VkApplicationInfo 的结构图下所示

1
2
3
4
5
6
7
8
9
10
// Provided by VK_VERSION_1_0
typedef struct VkApplicationInfo {
VkStructureType sType;
const void* pNext;
const char* pApplicationName;
uint32_t applicationVersion;
const char* pEngineName;
uint32_t engineVersion;
uint32_t apiVersion;
} VkApplicationInfo;

上面的内容,通过参数的名称也大概能猜出是什么意思,就不再介绍了。

注:
实际上vulkan的命令,大多数都是上面的这种模式,通过各种复杂的结构体(还包括结构体套结构体)来创建各种结构,并通过结构体指针参数得到创建的结果。

参考文献:

https://vulkan-tutorial.com/Drawing_a_triangle/Setup/Instance
https://www.khronos.org/registry/vulkan/specs/1.2/pdf/vkspec.pdf
vulkan应用开发指南

显示 Gitment 评论