Vulkan教程-Vulkan实例

Vulkan初始化

Vulkan实例概述

         在写Windows的应用程序时,大家肯定接触过HINSTANCE。在程序中他起到了很大的作用。同样,在进行与Vulkan有关的操作时,我们同样需要一个与其类似的东西,就是VkInstance。

创建Vulkan实例

        和HINSTANCE不同,它在程序开始时就已经自动创建好了,但是VkInstance需要我们自己创建。创建VkInstance时,我们需要使用vkCreateInstance这个函数:
VkResult vkCreateInstance
(
	const VKInstanceCreateInfo*  pCreateInfo,
	const VKAllocationCallbacks* pAllocator,
	VkInstance*                  pInstance
);
        从函数原型中我们可以看到创建VkInstance需要3个参数,其中pAllocator我们可以暂时设置为NULL,pInstance即为一个VkInstance的指针,我们可以定义一个VkInstance,然后把他的指针传过去,pCreateInfo为一个结构体:
typedef struct VkInstanceCreateInfo
{
	VkStructureType              sType;
	const void*                  pNext;
	VkInstanceCreateFlags        flags;
	const VkApplicationInfo*     pApplicationInfo;
	uint32_t                     enableLayerCount;
	const char* const*           ppEnableLayerName;
	uint32_t                     enableExtensionCount;
	const char* const*           ppEnableExtensionName;
} VKInstanceCreateInfo;
在这个结构体中必须注意的有以下几点:
  1. sType必须为VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO
  2. pNext必须为NULL
  3. flags必须为0
  4. 如果pApplicationInfo不是NULL,它必须指向一个有效的VkApplicationInfo
  5. 如果enableLayerCount不为0,ppEnableLayerName必须指向一个数组,其中包含的元素不得小于enableLayerCount
  6. 如果enableExtensionCount不为0,ppEnableExtensionName必须指向一个数组,其中包含的元素不得小于enableExtensionCount

(有关Layer和Extension的内容将在以后的讲解中介绍)

        其中pApplicationInfo指向一个有效的VkApplicationInfo结构体,这个结构体比较简单了,如下:

typedef struct VkApplicationInfo
{
	VkStructureType      sType;
	const void*          pNext;
	const char*          pApplicationName;
	uint32_t             applicationVersion;
	const char*          pEngineName;
	uint32_t             engineVersion;
	uint32_t             apiVersion;
} VkApplicationInfo;


在这个结构体中必须注意的有以下几点:

  1. sType必须为VK_STRUCTURE_TYPE_APPLICATION_INFO
  2. pNext必须为NULL
  3. 如果pApplicationName不是NULL,它必须指向一个非空字符串
  4. 如果pEngineName不是NULL,它必须指向一个非空字符串
  5. 除非有特殊需求,apiVersion必须为0

知道了这些我们就可以创建VkInstance了,下面是一段创建VkInstance的代码:

int main()
{
	VkApplicationInfo	AppInfo;

	AppInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
	AppInfo.pNext = NULL;
	AppInfo.pApplicationName = "测试项目";
	AppInfo.applicationVersion = 1;
	AppInfo.pEngineName = "测试";
	AppInfo.engineVersion = 1;
	AppInfo.apiVersion = 0;

	//初始化Instance
	VkInstanceCreateInfo	InstanceInfo;

	InstanceInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
	InstanceInfo.pNext = NULL;
	InstanceInfo.pApplicationInfo 		= &AppInfo;
	InstanceInfo.enabledLayerCount 		= 0;
	InstanceInfo.ppEnabledLayerNames 	= NULL;
	InstanceInfo.enabledExtensionCount 	= 0;
	InstanceInfo.ppEnabledExtensionNames 	= NULL;
	
	//创建Instance并判断是否成功
	if (vkCreateInstance(&InstanceInfo, NULL, &Instance) != VK_SUCCESS)
		return -1;
	return 0;
}


上述代码将会创建一个VkInstance并且检验是否创建成功。说到这里给大家列出一下vkCreateInstance的返回值:


成功:

  • VK_SUCCESS
失败:
  • VK_ERROR_OUT_OF_HOST_MEMORY
  • VK_ERROR_OUT_OF_DEVICE_MEMORY
  • VK_ERROR_INITIALIZATION_FAILED
  • VK_ERROR_LAYER_NOT_PRESENT
  • VK_ERROR_EXTENSION_NOT_PRESENT
  • VK_ERROR_INCOMPATIBLE_DRIVER

释放Vulkan实例

在程序结束时,我们需要使用函数vkDestroyInstance释放Vulkan实例:
void vkDestroyInstance
(
	VkInstance 			instance,
	const VkAllocationCallbacks* 	pAllocator
);
其中instance必须为一个有效的VkInstance,pAllocator暂时可以设置为NULL。

你可能感兴趣的:(Vulkan教程)