当前位置:网站首页>Vulkan与OpenGL对比——Vulkan的全新渲染架构
Vulkan与OpenGL对比——Vulkan的全新渲染架构
2022-07-30 17:39:00 【暮晓引流软件】
OpenGL是Khronos Group组织发布的跨平台图像渲染引擎。在这里科普一下Khronos组织,由Intel、Nvidia等公司共同创立,致力于创建开放标准的应用程序API。大名鼎鼎的OpenGL、OpenGL ES、WebGL、Vulkan都是来自Khronos。而vulkan称为“下一版本的OpenGL”,旨在提供更低的CPU开销和更多GPU控制。Android API 24以后支持vulkan,iOS在WWDC2014也推出Metal图像渲染。本文主要探讨Vulkan的全新渲染架构。
目录
八、Synchronization & Descriptor-Set
十、Multi-Thread & Thread Safety
一、OpenGL与Vulkan渲染架构
1、OpenGL渲染架构
OpenGL架构分为三层:应用层、驱动层、GPU层。OpenGL命令从应用层经过驱动层,再到GPU层处理;OpenGL资源从应用层经过驱动层(由图像管线状态机管理),再到GPU层的内存。OpenGL具体架构如下图所示:

2、Vulkan渲染架构
Vulkan架构也是分为三层:应用层、驱动层、GPU层。Command-Buffer从应用层经过驱动层,再到GPU层处理。Vulkan资源也是从应用层经过驱动层(由内存管理器管理),再到GPU层的内存。Vulkan具体架构如下图所示:

3、OpenGL与Vulkan互操作
OpenGL与Vulkan互操作包括如下步骤,如下图所示:
- 可供替代的WSI;
- 创建OpenGL上下文和通用操作;
- 创建Vulkan设备;
- 在OpenGL与Vulkan之间循环渲染;
- OpenGL与Vulkan混合渲染;

二、Vulkan Components
Vulkan组件包括:Memory、Image、ImageView、FrameBuffer、Sampler、Graphics pipiline、Descriptor-set、Command-buffer、Device等。各组件之间关系如下图所示:

从Image到ImageView,再到FrameBuffer,最终到达Render-Pass。其中FrameBuffer比OpenGL更简单、不需要为资源定义角色,Render-Pass真正为FrameBuffer定义角色、可以有多个Sub-Pass。具体示意图如下:

三、Graphics Pipeline
图像管线具有如下特点,如下图所示:
- 描述所有状态,包括着色器;
- 预编译;
- 在初始化时机完成;
- 防止渲染时过度校验;
- 某些渲染状态可以从中排除,变成动态状态;

此外,图像管线必须与着色器一致、没有内省。如下图所示:

四、Memory & Objects
1、Memory
Memory来自Heap堆内存。Memory分为Video和System两种形式,其中Video由rgb或rgba组成,而System主要由矩阵组成。Memory可以转化为Image。Memory关系图如下:

2、Objects
Objects对象包括以下特点,如下图所示:
- 引用数据缓冲区的Vulkan对象需要绑定内存;
- Vulkan设备暴露不同的内存堆;
- 这些堆有不同的内存类型;

五、Shaders
1、SPIR-V结构
SPIR-V全称Standard, Portable Intermediate Representation - V,是一种用于GPU通用计算的标准化中间语言。它的模块结构包括:rotate、lighting、vtx_main、frag_wood、frag_pastic、frag_metal等。它具有以下特征,具体如下图所示:
- 多个入口点:可以被定义在单个SPIR-V着色器模块;
- 防止重复代码:着色器模块使用多个图像管线;
- 允许共享代码片段;
- 更容易共享通用的着色器代码;

2、Vulkan读取GLSL
着色器具有如下图特点:
- Vulkan使用SPIR-V直接传递到驱动层;
- NVIDIA允许直接编译GLSL;
Vulkan读取GLSL过程如下图所示,可以通过VK_NV_glsl_shader直接读取GLSL,也可以经过glslang读取再转换为SPIR-V,最终到达Vulkan。

六、Image & ImageView
Image与ImageView有如下特点,如下图所示:
- Image代表所有类型的像素数组;
- 纹理:颜色或深度模板;
- 渲染目标:颜色或深度模板;
- 当ImageView需要特定格式时,需要正确暴露Images;
- 给着色器使用;
- 给帧缓冲区使用;

