第 8 章 管线以及管线状态管理
第 8 章 管线以及管线状态管理
第 8 章 管线以及管线状态管理
在上一章中,我们理解了 Vulkan 中的缓冲区资源,并使用它在物理设备内存上以顶点缓冲区的形式存储几何图形数据信息。 我们实现了一个 Render Pass 和 framebuffer 对象。 此外,我们知道了 SPIR-V,这是 Vulkan 中指定着色器的一种新方法。 此外,我们使用 SPIR-V 工具库在编译时将 GLSL 着色器转换为 SPIR-V 中间语言。
之前学到的内容先告一段落,在这一章中, 我们将理解管线和管线状态管理的概念。 在本章中,我们会介绍一下 Vulkan API 支持的管线类型。 有两种类型的管线:计算和图形。 这些管线是使用管线缓存对象创建的,这是下一个主题。 在本章结束时,我们将实现图形管线,并彻底了解与之相关的管线状态的各种类型。.
在本章中,我们将涵盖以下主题:
- 管线入门
- 使用管线缓存对象 pipeline cache object(PCO)缓存管线对象
- 创建图形管线
- 了解计算管线
- Vulkan 中的管线状态对象
- 实现管线
管线入门
管线是指数据输入流经的一系列固定阶段;每个阶段都处理传入的数据并将其传递到下一个阶段。 最终产品或是一个 2D 栅格绘图图像(图形管线),或是 使用计算逻辑和计算操作(计算管线)更新后的资源(缓冲区或图像)。
Vulkan 支持两种类型的管线,即图形和计算。
- 图形管线:graphics pipeline,该管线通过命令缓冲区接收若干 Vulkan 命令并绘制 2D / 3D 场景的 2D 光栅化图像。
- 计算管线:compute pipeline,该管线通过命令缓冲区接收 Vulkan 命令并处理它们以进行相关的计算工作。
如下的图示(来自 Vulkan 官方规范(https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html#pipelines-block- diagram)显示了 Vulkan 图形管线和计算管线:
管线行程从 Input Assembler开始,输入的顶点数据根据指定的基本拓扑结构以点、线和三角形的形式进行组装。 使用顶点着色器 Vertex Shader可编程阶段,输入的顶点数据被转换到一个剪辑空间。 几何图形在Tessellation Control Shader和Tessellation Evaluation Shader装配器中进行细分。 几何图形着色器 Geometry Shader 具有从单个传入图元中生成多个图元的独特功能。
接下来,Primitive Assembler从前一阶段获取转换过的所有坐标,并按照输入阶段提供的指定绘图操作或原始类型(点,线和三角形)信息有序地对它们进行排列。 当关联的顶点坐标落在视景体之外时,图元就会被裁剪掉,当发生这种情况时,裁剪掉的片段(视野之外)会被丢弃。
栅格化 Rasterization 是将变换后的屏幕空间图元(点,线和三角形)转换为称之为片段的离散元素的过程。 这些片段由下一个阶段控制,称为片段着色器 Fragment Shader。 片段着色器在单个片段上执行计算。 这些片段最终会成为帧缓冲区的一部分,这个帧缓冲区全部经历了大量条件的更新,例如深度测试,模版测试和片段混合。
缓冲区和图像内存类型可以以 1D / 2D / 3D 工作组的形式 (称为计算管线)在一个单独的管线中进行处理。 计算管线在并行处理过程中完成工作的能力是非常强大的;它主要用于图像处理和物理计算领域。 计算管线可以修改(读取 / 写入)缓冲区和图像内存。
该管线大致由三个概念组成:管线状态对象,管线缓存对象和管线布局。 这些可用于有效控制底层管线的操作:
- 管线状态对象(PSO):Pipeline state objects (PSO),物理设备或 GPU 能够直接在硬件中执行多种操作。 这些操作可能包括光栅化器和条件更新,例如混合深度测试,模版测试等。 Vulkan 在 PSO 的帮助下提供了控制这些硬件设置的能力。 其他基于硬件的操作可能包括:在给定的几何形状上组装基本拓扑类型(点 / 线 / 三角形),视口控制等。
- 管线缓存对象(PCO):Pipeline cache objects (PCOs),管线缓存提供了更快地检索和重用存储过的管线的一种机制。 这为应用程序避免创建类似或重复的冗余管线对象提供了一个更好机会。
- 管线布局:Pipeline layouts,缓冲区和图像被间接连接到着色器,可以使用着色器资源变量对其进行访问。 资源变量被连接到缓冲区视图和图像视图, 这些资源变量通过描述符和描述符集布局进行管理。 在管线内,管线布局管理一系列的描述符集布局。
注意
描述符是存储的资源和着色器阶段之间的接口。 资源连接到由描述符集布局定义的逻辑布局绑定,并且管线布局提供对管线内描述符集的访问。 描述符会在第 10 章“描述符和 Push 常量”中详细介绍,我们还会在这里学习使用 uniform。
VulkanPipeline- 管线实现类
在本章中,我们将介绍一个名为 VulkanPipeline 的用户定义类。 该类会管理 Vulkan 应用程序的管线实现。 由于这个类要处理大量的管线状态管理对象,因此管线创建是性能关键点;因此,管线对象的可重用性是非常重要的。 Vulkan 管线通过 PCO 提供管线缓存机制。 这减少了创建类似管线的开销 - 驱动程序会寻找比较接近的匹配,并使用基本管线创建新管线。
管线的实现必须放置在绘制对象可以轻松访问 PCO 的集中位置,以提高管线可重用性。 为此,有两种选择:将 VulkanPipeline 类放置在 VulkanApplication 内(在应用程序级别,这可能是主线程)或 VulkanRenderer 内(用于每个独立的渲染线程)。 只要应用程序能够通过正确处理内存泄漏和线程同步合理地管理管线对象,那么这两个选项使用哪个都可以。 本书遵循后一个选项,因此我们将 VulkanPipeline 放置在 VulkanRenderer 中以避免线程的同步,使其对初学者来说更简单一些。
以下框图显示了一个图形视图,该视图表示应用程序系统与用户定义的 VulkanPipeline 类的集成:
以下是 VulkanPipeline 头文件(VulkanPipeline.h)的声明:
/************ VulkanPipeline.h ************/
class VulkanPipeline
{
public:
// Creates the pipeline cache object and stores pipeline object
void createPipelineCache();
http://www.taodudu.cc/news/show-6511296.html
相关文章:
- 从固定管线到可编程管线:十段代码入门OpenGL
- 智慧管廊数字管道建设整体技术方案2023(word)
- 综合管廊电气设计思路及分析
- unityURP管线学习+后处理
- URP管线全解析
- 管线基础简介
- 渲染管线流程【图示】
- 油气管线安装岗题库图
- 超图三维管线常见问题
- <Zhuuu_ZZ>HIVE(十一)函数
- 现在还有哪些好的站长论坛?
- 2007年个人站长必上网站推荐
- 浅谈新手站长在网站运营中如何去养站?
- 站长建站站群如何选择核心关键词
- 中国站长站 - 站长资讯 | 我们致力于为中文网站提供动力!
- 《Deep Spatio-Temporal Random Fields for Efficient Video Segmentation》论文阅读
- 多功能计算器1.0.4
- 多功能计算器1.0.3
- 多功能计算器1.0.5
- python考试怎么过_面试问题整理之python测试
- Python入门基础学习笔记
- 振动、位移、键相、转速、温度探头的安装要求及步骤
- 本特利传感器330901-00-24-05-02-05
- 链家房屋数据分析实战
- 【问答式的】
- 趣味问答
- 问答题
- 面试趣味问题
- 趣味题目(共4题)
- 趣味答题(杂)
第 8 章 管线以及管线状态管理相关推荐
- Opengl编程指南第二章:状态管理、几何绘图
//http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0 ...
- Vue中的Pinia状态管理工具 | 一篇文章教会你全部使用细节
文章目录 Pinia状态管理 Pinia和Vuex的对比 Pinia基本使用
- IA-32系统编程指南 - 第三章 保护模式的内存管理【1】
第三章 保护模式的内存管理[1] [作者:lion3875 原创文章 参考文献<Intel 64 and IA-32 system programming guide>] IA-32保护模 ...
- React组件设计实践总结05 - 状态管理
今天是 520,这是本系列最后一篇文章,主要涵盖 React 状态管理的相关方案. 前几篇文章在掘金首发基本石沉大海, 没什么阅读量. 可能是文章篇幅太长了?掘金值太低了? 还是错别字太多了? 后面静 ...
- Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理
Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...
- 手把手教你学Dapr - 5. 状态管理
介绍 使用状态管理,您的应用程序可以将数据作为键/值对存储在支持的状态存储中. 您的应用程序可以使用 Dapr 的状态管理 API 使用状态存储组件来保存和读取键/值对,如下图所示.例如,通过使用 H ...
- 面向.NET开发人员的Dapr——状态管理
目录: 面向.NET开发人员的Dapr--前言 面向.NET开发人员的Dapr--分布式世界 面向.NET开发人员的Dapr--俯瞰Dapr 面向.NET开发人员的Dapr--入门 面向.NET开发人 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理...
状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录: 一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr ...
- Vuex 状态管理的工作原理
Vuex 状态管理的工作原理 为什么要使用 Vuex 当我们使用 Vue.js 来开发一个单页应用时,经常会遇到一些组件间共享的数据或状态,或是需要通过 props 深层传递的一些数据.在应用规模较小 ...
最新文章
- 2017年9月11日 梁勇 java教材 编程练习题 第二章 2.15 键盘 读取两个点的坐标值(小数),控制台输出两点间距离。...
- python的优缺点-Python 有什么一般人不知道的缺点?
- 《信息存储与管理(第二版):数字信息的存储、管理和保护》—— 2.12 闪存盘简介...
- 10 个开发新人提及最多的 GitHub Repo
- 算法--生成可重集排列
- 记一次失败的RecycleView滑动定位
- 安装了Python2.X和Python3.X后Python2.X IDLE打不开解决办法总结
- wildfly access log 开启
- OLT忘记登陆密码如何修改
- 信息收集端口扫描工具masscan
- offsetWidth offsetHeight和clientWidth clientHeight的区别
- 开放共享:网商银行的运营探索及技术支撑
- 中文解释“GetLastError()返回值”---错误码大全
- 董明珠:没有人才,一切归零;没有道德,人才归零
- 服务器必备工具软件推荐
- WLGK-51单片机接口技术基础实验 —LED闪烁灯
- oracle 删除原有的数据,oracle数据库删除数据的两种方式
- 小老虎的微信公众号:iITObserve
- 门禁上的push是什么意思_门禁的NC、NO、COM、PUSH等一系列符号的含义是什么?
- 毕业设计-基于微信小程序的智能膳食分析系统