Vulkan 学习(1)---- Vulkan 基本概念和发展历史

news2024/11/24 17:57:09

目录

      • Vulkan及其演化史
      • Vulkan 基本概念
        • 基本术语
      • Vulkan 的原理
      • Vulkan应用程序
      • Vulkan的编程模型
        • 硬件初始化
        • 窗口展示表面
        • 资源设置
        • 流水线设置
          • 描述符和描述符缓冲池
          • 基于SPIR-V的着色器
          • 流水线管理
          • 指令的记录
          • 队列的提交

Vulkan及其演化史

目前主流的图形渲染API有OpenGLOpenGL ESDirectXMetal
OpenGL的应用领域较为广泛,支持多种操作系统平台(如Windows、UNIX、Linux、macOS等)基于其开发的应用可以方便、低成本地在不同操作系统平台之间移植。既可以用于开发游戏,又可以用于开发工业、行业应用
OpenGL-ES则是OpenGL针对移动端的裁剪版本。Direct-X是微软针对Win系统下图形渲染的技术,Metal则是针对Mac/iOS系统下图形渲染技术,从占有率而言DirectX是远远超过Metal的。
那么OpenGL在和Vulkan相比,Vulkan能够更好的调动GPU的性能,OpenGL在使用GPU前需要CPU处理很多数据,而Vulkan能够提供更小的运行开销、更直接的GPU控制、和更低的CPU负载。 Vulkan的原始概念是由AMD基于他们的私有的Mantle API设计和实现的,这个API几款不同的API中体现了自己的先进特性
Vulkan 发展历史

Vulkan 基本概念

基本术语
  • 物理设备(physical device)和设备(device)
    指的是物理设备在应用程序的中逻辑表示,一个计算机系统中可能包含多个物理设备

  • 队列(queue)
    队列是执行引擎(GPU)和物理设备之间的接口,一个物理设备总是包含一个或者多个队列(图形,计算,DMA/传输等),队列的职责是收集指令缓存并且分发到物理设备执行

  • 内存类型(memory type)
    广义上来讲有两种内存类型,设备内存和宿主内存,在后面会具体讨论

  • 指令(command)
    指令包含下面类型的指令:

  1. 动作指令(action command)
    包括绘制图元,清除表面,复制缓存,查询/时间戳操作,子通道的开始结束操作。这些指令可以修改帧缓存附件,读取或者写入内存,以及写入查询池

  2. 状态设置指令(set state command)
    这些指令可以用于绑定流水线,描述字集合以及缓存,或者设置一个动作状态,以及渲染通道,子通道的状态等等

  3. 同步指令(synchronization command)
    用于处理两个或者更多的动作指令同时发生的情况,此时的指令之间可能会产生争夺资源或者依赖于某些内存,该指令用于设置同步事件或者等待事件,插入流水线屏障对象,渲染通道子通道的依赖

  4. 指令缓存(command buffer)
    指令缓存是一组指令的集合,它可以记录多个指令并统一发送到队列中

Vulkan 的原理

支持Vulkan的系统可以直接查询系统信息,并返回可用的物理设备的数量。每个物理设备可以支持一个或者多个队列,这些队列被划分到不同的族群之中
每个族群都有自己的独特的功能设定,比如一个族群可能会支持图形,计算,数据传输,或者内存管理相关的内容。
队列族群每个成员可能包含一个或者多个相似的队列,因此它们之间相互是兼容的,比如: 在某个具体的驱动实现中,可能在同一个队列里同时支持数据传输和图形操作.
Vulkan允许用户显示在应用程序中管理和控制内存,它暴露了设备中所有支持的不同类型的内存堆(heap),每个堆属于一个不同的内存区域。
Vulkan的执行模型是非常简单和直接的,在这里指令缓存会被发送到队列中,后者将被物理设备按照顺序执行和消耗,Vulkan应用程序负责控制一组Vulkan设备,将一系列指令记录到指令缓存中,并发送到队列。驱动会读取队列并按照记录的顺序依次执行各个工作。
此外,有些指令缓存在应用程序中可以以多线程的方式并行同步的构建
下面是简化后的Vulkan执行模型:
Vulkan执行模型
这里应用程序记录了两个指令缓存,其中包含了多个指令,这些指令按照作业性质的不同,被传递给一个或者多个队列。
队列将这些缓存作业提交给设备加以执行,最后,设备处理得到结果,并将结果显示到输出设备,或者返回给设备做进一步的处理。
Vulkan中,应用程序主要负责下面的工作:

  • 生产指令执行所必须得先决内容
    包含资源的准备,着色器的预编译,将资源关联到着色器,设置着色器状态,构建流水线以及绘制调用等
  • 内存管理
  • 同步(宿主和设备之间,设备上的不同对列之间)
  • 风险管理

