VulkanTutorial(1·简述,vs环境搭建)

介绍:

与OpenGL,WebGL和Direct3D等API((Application Programming Interface, 应用程序编程接口))相比,valkan更偏向于底层,有更多的GPU控制接口,因此它有更好的性能和更小的驱动开销(通常用于游戏领域),但同样学习会更为困难(Vulkan类似于Direct3D或Metal)

valkan是Khronos Group行业协会(Intel、Nvidia等共同创立的)制定和维护的,一个图形API的规范(Specification)和标准(注:可以理解为规定独立声明,没有定义),和OpenGL和一样都是跨平台的

和opengl一样valkanSDK软件开发工具包同样不是由Khronos实现(Implement)的(虽然Khronos也提供了Vulkan的SDK……),通常由显卡的生产商实现

简介:

VulkanAPI->驱动程序软件(接收API调用传递过来的指令和数据,并进行转换)->硬件

对于openglAPI驱动程序会跟踪大量对象的状态,自动管理内存和同步,以及在程序运行时检查错误,

与opengl不同,VulkanAPI为了保持良好的CPU性能,将状态跟踪、同步和内存管理交给了应用程序开发人员,同时将正确性检查交给各个层进行代理,而要想使用这些层必须手动启用。这些层在正常情况下不会在应用程序里执行。

Vulkan绘制三角形流程简述

步骤1:实例和物理设备选择

  • APP程序通过VkInstance实例使用Vulkan API
  • 选择其中一个或多个VkPhysicalDevices物理设备(硬件),通过查询选择一个适合我们的设备

步骤2:逻辑设备和队列族

  • 创建VkDevice设备,描述VkPhysicalDeviceFeaturesVkPhysicalDeviceFeatures物理设备特性 VkPhysicalDeviceFeatures
  • 创建一个QueueFamily队列家族,每个队列家族支持一个特定操作集合,
  • QueueFamily负责分配VkQueue
  • Command会提交到VkQueue中

步骤3:窗口表面和交换链

  • 窗口创建:可以使用原生平台的窗口API或像GLFW或SDL这样的库来完成,此教程使用的是GLFW库
  • 还需要两个组件来渲染到实际窗口:VkSurfaceKHR,VkSwapchainKHRKHR后缀:表示它们属于Vulkan扩展)
  • 窗口表面(VkSurfaceKHR)跨平台抽象,它是由(原生窗口系统句柄)作为参数实例化得到
  • Vulkan API 本身 完全与平台无关,因此需要WSI(Window System Interface,窗口系统接口):用于与原生的窗口管理器进行交互,不过GLFW已经帮我们处理了,所以不用我们关心
  • 交换链(VkSwapChainKHR)渲染目标集合:保证我们正在渲染的图像当前屏幕图像是两个不同的图像,这可以确保显示出来的图像是complete完整的
  • 每帧:从交换链请求要渲染的图像->绘制显示->图像返回交换链
  • 渲染目标数量(渲染的图像)和图像显示到屏幕的时机依赖于显示模式,常用的显示模式有双缓冲(vsync,垂直同步)(前台,后台缓冲区)和三重缓冲

步骤4:图像视图和帧缓冲

  • 在  ->绘制显示->  这一步骤,并不能直接绘制,需要将图像先包装进:
  • VkImageView图像视图(可以引用图像的特定部分)
  • VkFramebuffer帧缓冲(可以引用图像视图作为颜色,深度和模板目标),将特定图像绑定到 这些插槽
  • 交换链中可能有多个不同的图像,我们可以预先为它们每一个都创建好图像视图和帧缓冲,然后在绘制时选择对应的那个。

步骤5:render pass渲染通道

  • 渲染通道描述了渲染操作使用的图像类型,图像的使用方式,图像的内容如何处理

步骤6:图形管线

  • 通过VkPipeline对象建立,描述了显卡的可配置状态,比如视口大小和深度缓冲操作,以及使用VkShaderModule着色器模块(图形管线的可编程部分)
  • 之前的图形OpenglAPI的一个最大不同是几乎所有图形管线的配置都需要提前完成
  • 如果我们想要使用另外一个着色器或者顶点布局,就需要重新创建整个图形管线
  • 显然效率很低,这迫使我们提前创建出所有我们需要的图形管线,在需要时直接使用已经创建好的图形管线。
  • 图形管线只有很少一部分配置可以动态修改,比如视口大小和清除颜色
  • vulkan这样限制的原因,就像预编译相比于即时编译,驱动程序可以有更大的优化空间(性能提升)