七、Buffer & Command-Buffer
1、Buffer
Buffer缓冲区具有如下特点,如下图所示:
- 用于不同场景,包括:索引/顶点缓存,统一缓存;
- Vulkan对象必须绑定到设备内存,可以被CPU访问与缓存,被GPU访问;

2、Command-Buffer
命令缓冲区具有如下特点,如下图所示:
- Vulkan可以渲染命令缓冲区数据;
- GPU大多数情况以FIFO形式获取;
- 可以被创建用于一个或多个子任务;
- 不能从GPU创建图形工作;
- 支持多线程;
- 主Cmd-buffer可以调用二级Cmd-buffer;

八、Synchronization & Descriptor-Set
1、Synchronization
同步方式有三种,如下图所示:
- 信号量;
- 事件和屏障;
- 栅栏;

2、Descriptor-Set
描述集具有如下特点,如下图所示:
- 每个描述集持有资源的引用;
- 描述集布局定义资源如何放置到描述集合中;
- 命令缓冲区可以高效绑定它们;
- 它们必须匹配着色器期望的每个阶段;

九、Resource Management

十、Multi-Thread & Thread Safety
1、Multi-Thread
Vulkan支持多线程渲染,每个线程由本地命令缓存池,具体如下图所示:

2、Thread Safety
命令缓存池是线程安全的,提供fence栅栏进行隔离,具体以下特点,如下图所示:
- 不能回收用于重写的命令缓冲区,直到它不再被使用;
- 不能刷新队列的每个帧;
- VkFences可以提供队列等待,当命令缓冲区准备被回收时;

参考文献:
边栏推荐
- LayaBox---TypeScript---类
- Excel导入和导出
- Error EPERM operation not permitted, mkdir 'Dsoftwarenodejsnode_cache_cacach Two solutions
- 测试行业干了5年,从只会点点点到了现在的测试开发,总算是证明了自己
- [HarekazeCTF2019] Avatar Uploader 1
- Google earth engine如何实现我们时间列表的排列和选取
- 游戏化产品搭建思路的拆解与探究
- 宽带射频放大器OA4SMM4(1)
- 基于亚马逊云科技无服务器服务快速搭建电商平台——性能篇
- un7.30:linux——如何在docker容器中安装MySQL?
猜你喜欢

S7-200SMART中定时器的使用方法和常见注意事项汇总

知识蒸馏1:基础原理讲解及yolov5项目实战介绍

JMeter笔记3 | JMeter安装和环境说明

Shell implementation based on stm32

Servo System of Hydraulic Steering Gear Based on Fuzzy PID

Error EPERM operation not permitted, mkdir 'Dsoftwarenodejsnode_cache_cacach Two solutions

Excel导入和导出

SQLServer下载与安装

论文阅读之《Underwater scene prior inspired deep underwater image and video Enhancement (UWCNN)》

Moralis去中心化Web3应用开发教程
随机推荐
Logback的使用
shell快速移植
C陷阱与缺陷 第6章 预处理器 6.3 宏并不是语句
Web 3.0入门教程
C# 连接SQL Sever 数据库与数据查询实例 数据仓库
数据库系统原理与应用教程(067)—— MySQL 练习题:操作题 82-89(十一):数据的增、删、改操作
高级语言垃圾回收思路和如何减少性能影响原理分析
游戏化产品搭建思路的拆解与探究
有效的括号字符串[贪心练习]
基于MATLAB的电力系统短路故障分析与仿真
Graph Attention Mechanism
C陷阱与缺陷 第6章 预处理器 6.2 宏并不是函数
X射线的应用是什么?
C语言向MySQL插入数据
ERROR 2003 (HY000) Can't connect to MySQL server on 'localhost3306' (10061)Solution
leetcode-684:冗余连接
Arranger software FL Studio Chinese version installation tutorial and switching language tutorial
C陷阱与缺陷 第7章 可移植性缺陷 7.2 标识符名称的限制
自动化早已不是那个自动化了,谈一谈自动化测试现状和自我感受……
Insert data into MySQL in C language