Vulkan 总结

news2024/12/23 18:30:33

一、Vulkan 对象简介

1、VKInstance 这个对象是我们 Vulkan api 的一个对象,用于通过 Instance 我们与 Vulkan 底层进行交互。

2、VkPhysicalDevice 对应我们当前设备(PC、手机)的一个显卡硬件(GPU ),有的设备有多个显卡那么我们就能获得多个 VkPhysicalDevice 对象,这时候我们需要按自己的需求去选择最适合我们渲染需要的 GPU 了。

3、VKDevice 我们称之为 逻辑设备,是用来和 VkPhysicalDevice GPU硬件交互的一个对象。

4、Queue、QueueFamily 在逻辑设备上,我们有多种提交 渲染命令的队列类型、Graphic (图形绘制)、Compute(计算)、Transfer(传输) 、SparseBinding(还不太了解),在Vulkan 中一个Queue 只能在一个线程中操作,多个线程需要分别分配多个Queue 使用,提交,queue中提交的命令只能保证按提交顺序开始执行,然后不保证每个命令的执行结束的顺序,所以如果有相互依赖的需要自己通过同步源语 Semaphore、Barrier、Fence 等控制。

5、VKSurfaceKHR 用于渲染的窗口表面,通过我们创建的 window 创建。在构建交换链的时候需要一个窗口表面VKSurfaceKHR

6、Sswapchain 为了我们图像呈现的一个缓冲对象,OpenGL 是内置了两个交换缓冲区的方案,而Vulkan 对这个交互缓冲对象给我更多的定制细节,比如 我们可以选择生成更多的绘制缓冲区 (swap image), 也能选择我们我们缓冲区交换呈现的方式 VkPresentModeKHR。

7、Pipeline 渲染管线对象,这个对象构成比较复杂,包含了 管线各个阶段的着色器对象,各个阶段的管线状态模式,比如 rasterizer(光栅化状态)、depth stencil (深度模板状态)、blend (颜色融合状态)、mutile state(多重采样状态,这个是Vulkan特有的状态,OpenGL 不能直接在管线状态层设置多重采样,只能全局设置开启),另外就是 PipelineLayout、RenderPass

8、RenderPass 这个概念是一个比较复杂的对象,在我们复杂的绘制过程成,我们会画多幅画,然后相互之间可能会有引用关系,比如绘制阴影的时候,我们需要先绘制一遍获得一个深度图,然后通过深度图作为输入,再绘制物体,绘制物体的时候通过深度图计算最终的颜色。这里一个绘制过程我们称之为一个SubPass。RenderPass 就是用来组织这多个 SubPass 用的,他告诉渲染管线,我有几个纹理附件(image)有几次绘制过程(几个Subpass),他们之间是一个什么样的依赖关系。

9、PipelineLayout 是用来描述,在渲染管线中,我们需要的 uniform、定点输入信息、采样纹理等信息有哪些,并且他们是怎么布局的,这样底层shader 绘制的时候直接按照 这个布局去取信息即可。为了细分这些信息,PipelineLayout 又分出了 DescriptorSetLayout 把信息又分成一堆一堆的的。一个 DescriptorSetLayout 描述了一组信息的布局,然后有了 DescriptorSetLayout 那肯定就有对应的DescriptorSet,这个DesciptorSet 代表了它维护的信息和我们的 Buffer、Image怎么映射。DescriptorSet 由于是可复用对象,所以又有一个 DescriptorSetPool 方便复用.

10、CommandBuffer 用于收集渲染指令用的对象,因为Vulkan 的渲染需要通过收集一系列的命令然后通过 Queue 提交给硬件去执行的。同样CommandBuffer 也是可复用的,所以他也有个 CommandPool 的对象管理。

11、Semaphore、 Fence 由于Vulkan 是支持多线程渲染的。所以需要同步对象,其中 Semaphore 主要用于 GPU 内部直接的同步使用,Fence 主要通过 app 层和 GPU 进行同步,此外在 GPU 内还有一个叫 Barrier 的东西,可以达到GPU 内部的同步,他和 Semaphore 不同的是它更细致话,可以控制,Buffer、Image 在管线哪个状态的时候需要等待 Buffer\Image 需要达到什么状态才能进入到另一个管线状态。

12、Buffer 是vulkan 中的资源对象,是一个 数据段。存放 顶点数据、uniform buffer 数据等。Vulkan中Buffer 是可以设置各种属性的,比如 GPU、CPU 中的可见性、buffer 的连贯性等。通过这些细节,我们可以根据我们自己的需求设置,从而是buffer 更高效的使用

13、Image、ImageView、Sampler, Image也是一个资源对象,主要是同于存储纹理贴图信息。ImageVIew 是 Image 的使用助手,告诉使用 Image的对象,如何访问Image 中的数据,比如我通过ImageView 设置访问 Image 中模块区域给其他对象使用(有点类似自图集)。
14、FrameBuffer 这个和OpenGL 有点类似,只是Vulkan FrameBuffer 需要对应一个RenderPass。

