在這節中, 創建一個實例初始化Vulkan庫,指定驅動程序需要使用的應用程序信息
1,要有個實例句柄
VkInstance instance;
2,設置創建Vulkan驅動程序需要的信息,
VkInstanceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
分以下三部分
(1)應用程序信息
VkApplicationInfo appInfo = {};
createInfo.pApplicationInfo = &appInfo;
(2)需要的窗口交互擴展
uint32_t glfwExtensionCount = 0;
const char** glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
createInfo.enabledExtensionCount = glfwExtensionCount;
createInfo.ppEnabledExtensionNames = glfwExtensions;
(3)//全局擴展層(對整個應用程序都有效,而不僅僅對一個設備有效)
//暫時設置為0,不使用全局擴展層
createInfo.enabledLayerCount = 0;
3,創建Vulkan實例
VkResult result = vkCreateInstance(
&createInfo, //包含創建信息的結構體指針
nullptr, //自定義的分配器回調函數,暫時設置為nullptr,不使用
&instance); //指向新對象句柄存儲位置的指針。
當然,也要有個清理資源
vkDestroyInstance(instance, nullptr);
這里有個可選項,就是第2點,設置了窗口交互擴展,那么有多少可擴展項呢?就要查看擴展列表,是否有這個窗口交互擴展
即
//檢測擴展支持
//獲取擴展數量
uint32_t extensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
//存儲信息數組
std::vector<VkExtensionProperties> extensions(extensionCount);vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, extensions.data());
運行結果不變,
完整代碼如下:
myapplication.h
#pragma once
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>
#include <vulkan/vulkan.h>
#include
#include “D:/install/filament-v1.18.0/third_party/imgui/examples/libs/glfw/include/GLFW/glfw3.h”
#include
#include
#include
#include
class MyApplication
{
public:
void run();
private:
//初始化窗口
void initWindow();
//初始化Vulkan對象
void initVulkan();
//主循環進行渲染操作
void mainLoop();
//資源清理
void cleanUp();
//創建一個實例初始化Vulkan庫,指定驅動程序需要使用的應用程序信息
void createInstance();
private:
//窗口
GLFWwindow* window = nullptr;
//實例句柄
VkInstance instance;
};
MyApplication.cpp
#include “MyApplication.h”
void MyApplication::run()
{
initWindow();
initVulkan();
mainLoop();
cleanUp();
}
void MyApplication::initWindow()
{
//初始化GLFW庫,
glfwInit();
//阻止創建OpenGL上下文
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
//禁止窗口大小改變
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
//存儲窗口句柄
const int WIDTH = 800;
const int HEIGHT = 600;
window = glfwCreateWindow(WIDTH, HEIGHT, "Vulkan window", nullptr, nullptr);
}
void MyApplication::initVulkan()
{
createInstance();
}
void MyApplication::mainLoop()
{
//在沒有錯誤和窗口沒有被關閉下一直運行,事件循環
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
}
}
void MyApplication::cleanUp()
{
//在應用程序結束前清除vulkan實例
vkDestroyInstance(instance, nullptr);
glfwDestroyWindow(window);
glfwTerminate();
}
void MyApplication::createInstance()
{
//應用程序信息,便于優化
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;
//創建Vulkan驅動程序需要的信息
VkInstanceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
createInfo.pApplicationInfo = &appInfo;//返回需要的窗口交互擴展
uint32_t glfwExtensionCount = 0;
const char** glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
createInfo.enabledExtensionCount = glfwExtensionCount;
createInfo.ppEnabledExtensionNames = glfwExtensions;//全局擴展層(對整個應用程序都有效,而不僅僅對一個設備有效)
//暫時設置為0,不使用全局擴展層
createInfo.enabledLayerCount = 0;//創建Vulkan實例
VkResult result = vkCreateInstance(&createInfo, //包含創建信息的結構體指針nullptr, //自定義的分配器回調函數,暫時設置為nullptr,不使用&instance); //指向新對象句柄存儲位置的指針。//檢測擴展支持
//獲取擴展數量
uint32_t extensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
//存儲信息數組
std::vector<VkExtensionProperties> extensions(extensionCount);vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, extensions.data());
}
調用
#define GLFW_INCLUDE_VULKAN
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include “MyApplication.h”
int main()
{
MyApplication app;
app.run();
return 0;
}