VulkanTutorial(1·环境搭建,渲染流程简述)

news2024/11/27 12:48:32

介绍:

与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性能,将状态跟踪、同步和内存管理交给了应用程序开发人员,同时将正确性检查交给各个层进行代理,而要想使用这些层必须手动启用。这些层在正常情况下不会在应用程序里执行。

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 文件替换为自己的

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提交,用queue是按顺序提交,非多线程)——准备任务——发送执行(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更容易封装,各子模块之间互不影响,

Vulkan绘制三角形流程简述

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

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

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

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

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

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

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

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

步骤5:渲染流程

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

步骤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 和图形驱动程序之间执行操作

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python数据可视化】利用Matplotlib绘制美丽图表!

【Python数据可视化】利用Matplotlib绘制美丽图表! 数据可视化是数据分析过程中的重要步骤,它能直观地展示数据的趋势、分布和相关性,帮助我们做出明智的决策。在 Python 中,Matplotlib 是最常用的可视化库之一,它功能…

【论文+源码】基于spring boot的垃圾分类网站

创建一个基于Spring Boot的垃圾分类网站涉及多个步骤,包括环境搭建、项目创建、数据库设计、后端服务开发、前端页面设计等。下面我将引导您完成这个过程。 第一步:准备环境 确保您的开发环境中安装了以下工具: Java JDK 8 或更高版本Mav…

python装饰器的另类用法

在对pyverilog源码进行单步调试时,遇到一个很奇怪的现象,被装饰器装饰的方法t_LINECOMMENT没有主动调用,但装饰器TOKEN中的内嵌函数set_regex却被调用了。 ## lexer.pyfrom ply.lex import *class VerilogLexer(object):linecomment r"…

C++【string类的使用】(上)

文章目录 1. 为什么要学习string类2. 标准库的string类2.1 string的构造函数(1)无参构造(重点)(2)用字符串初始化(重点)(3)用字符串的前n个字符初始化(4)拷贝…

常见ElasticSearch 面试题解析(上)

前言 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch…

直播间“饕餮盛宴”的背后,是“他经济”正在冒头

最近,一个有意思的现象逐渐露出了苗头。 今年“双11”第一轮尾款开启支付的当晚,罗永浩的直播间上演了一出别样的“饕餮盛宴”。直播开场后,iphone16系列、可口可乐(含糖、无糖300ml)10秒售罄,索尼PS5、沃…

hive on tez 指定队列后任务一直处于running状态

如上图所示一直处于running状态&#xff0c;查看日志发现一直重复弹出同一个info&#xff1a; 2024-10-18 16:57:32,739 [INFO] [AMRM Callback Handler Thread] |rm.YarnTaskSchedulerService|: Allocated: <memory:0, vCores:0> 释义: 当前应用程序没有分配到任何内存…

wordcloud 字体报错

wordcloud 字体报错 词云库报错&#xff1a;Only supported for TrueType fonts字体文件问题pillow版本的问题wordcloud版本问题&#xff08;我的最终解决方案&#xff09; 词云库报错&#xff1a;Only supported for TrueType fonts 字体文件问题 解决方法 写绝对路径 &…

教程分享!超简单的低功耗4G模组LCD应用示例!看过来~

低功耗4G模组LCD应用是物联网技术中的一部分知识&#xff0c;在未来的学习和实践中&#xff0c;我们还将接触到更多前沿的技术和理念。让我们一起努力&#xff0c;探索科技的无限可能&#xff0c;为我们的生活带来更多便利与惊喜&#xff01;希望本文能为您提供一些帮助&#x…

Cisco WLC 9800 - HA SSO with Ether-channel

本文将记录如何配置HA SSO以及Ethernet Channel。 1.拓扑情况 本文的内容基于如下的Topo进行。 2.准备工作 两台WLC的型号必须一样&#xff1b;两台WLC必须使用一样的软件版本&#xff1b;需要准备好使用的IP地址&#xff1a;两个用于WLC的管理地址&#xff08;WMI&#xff…

串口通讯编程示例之串口编写程序

使用open()函数打开串口设备 首先使用open()函数打开串口设备/dev/ttymxc6&#xff0c;设备使用了O_RDWR | O_NOCTTY | O_NDELAY标志&#xff0c;分别代表以读写方式打开、不让设备成为控制终端且设置非阻塞模式&#xff0c;也就是当无法打开设备时&#xff0c;不会在原地等待&…

【博客节选】Unity角色异常抖动问题排查

本文截取自本人文章 &#xff1a;【Unity实战笔记】第二一 基于状态模式的角色控制——以UnityChan为例 发现出现角色抖动问题 尝试解决方法&#xff1a; 跳跃的loop time不要勾选&#xff1b; 相机aim添加垂直阻尼 还是不行&#xff0c;仔细查看是位移时震颤。 UnityCha…

HCIP-HarmonyOS Application Developer 习题(十三)

&#xff08;多选&#xff09;1、在设计应用框架的过程中&#xff0c;我们常用的界面应用框架有哪些? A、启动页 B、详情页 C、列表视图 D、网格视图 答案&#xff1a;ABCD 分析&#xff1a; &#xff08;多选&#xff09;2、触摸屏以触控的方式进行输入。它可以支持以下哪些…

OpenIPC开源FPV之Ardupilot配置

OpenIPC开源FPV之Ardupilot配置 1. 源由2. 问题3. 分析3.1 MAVLINK_MSG_ID_RAW_IMU3.2 MAVLINK_MSG_ID_SYS_STATUS3.3 MAVLINK_MSG_ID_BATTERY_STATUS3.4 MAVLINK_MSG_ID_RC_CHANNELS_RAW3.5 MAVLINK_MSG_ID_GPS_RAW_INT3.6 MAVLINK_MSG_ID_VFR_HUD3.7 MAVLINK_MSG_ID_GLOBAL_P…

千万不要小看SD3.5!最强模型全家桶来了!

一、SD3.5 的登场 Stability AI 推出的 SD3.5 引起了广泛关注。它直接开源了三个模型&#xff0c;包括 Large 和 Large Turbo&#xff0c;Medium 将于 29 号发布&#xff0c;并且这三个型号都可以商用。 &#xff08;一&#xff09;模型版本介绍 模型版本参数量特点分辨率范围S…

《A complete telomere-to-telomere assembly of the maize genome》方法总结

研究背景 完整的T2T基因组组装一直是基因组研究的长期追求。 研究方法 通过生成高深度覆盖的超长 Oxford Nanopore Technology (ONT) 和 PacBio HiFi 测序数据&#xff0c;报道了玉米的完整基因组组装。 每条染色体均以单一contig的形式完整覆盖。 结果概述 基因组特征&am…

vue3中mitt和pinia的区别和主要用途,是否有可重合的部分?

在 Vue 中&#xff0c;Mitt 和 Pinia 是两个不同的工具&#xff0c;它们的主要用途和功能有所不同&#xff0c;但在某些方面也存在重合的部分。 区别 Mitt&#xff1a; Mitt 是一个简单而强大的事件总线库&#xff0c;用于在组件之间进行事件的发布和订阅。 它提供了一种简洁…

【Linux】实现一个简易的shell命令行

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:Ubuntu 22.04 server 64bit) 目录 一.项目简介 二.分析项目实现 三.逐步实现项目功能 1.获取命令行 2.解析命令行 3.指令的判断 4.普通命令的执行 四.完整项目代码 结语 一.项目简介…

计算生物学与生物信息学漫谈-1-测序一路走来

最近工作中&#xff0c;反思自己计算生物学基础非常薄弱&#xff0c;然而作为一门非常新兴的交叉学科&#xff0c;涉及计算机、物理、生物、数学等多多学科&#xff0c;国内并没有这样完善的教程&#xff0c;因此想要自己做一个教程&#xff0c;使用费曼学习法学习&#xff0c;…

【亚马逊云】基于 Amazon EKS 搭建开源向量数据库 Milvus

文章目录 一、先决条件1.1 安装AWS CLI ✅1.2 安装 EKS 相关工具✅1.3 创建 Amazon S3 存储桶✅1.4 创建 Amazon MSK 实例✅ 二、创建EKS集群三、创建 ebs-sc StorageClass四、安装 AWS Load Balancer Controller五、部署 Milvus 数据库5.1 添加 Milvus Helm 仓库5.2 配置 S3 作…