VulkanTutorial(2·创建GLFWwindow*和VkInstance)

server/2024/10/25 14:29:14/

使用GLFW创建窗口

首先包含两个库的头文件

#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>

定义Application的基本结构:run ( init(),loop(),clean() )

在main loop创建Application obj,通过try catch异常处理,检测在程序执行时是否有错误信息

调用GLFWAPI创建窗口

void initVulkan() {glfwInit();//创建GLFW库glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);glfwWindowHint(GLFW_RELEASE, GLFW_FALSE);//暂时禁用调整窗口window = glfwCreateWindow(WIDTH, HEIGHT,"Sen's Valkan demo", nullptr, nullptr);//设置窗口信息
}void mainLoop() {while (!glfwWindowShouldClose(window)) {glfwPollEvents();}
}void cleanup() {glfwDestroyWindow(window);glfwTerminate();
}

创建VkInstance

VkInstance instance;

首先创建可选的VkApplicationInfo结构体,填充一些 有关我们应用程序的信息

Vulkan 中的许多结构要求您明确指定 成员中的类型,比如sType = STRUCTURE TYPE APPLICATION INFO结构类型应用信息

Vulkan 中的很多信息都是通过结构体而不是函数parameters 参数传递的

其中VkApplicationInfo appInfo{};是列表初始化struct对象,对于struct聚合类型来说,列表初始化具有特殊的意义:

列表初始化会逐个初始化其成员,按照它们在类中声明的顺序,如果列表中的元素少于聚合类型的成员数量,那么剩余的成员会被值初始化(对于内置类型,这通常意味着它们被初始化为0或nullptr)而非默认初始化

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:它告诉 Vulkan 驱动程序,我们要使用的全局扩展和验证层

VkInstanceCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
createInfo.pApplicationInfo = &appInfo;

 Vulkan 是一个 与平台无关的 API,因此需要一个Extension扩展来与 窗口系统交互,而GLFW 有一个方便的内置函数,它返回扩展,以及获取扩展数量

uint32_t glfwExtensionCount = 0;
const char** glfwExtensions;glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);createInfo.enabledExtensionCount = glfwExtensionCount;
createInfo.ppEnabledExtensionNames = glfwExtensions;

全局验证层 我们暂时不使用

createInfo.enabledLayerCount = 0;

们已经指定了 Vulkan 创建实例所需的一切, 可以使用 vkCreateInstancevkCreateInstance创建VkInstance

  • 指向包含创建信息的结构的指针
  • 指向自定义分配器回调的指针,始终在本教程中nullptr
  • 指向存储新对象句柄的变量的指针

几乎所有 Vulkan 函数都返回 VkResultVkResult VkResult 类型的值,要检查 instance 创建成功使用 check()!= VK_SUCCESS

if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) {throw std::runtime_error("failed to create instance!");
}

清理

vkDestroyInstance(instance, nullptr);

现在运行程序以确保实例创建成功

VK_ERROR_INCOMPATIBLE_DRIVER

如果使用苹果的MacOS操作系统与最新的 MoltenVK SDK 一起使用,可能会有VK_ERROR_INCOMPATIBLE_DRIVER不兼容的驱动程序错误……

检查扩展支持

要在创建实例之前检索支持的扩展列表,可以使用 vkEnumerateInstanceExtensionProperties
 函数

  • 可选的 first 参数,允许我们按特定的 验证层
  • 存储扩展数量的变量
  • 存储扩展详细信息的 VkExtensionProperties
     数组

首次的vkEnumerateInstanceExtensionProperties是初始化数组的元素数量

uint32_t extensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
std::vector<VkExtensionProperties> extensions(extensionCount);
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, extensions.data());
std::cout << "available extensions:\n";
for (const auto& extension : extensions) {std::cout << '\t' << extension.extensionName << '\n';
}

http://www.ppmy.cn/server/134740.html

相关文章

2024年网络安全(黑客)自学总结

前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 如何成为一名黑客 很多朋友在学习安全方面都会半路转行&#xff0c…

ETCD未授权访问风险基于角色认证和启用https的ca证书修复方案

ETCD未授权访问风险安全漏洞修复方案 ETCD未授权访问风险介绍基于角色认证的访问控制&#xff08;BASIC认证&#xff09;基于ca证书的https访问控制&#xff08;TLS传输&#xff09;下载cfssl认证配置工具生成ca认证证书修改etcd配置方式一方式二 访问etcd节点信息 patroni使用…

【漏洞复现】74cms v4.2.1 v4.2.129 后台getshell漏洞

漏洞描述 厂商:74cms 下载地址:http://www.74cms.com/download/index.html 关于版本: 新版的74cms采用了tp3.2.3重构了,所以可知底层是tp,74cms新版升级是后台升级的,所以先将将升级方法。 注:此漏洞不用升级至最新版本也可使用。 免责声明 技术文章仅供参考,任何个…

未来智慧城市发展的四大引领方向

随着全球城市化进程的加速和科技创新的不断推动&#xff0c;智慧城市作为未来城市发展的重要方向&#xff0c;将在多个领域引领城市实现可持续、智能、高效的发展。以下是智慧城市引领未来城市发展的四个关键方向&#xff1a; 1. 智慧交通&#xff1a; 智慧交通是智慧城市建设…

光纤传感器比传统传感器强在哪?——以大坝监测为例

应用介绍 大坝安全监测中心经常对当前工程中的大坝进行检查, 以确保水电站的安全运行。 大坝原有的观测模式是传感器加上人工观测模式&#xff0c;多数传感器经过多年运行后逐渐老化&#xff0c;出现测点损伤&#xff0c;且精度无法与现有光纤传输传感器相比&#xff0c;受现…

excel斜线表头

检验数据验证对象 鼠标放在检验数据 验证对象中间&#xff0c;altenter 之后空格 选中格子&#xff0c;右键单元格格式&#xff0c; 完成 如果是需要多分割&#xff0c;操作一样&#xff0c;在画斜线的时候会有区别&#xff0c;在插入里面用直线画斜线即可 在表格插入的时…

iframe里放的视频,如何采用纯css适配

步骤1&#xff1a;设置包含iframe的父元素 首先&#xff0c;确保iframe的父容器具有一个适当的宽高比。通过为父容器设置一个相对定位和一定的宽度和高度&#xff0c;你可以控制它的尺寸。 <div class"video-container"><iframe src"https://www.exa…

计算机正负数运算:【补码】

计算机使用的是二进制&#xff0c;且计算机是以补码的方式进行存储数据的&#xff0c;补码是通过原码、反码一步步演变而来的。 1&#xff1a;源码&#xff0c;反码&#xff0c;补码 原码&#xff1a;第一位符号位数为0是正&#xff0c;1是负。 反码&#xff1a;是在原码的基…