步骤7:指令池和指令缓冲

  • Vulkan的许多操作需要提交到VkQueue队列才能执行,但在提交到队列前,还需要提交到队列池的VkCommandPool分配VkCommandBuffer对象上
  • 比如绘制三角形,就要在VkCommandBuffer添加开始渲染,绑定图形管线,绘制三角形,结束渲染的命令
  • 我们可以提前为每个图像建立VkCommandBuffer指令缓冲,然后在绘制时,直接选择对应的指令缓冲使用

步骤8:主循环

  • 使用vkAcquireNextImageKHR函数从交换链获取一张图像。
  • 使用vkQueueSubmit函数提交图像对应的指令缓冲
  • 使用vkQueuePresentKHR函数将图像返回给交换链,显示图像到屏幕
  • 提交给队列的操作会被异步执行,需要采取同步措施比如信号量来确保操作按正确的顺序执行
  • 上述3个函数,读取,绘制,返回,都要在前面执行完成后执行,否则可能会出现读写冲突

VulkanAPI简述

vulkan.h:包含所有 Vulkan 函数、枚举和结构体

函数具有小写前缀,枚举和结构等类型 具有vk前缀

API 大量使用 使用 structs

几乎所有函数都返回 VkResult

创建 或销毁对象将具有 VkAllocationCallbacks 参数,该参数允许您 对驱动程序内存使用自定义分配器

Vulkan因为偏底层,因此将包括非常有限的错误检查和调试 功能,驱动程序经常会崩溃,而不是返回 错误代码 

Vulkan 允许您通过称为validation layers的功能启用广泛的检查

验证层可以插入的代码段 在 API 和图形驱动程序之间执行操作

Valkan和OpenGL

在低分辨率下,GPU的压力较小,此时 CPU 的调度和管理对整体性能的影响相对较大,Vulkan 能够减少 CPU 的负载,更好地发挥出硬件的潜力

在高分辨率,对 GPU 的性能要求更高,Valkan可以将渲染任务更有效地分配到 GPU 的多个核心和计算单元上,充分发挥 GPU 的并行处理能力,从而提高渲染的效率和速度。

Valkan是Opengl的取代品,但并不是opengl会被替代

OpenGL渲染介绍

  • 主机端资源加载(图片解码、字体解析、3D模型解析,这一过程跟GPU没有太大关系)
  • 设备端数据交互与管线准备:将必要的数据(Texture纹理上传,Shader的编译与Program的链接,VBO顶点数据的数据上传)传到GPU可以读到内存中去作为context上下文,以及准备GPU的指令
  • 每帧循环的渲染:DrawCall(真正执行绘制任务的图形API,如glDrawArrays, glDrawElements),这个过程是GPU驱动产生GPU硬件所能识别的任务,并发送到内核,等待调度执行。

opengl是一个状态机:

因此数据交互时,不能放到另一个独立线程中完成

由于绘制时要改变上下文,OpenGL不支持多线程线程并行绘制

每帧循环的渲染,在驱动层重新建一个Command Buffer

Valkan渲染介绍:

Vulkan Object
  • 找到设备VkDevice——创建上下文VkCommand buffer(负责Record记录,多线程)——创建命令队列VkQueue(负责Submit提交,异步执行)——准备任务——发送执行(GPU)
  • Command buffer: VkViewport视口,VkDescriptorSet描述(VkImage纹理和常量)、VkPipeline管线(着色器模块和状态Option(depth, blend,cull face 等))和VkBuffer缓冲(vectex顶点,index索引,uniform全局)
  • 每次调 vkCmd 就往command pool命令池, command buffer 命令队列塞内容进去,命令push_back完成之后就可以提交给queue执行了
  • QueueFamily队列家族,Family里会有若干queue,常见的 Family 为三种:Graphic图形,Compute计算(几乎什么都可以做)和 Transfer内存传输

valkan的性能提升的原因(多线程高度并行化):