Vulkan应用程序

下图给出了 Vulkan 中的不同组件,以及不同组件在系统重的内部关系:
Vulkan应用程序
WSI: 窗口系统集成库是由khronos提供的一套功能扩展,可以将不同操作系统的展示层结合起来
SPIR-VSPIR-V提供了一套预编译的二进制数据格式,用来设置给Vulkan的着色器,不同的着色器源代码语言,比如 GLSLHSLS的各种变种,都可以通过预编译产生SPIR-V格式的数据
LunarG SDK:LunarG 提供了一套Vulkan的SDK,其中带有很多不同的资源和工具,可以辅助Vulkan程序的开发,这些工具和资源包括Vulkan的加载器,验证层,跟踪和回放工具。

Vulkan的编程模型

下图表示了Vulkan应用程序的编程模型自顶向下的实现过程:
应用程序编程模型

硬件初始化

加载器
加载器:加载器是一段应用程序启动时候执行的代码,可以用平台无关的方法定位Vulkan驱动
注入层:加载器允许在允许过程中随时注入不同类型的层,这样做的巨大好处是,驱动不需要做任何验证,
可注入的层实现的功能包括:

  • 跟踪Vulkan API指令的执行
  • 捕获渲染的场景,稍后在继续执行
  • 为了满足调试的需要,进行错误处理和验证
窗口展示表面

窗口展示层用于和当前系统的窗口系统进行链接
创建展示图像和创建窗口的工作和平台很相关,OpenGL中是通过底层平台进行链接的,窗口系统负责创建设备/环境以及对应的帧缓存
OpenGL不同的是,Vulkan在创建设备和环境时完全不需要包含一套窗口系统,这是通过WSI(Window System Intergration)完成的

WSI支持多个窗口系统,比如Waylad, Xwindows,它还支持通过交换链的方式实现窗口系统所有权的管理,也就是Double Buffer功能
WSI实现交换链需要下面的步骤实现:

  • 创建一个本地窗口
  • 创建WSI表面并且关联到窗口上
  • 创建交换链来显示表面
  • 从创建后的交换链中获取绘制的图像
资源设置

设置资源的含义是讲数据存储到内存区域中,数据可以是下面的类型:顶点属性比如位置,颜色或者图像类型/名称,数据是保存在内存中的,以便于Vulkan访问
OpenGL是通过隐式的方式管理场景背后的内存数据,不同的是Vulkan提供了一套底层接口来控制和管理内存,同时在物理设备上提供了不同类型的内存数据
Vulkan中的资源是应用程序显式进行管理的:

  1. 资源对象(Resource Object): 设置资源的时候,应用程序需要负责分配资源所用的内存,资源可以是图像也可以是缓存对象
  2. 分配(Allocation)和子分配(SubAllocation)
    创建了资源对象以后,我们只是关联了一个逻辑地址,并没有真正的物理地址可用,分配的过程就是分配物理地址并且将逻辑地址绑定到内存,完全的分配是很耗时的,
    子分配是一种高效的内存管理方式,它可以将物理内存的很大一部分立即分配完成并且存入不同的资源对象
    子分配是由应用程序负责完成的,下图给出了物理内存中实现对象子分配的流程:
    资源分配
    在资源设置阶段,应用程序需要完成的工作是:
  • 创建一个资源对象
  • 查询应用程序内存实例,创建一个内存对象,比如缓存或者图像
  • 获取对象分配相应的内存需求
  • 分配空间并且保存数据到其中
  • 将内存绑定到我们创建的资源对象上
流水线设置

流水线是指根据应用程序逻辑定义的一系列事件,他们按照固定的顺序执行。事件主要包含下面几种:设置着色器,绑定到资源,以及状态的管理
流水线

描述符和描述符缓冲池

描述符集合指的是资源和着色器之间的接口,可以将着色器绑定到资源,比如图像或者缓存,可以将资源内存关联或者绑定到准备使用的着色器的实例上

基于SPIR-V的着色器

SPIR-V着色器的特点包括:多重输入,离线编译,glslang 验证器和多重程序入口

流水线管理