遇到的问题

1、由于 Vulkan 对各种资源的使用都会有一个助手对象,详细描述了资源的格式布局等,只要对应不上都会异常并报错,所以一定要在开发阶段开启 VK_LAYER_KHRONOS_validation 并注册 VkDebugUtilsMessengerEXT 对象,监听异常消息的回调。即使在报错的地方触发回调回来,方便定位问题所在。没有这个找问题大海捞针的难。

2、Vulkan 底层是 惰性检查,也就是他都是想当然的(估计为了底层性能)。所以他如果对象是定义了顺序id 的你传递给他一定要排序。否则它就是告诉你不对。比如,PipelineLayout 中的DescriptorSetLayout 每个 set 都有一个 index, 那你的 DescriptorSetLayout 这个数组对象,一定要按Set index 排序。否则就有问题,还有 DescriptorSet 里面的 DescritporSetBinding 也是有顺序的也要排好序。

3、vulkan 和 NDC y 轴坐标 是 从上往下的,而OpenGL 是从下往上的。如果做gfx 推荐看这篇文章https://zhuanlan.zhihu.com/p/574067652

4、如果 你的 Image 是设置了 miplevels 的那你一定要记得 自己生成 mipmaps texture,否则 mipmap texture 就是黑的。导致3d 模型根据远近选择不同的 mipmap texture 采样,然后除了 level 1 正常,其他都是黑的。最终你的模型结果就是
在这里插入图片描述
这里整个模型出现很多黑色的地方,这个问题困扰了我很长时间,开RenderDoc 各种检查管线状态,各种怀疑,最终才发现是忘记 generate mipmaps 了。

学习曲线

1、vulkan 入门 https://vulkan-tutorial.com/ 看这个网址,看完一遍,然后把demo 抄了一遍。这里主要是对 vulkan 的各种概念有所有了解,通过简单的demo 来掌握各种对象的使用。
2、https://github.com/KhronosGroup/Vulkan-Samples 这个是 vulkan 官方提供的demo,里面有一套简单的 vulkan api的封装,当你想封装自己的 gfx 时候看这个你会收获很大,而且里面对于多线程渲染等复杂的vulkan 使用,都有demo 代码,非常推荐看。
3、看到的不错文章收集
3.1 https://www.zhihu.com/question/424430509/answer/2223623107
3.2 https://zhuanlan.zhihu.com/p/574067652
3.3 https://www.zhihu.com/question/28024422/answer/2312781266

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

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

相关文章

如何导出cloudflare warp内部存的私钥和token

结论:管理员身份运行 mimikatz:https://github.com/gentilkiwi/mimikatz/releases/tag/2.2.0-20220919 然后输入: privilege::debug (提升权限到:NT-AUTHORITY\SYSTEM)以及sekurlsa::credman 就能看到&…

Java中的反射(通过反射获取类的结构、invoke方法、获取注解)

文章目录 1. 创建运行时类的对象2. 获取运行时类的完整结构2.1 相关API2.2 获取所有的属性及相关细节2.3 获取所有的方法及相关细节2.4 获取其他结构(构造器、父类、接口、包、注解等)2.5 获取泛型父类信息2.6 获取内部类或外部类信息2.7 总 结 3. 调用运行时类的指定结构3.1 调…

HDOJ 1022 Train Problem Ⅰ 模拟栈操作

🍑 OJ专栏 🍑 HDOJ 1022 Train Problem Ⅰ 输入 3 123 321 3 123 312输出 Yes. in in in out out out FINISH No. FINISH🍑 思路 🍤 栈顶元素与目标元素不匹配就进栈,匹配就出栈 🍤 匹配完:y…

es 7.0.8 常用操作(windwos版本安装,索引crud操作)

一 es7.x的核心 1.1 es的核心概念 1.ES 里的 Index 可以看做一个库(名称必须为小写),而 Types 相当于表,Documents 则相当于表的行。 2.这里 Types 的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index 下已经只能包含一个…

分布式搜索引擎——elasticsearch搜索功能