Vulkan则没有数据交互独立线程的问题

Vulkan可以并行创建Command Buffer

在应用层建好 Command Buffer,每帧绘制时添加sub上去

Vulkan更容易封装,各子模块之间互不影响,

 valkan开发环境搭建

valkanSDK:

包括标头、标准验证层、调试工具 以及 Vulkan 函数的加载程序。加载程序在 驱动程序等

安装:

首先在LunarG网站下载SDK

验证

PC 显卡驱动程序是否支持Vulkan

进入安装SDK的目录,打开Bin32目录运行vkcube.exe演示程序

并且安装后会自动为你配置系统Path环境变量 

VSIDE_Configuration_Dependent

下载最新版本的GLFW-64-bit,以便渲染

将GLFW静态库:

头文件放到include目录下

glfw3.libglfw3dll.lib、放到VulkanSDK安装目录下的Lib文件夹下

动态库glfw3.dll ,放到Bin文件夹下(如果下载的是32-bit,则放在Lib32,Bin32)

项目模板

在实际工作中,很多时候我们需要的是一个跟我们项目的业务更加契合的、可复用的项目模板

VulkanSDK……Templates\……,并拷贝到C:\Users\username\Documents\Visual Studio YYYY\Templates\ProjectTemplates\目录下

创建一个基于 VulkanCppWindowedProgram 的模板

点击运行,可以看到一个黑色的背景窗口(基于SDL2.dll窗口的程序)

我们将项目模板的main.cpp 文件替换为自己的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/901485.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

检索增强型生成模型RichRAG:为多面查询提供丰富回应

人工智能咨询培训老师叶梓 转载标明出处 大模型在处理静态知识更新和信息准确性方面仍面临挑战。为了解决这些问题,检索增强型生成(RAG)模型应运而生,它们通过检索文档来辅助语言模型生成更可靠的回答。但现有的RAG研究大多集中在…

springboot079信息化在线教学平台的设计与实现(论文+源码)_kaic

信息化在线教学平台的设计与实现 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了信息化在线教学平台的开发全过程。通过分析信息化在线教学平台管理的不足,创建了一个计算机管理信息化在线教学平台…

【人工智能】——matplotlib教程

文章目录 1.matplotlib简介2.基本绘图功能2.1给图形添加辅助功能2.2在一个坐标系中绘制多个图像2.3多个坐标系显示图像 3.常见图像绘制 1.matplotlib简介 matplotlib 是一个用于创建二维图表和数据可视化的 Python 库,它提供了一种类似于 MATLAB 的绘图接口。matplo…

Mybatis-07.基础操作-环境准备

一.需求说明 二.准备工作

网关三问:为什么微服务需要网关?什么是微服务网关?网关怎么选型?

文章整体介绍 本文旨在解答关于微服务网关的三个核心问题: 1)为什么需要网关?也即在何种场景下应采用微服务网关以优化系统架构; 2)什么是微服务网关?主要讲构成微服务网关的关键能力,包括但…

再传上市消息,奇瑞汽车追赶智能电动的“风”

近日,彭博社引述消息指出,奇瑞控股集团已选择中金公司、广发证券、华泰国际负责安排旗下汽车子公司奇瑞汽车潜在的IPO事宜。奇瑞汽车最早或于明年在香港上市,期望IPO估值超1,000亿元人民币。知情人士表示,审议仍在进行中&#xff…

Compose 修改默认点击效果

Compose 默认点击效果修改 一、Compose的默认点击效果二、实现自己的点击效果 一、Compose的默认点击效果 使用Modifier.clickables可以使Text有点击效果 Text(text "我是Text", modifier Modifier.clickable {})源码分析,点击效果clickable方法中的in…

一文彻底理解 JavaScript 解构赋值