物理设备需要定义发送的集合输入数据是如何进行解释和绘制的,这些状态的设置被统称为流水线状态
流水线状态包括光栅化状态,深度、模板状态此外还包括了输入几何数据的图元拓扑类型和渲染所用的着色器

指令的记录

指令的记录是逐渐构成指令缓存的过程。指令缓存是从指令缓存池中分配而来的。指令池可以用来同时分配多个指令缓存
应用程序定义了指令的开始和结束位置以后,就可以将指令记录到指令缓存之中
指令记录

图中描述的渲染过程如下:

  • 范围(scope): 记录了指令缓存记录的起始和截止位置
  • 渲染通道(render pass):
  • 流水线(pipeline): 包含了流水线对象用到的各种静态和动态的信息
  • 描述符(decriptor): 负责将资源信息绑定到流水线
  • 绑定资源(bind resource): 负责设置顶点缓存、图像几何相关的信息
  • 视口(view port): 绘制表面上可供执行图元渲染的部分矩形
  • 裁切器(scissor): 定义了一个矩形空间区域,舍弃这个区域之外的所有绘制信息
  • 绘制(drawing): 绘制指令将设置几何体的缓存属性,例如开始索引、总计数值等
队列的提交

Vulkan向应用程序暴露了不同类型的队列接口,比如:图形,DMA传输 或者计算队列
对列的执行需要下面的操作:

  • 从交换链中获取当前的图像,决定下一帧绘制所用的表面
  • 执行各种同步的机制,比如信号量,Fence等
  • 收集指令缓存,并且发布到对应的设备队列中,准备处理
  • 请求将输出设备中已经渲染完毕的图像显示出来

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

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

相关文章

Sequelize 操作 MySQL 数据库

安装 npm install --save sequelize安装驱动程序: npm install --save mysql2连接到数据库 要连接到数据库,必须创建一个 Sequelize 实例. 这可以通过将连接参数分别传递到 Sequelize 构造函数或通过传递一个连接 URI 来完成: const {Sequelize} re…

【Linux系统编程】文件系统

介绍: 文件系统是操作系统中负责管理和存储文件信息的软件结构,它组织和管理磁盘上的文件和目录,并定义了文件的存储结构。 Linux文件系统采用树状结构,只有一个根目录(用“/”表示),其中含有下…

C++ 函数高级——函数的默认参数

函数默认参数 在C中,函数的形参列表中的形参是可以有默认值的 语法:返回值类型 函数名 (参数 默认值){ } 示例: 正确代码: 运行结果:

黑马|最新AI+若依 |初识项目

本章主要内容是: 1.快速搭建了若依前后端项目在本地 2.实现了单表的增删改查快速生成 文章目录 介绍1.若依介绍2.若依的不同版本3.项目运行环境 初始化前后端项目1.下载若依项目2.初始化后端a.把表导入到数据库中b.更改application.yml文件 3.初始化前端a.安装依赖…

java集合(2)

目录 一. Map接口下的实现类 1. HashMap 1.1 HashMap常用方法 2. TreeMap 2.1 TreeMap常用方法 3. Hashtable 3.1 Hashtable常用方法 4.Map集合的遍历 4.1 根据键找值 4.2 利用map中的entrySet()方法 二.Collections类 1.Collections类中的常用方法 三. 泛型 1. 为什…

大连外贸建站公司wordpress主题模板

Robonaut萝卜纳特WP外贸站模板 适合用于工业机器人公司出口做外贸搭建公司官方网站使用的WordPress模板。 https://www.jianzhanpress.com/?p7091 优衣裳WordPress外贸建站模板 简洁的wordpress外贸独立站模板,适合服装、衣服、制衣外贸公司搭建公司官方网站使用…

shark云原生-日志体系-filebeat高级配置(适用于生产)-更新中

文章目录 1. filebeat.inputs 静态日志收集器2. filebeat.autodiscover 自动发现2.1. autodiscover 和 inputs2.2. 如何配置生效2.3. Providers 提供者2.4. Providers kubernetes2.5. 配置 templates2.5.1. kubernetes 自动发现事件中的变量字段2.5.2 配置 templates 2.6. 基于…

人工智能系列-Pandas基础

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” Pandas简介 Pandas是Python语言的拓展程序库,用于数据分析。 Pandas是一个开放源码,BSD许可的库,提供高性能,易于使用的数据结…

vuepress创建步骤