DSL查询语法 DSL Query的分类 Elasticsearch提供了基于JSON的DSL (Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如:match_all全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排…

Java 基础进阶篇(九)—— Java集合详细总结

文章目录 一、集合类体系结构二、Collection系列集合2.1 Collection 集合体系2.2 Collection 集合体系特点2.3 Collection 常用API2.4 Collection 集合的遍历方式2.4.1 方式一:迭代器2.4.2 方式二:foreach(增强for循环)2.4.3 方式…

Java8新特性—Optional类

前言 Java 8中引入了一个新的Optional类,它可以让开发人员更好地处理可能为空的值。Optional类提供了一种方式,可以更加优雅地处理null值,并在运行时避免NullPointerException异常的出现。本文将介绍Optional类的基本语法、使用场景和示例。…

Java 基础进阶篇(十)—— 泛型与可变参数

文章目录 一、泛型概述二、泛型的定义2.1 泛型类2.2 泛型方法2.3 泛型接口 三、泛型深入3.1 泛型通配符3.2 泛型上下限3.3 案例:定义一个 “所有车量进行比赛” 的方法 四、可变参数 一、泛型概述 泛型是 JDK5 中引入的特性,可以在编译阶段约束操作的数…

Linux应用开发:进程间通信 System V

目录 1、查看删除IPC对象 1.1 IPC对象 1.2 ipcs 命令查看系统中的 IPC 对象 1.3 ipcrm 命令删除系统中的 IPC 对象 2、共享内存 2.1 共享内存简介 2.2 共享内存相关API 2.2.1 shmget:创建共享内存 2.2.2 shmat:映射共享内存 2.2.3 shmdt&#…

A40i使用笔记:安装python3.7(素装)

一、前言 项目需求,要用到python3以上,就研究了一下如何安装python,这里也是分享出来安装方法,为各位技术研发人员减少不必要的时间损耗 本文没有安装python其他依赖库,因为我也是在摸索中,所以只限指导到…

「程序员的浪漫」使用 Html、Css、JavaScript 实现 DIY 生日祝福页面 快发给你的朋友吧

前言 从网上搜集整理修改的好用网页生日祝福版本 特点 将三剑客放进一个 Html 文件 点开即用封装好 修改几个参数就可以 DIYDIY 的地方有注释 预览 …省略几张图 源码 有用的话点个 star 不迷路谢谢!https://github.com/yangzi0210/Happy-birthday-page

领先的项目协作管理软件OpenProject

本文软件由网友 不长到一百四誓不改名 推荐; 什么是 OpenProject ? OpenProject 是一个开源、基于 Web 的项目管理系统,提供了免费的社区版和收费的企业版。OpenProject 拥有完善的文档,API,及丰富的功能,可…

SlickEdit for Windows and Linux crack

SlickEdit for Windows and Linux crack 现在可以在“新建注释”对话框中对颜色进行排序,使调色板中的颜色阵列看起来更符合逻辑。 在拆分或扩展行注释时添加了撤消步骤,这样您只需点击“撤消”一次即可撤消行注释扩展。 已更新VHDL颜色编码,…

【网络】- 计算机网络体系结构 - OSI七层模型、TCP/IP四层(五层)协议

目录 一、概述 二、计算机网络体系结构的形成  👉2.1 分层的网络体系结构  👉2.2 OSI 参考模型  👉2.3 TCP/IP - 事实的国际标准 三、OSI 参考模型 四、TCP/IP 协议 一、概述 但凡学习计算机网络知识,肯定绕不过网络协议的&…

Java 基础进阶篇(八)—— 常用 API

文章目录 一、Object 类二、Objects 工具类三、Math 类四、System 类五、BigDecimal 类 一、Object 类 一个类要么默认继承了 Object 类,要么间接继承了 Object 类,Object 类是 java 中的祖宗类。Object 类的方法是一切子类都可以直接使用的。 因此&…

7.4 电子信息系统预处理中所用放大电路

在电子信息系统中,通过传感器或其它途径所采集的信号往往很小,不能直接进行运算、滤波等处理,必须进行放大。 一、仪表放大器 集成仪表放大器,也称为精密放大器,用于弱信号放大。 1、仪表放大器的特点 在测量系统中…

Binder“一次拷贝“你真懂吗?

前言 谈到到Binder相对于其他传统进程间通信方式的优点的时候,我们总会说Binder只需要做“一次拷贝”就行了,而其他传统方式需要“两次拷贝”。这确实是Binder的优点,但再进一步思考就会碰到两个问题: 这所谓的“一次拷贝”到底…

回溯算法简单介绍

目录 1.回溯算法简单介绍 2.回溯算法框架: 我们用一道题来详细讲解回溯算法的过程 3.全排列问题 1.回溯算法简单介绍 解决一个回溯问题,其实就是一个决策树的遍历过程,我们只需要思考三个问题: 1.路径:就是已经做出…

一起Talk Android吧(第五百四十二回:无进度值ProgressBar)

文章目录 概念介绍使用资源文件实现使用默认设置修改风格使用动画资源 使用代码实现经验总结 各位看官们大家好,上一回中咱们说的例子是"ProgressBar总结",本章回中介绍的例子是" 无进度值ProgressBar"。闲话休提,言归正转&#xf…

linux相关操作

1 系统调用 通过strace直接看程序运行过程中的系统调用情况 其中每一行为一个systemcall ,调用write系统调用将内容最终输出。 无论什么编程语言都必须通过系统调用向内核发起请求。 sar查看进程分别在用户模式和内核模式下的运行时间占比情况, ALL显…