一、基本概念 为什么需要解构呢,先来看一个例子: const student {name: ZhangSan,age: 18,scores: {math: 19,english: 85,chinese: 100} };function displayInfo(student) {console.log(name:, student.name);console.log(math:, student.scores.mat…

k8s 综合项目笔记

综述 这篇笔记主要是为了记录下自己写 k8s 综合项目的过程。 由于自己之前已经写过简单的开发和运维项目,所以这里就结合一下,在搭建 k8s 集群后安装运维常用服务,比如 ansible 和 prometheus,用 NFS 实现数据存储同步&#xff0c…

CodeQL和数据流分析的简介

文章目录 前言一、CodeQL 简介二、编写污点跟踪查询扩展传播功能 总结 前言 最近,CodeQL使用非常广泛(GitHub 开发的一种强大的静态分析工具)来将代码扫描作为 CI/CD 管道的一部分。其核心是 QL 语言,它用于编写对代码进行推理的…

炒股VS炒CSGO游戏装备,哪个更好做

这个项目,赚个10%都是要被嫌弃的 虽然天天都在抒发自己对股市的看法,但自己自始至终也没有买进任何一支股票。之所以对这个话题感兴趣,着实是因为手上的游戏搬砖项目也是国际性买卖,跟国际形势,国际汇率挂钩&#xff…

k8s可以部署私有云吗?私有云部署全攻略

k8s可以部署私有云吗?K8S可以部署私有云。Kubernetes是一个开源的容器编排引擎,能够自动化容器的部署、扩展和管理,使得应用可以在各种环境中高效运行。通过使用Kubernetes,企业可以在自己的数据中心或私有云环境中搭建和管理容器…

鸿蒙开发融云demo消息时间格式化

鸿蒙开发融云demo消息时间格式化 融云没有提供鸿蒙版本带ui的,跟着我一步步搭建起来基本功能。 这次说消息时间格式化 一、消息时间格式化 先看下效果图: 二、关键代码: 看起来简单,但处理起来还是挺麻烦的 // 处理时间函数入…

​​CMU生成式人工智能大模型:从入门到放弃(七)

引言 在前面的系列博客中,我们探讨了生成式对抗网络(GANs)的基本原理和应用。今天,我们将深入探讨变分自编码器(VAEs),这是一种能够学习数据的低维表示并从中生成新数据的生成式模型。 变分自…

路由器 相关知识

一、路由器是什么 参考:图解系列--路由器和它庞大的功能_路由功能-CSDN博客 路由器是指:主要负责 OSI参考模型中网络层的处理工作,并根据路由表信息在不同的网络 之间转发IP 分组的网络硬件(图3-1)。这里的网络一般是指IP 子网,…

为Windows Terminal 配置zsh + Oh-My-Zsh!

参考: 为Windows Terminal 配置zsh Oh-My-Zsh! [非WSL] https://zhuanlan.zhihu.com/p/625583037 Package: zsh - MSYS2 Packages 安装配置 1、安装 Windows Terminal(必须) Method 1: 打开 Microsoft Store,搜索 “Windows Terminal”。点击 “…

修改el-table默认滚动条样式

el-table原有滚动条样式对有些用户来说太窄&#xff0c;拖动起来不方便&#xff0c;因此做出如下修改。 修改前的样式图&#xff1a; 修改后的样式图&#xff1a; 样式代码&#xff1a; <style lang"scss" scoped> ::v-deep ::-webkit-scrollbar {width: 6px;…

CSS易漏知识

复杂选择器可以通过&#xff08;id的个数&#xff0c;class的个数&#xff0c;标签的个数&#xff09;的形式&#xff0c;计算权重。 如果我们需要将某个选择器的某条属性提升权重&#xff0c;可以在属性后面写!important&#xff1b;注意!importent要写在;前面 很多公司不允许…

C++:模版初阶

目录 1. 泛型编程 2.函数模版 2.1. 函数模版的用法 2.2. 函数模版的原理 2.3 函数模板的实例化 2.4 模版参数的匹配原则 3. 类模版 3.1 类模版的格式 3.2. 类模版的实例化 1. 泛型编程 如何实现整形、字符串&#xff0c;或者其他自定义类型的交换函数&#x…

028.爬虫专用浏览器-抓取#shadowRoot(closed)下的内容

一、什么是Shadow DOM Shadow DOM是一种在web开发中用于封装HTML标记、样式和行为的技术&#xff0c;以避免组件间的样式和脚本冲突。它允许开发者将网页的一部分隐藏在一个独立的作用域内&#xff0c;从而实现更加模块化和可维护的代码结构 二、js操作Shadow DOM // 获取宿…