背景 记录vuepress配置步骤,以便下次使用快速上手。 读此文章之前默认您已经学会了创建vuepress项目。vuepres快速开始 最终成品 doc.jeecgflow.com 配置步骤 创建.vuepress 目录。 你的文档目录下创建一个 .vuepress 目录。 创建.vuepress/config.js module.e…

【IMU】 确定性误差与IMU_TK标定原理

1、确定性误差 MEMS IMU确定性误差模型 K 为比例因子误差 误差来源:器件的输出往往为脉冲值或模数转换得到的值,需要乘以一个刻度系数才能转换成角速度或加速度值,若该系数不准,便存在刻度系数误差。 T 为交轴耦合误差 误差来源:如下图,b坐标系是正交的imu坐标系,s坐标系的三…

spring-ai 下载不了依赖spring-ai-openai-spring-boot-starter

第1坑:配置第三方仓库不生效, 提示在阿里云仓库没有找到 spring-ai-openai-spring-boot-starter 第2坑:升级jdk17后,springboot项目启动报错 Internal error (java.lang.reflect.InaccessibleObjectException): Unable to make pr…

第10章:网络与信息安全

目录 第10章:网络与信息安全 网络概述 计算机网络概念 计算机网络的分类 网络的拓扑结构 ISO/OSI网络体系结构 网络互联硬件 物理层互联设备 数据链路层互联设备 网络层互联设备 应用层互联设备 网络的协议与标准 网络标准 TCP/IP协议族 网络接口层协…

【若依前后端分离】通过输入用户编号自动带出部门名称(部门树)

一、部门树 使用 <treeselect v-model"form.deptId" :options"deptOptions" :show-count"true" placeholder"请选择归属部门"/> <el-col :span"12"><el-form-item label"归属部门" prop"dept…

C++ 什么是虚函数?什么是纯虚函数,以及区别?(通俗易懂)

&#x1f4da; 当谈到虚函数时&#xff0c;通常是指在面向对象编程中的一种机制&#xff0c;它允许在派生类中重写基类的函数&#xff0c;并且能够通过基类指针或引用调用派生类中的函数。 目录 前言 &#x1f525; 虚函数 &#x1f525; 纯虚函数 &#x1f525; 两者区别…

IntelliJ IDEA教育版在Windows电脑中的下载、安装方法

本文介绍IntelliJ IDEA软件Community&#xff08;社区版&#xff09;在Windows操作系统中的下载、安装、运行与使用方法。 IntelliJ IDEA软件是一款由JetBrains公司开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Java语言的开发&#xff0c;但同时也支持其…

win7系统快速安装python

下载安装包 建议选择python3.8左右的&#xff0c;我下载的是3.7.8&#xff0c;最新版本的pythonwin7可能不支持 python网址 下拉寻找 安装python 1.双击安装包 更换完地址选择安装(install) 安装完成后点击close即可 测试是否安装成功 1.winr快捷键打开黑窗口输入cmd …

【Linux】线程(轻量级进程)

目录 一、线程概念 二、线程特性 2.1 进程更加轻量化 2.2 线程的优点 2.3 线程的缺点 2.4 线程的异常 2.5 线程用途 三、进程和线程 四、线程控制 4.1 包含线程的编译链接 4.2 创建线程 4.3 获得线程自身的ID 4.4 线程终止 4.5 线程等待 4.6 线程分离 4.6 线程…

Redis官方可视化管理工具

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl RedisInsight是一个Redis可视化工具&#xff0c;提供设计、开发和优化 Redis 应用程序的功能。RedisInsight分为免费的社区版和一个付费的企业版&#xff0c;免费版具有基本…

thingsboard v3.7 win编译相关问题记录

遇到的问题总结 node\yarn 相关版本问题 3.7 开始需要 JDK17 ui-ngx 模块 yarn 相关问题报错 报错信息 [INFO] Downloading https://github.com/yarnpkg/yarn/releases/download/v1.22.10/yarn-v1.22.10.tar.gz to D:\soft\maven\com\github\eirslett\yarn\1.22.10\yarn-1.2…

ASP.NET Core----基础学习04----Model模型的创建 服务的注入

文章目录 1. 创建Models文件夹&#xff0c;3个文件的内容如下&#xff1a;&#xff08;1&#xff09;模型的创建&#xff08;2&#xff09;服务的注入 1. 创建Models文件夹&#xff0c;3个文件的内容如下&#xff1a; &#xff08;1&#xff09;模型的创建 模型的基础类Student…