Hello Vulkan(一)| 图形渲染新技术教程总览


前言 
这几年音视频、直播应用呈现大爆发趋势,各类APP都会融入音视频相关技术,而其中美颜AR特效技术更是在各大平台掀起各类现象级的流行。随着元宇宙领域的爆火,基于视觉渲染的各类3D的XR应用如雨后春笋般应运而出,在这些酷炫的音视频和XR应用背后,离不开渲染技术,而渲染技术,你或许听过OpenGL,但现在有一项不得不提的新技术逐渐呈迅速上升态势 —— Vulkan。
 
Vulkan是一个跨平台的2D和3D渲染API,由Khronos Group在2014年开始提出,2016年顺利发布1.0版本。Vulkan最早被称为下一代OpenGL —— GLNext,但是因为和OpenGL不一样的是,设计时考虑了统一各平台的开发,而不是像OpenGL或者OpenGL ES,根据硬件性能区分不同版本,所以从这个角度出发,对于开发是一个极大的利好。
 
本系列内容将和大家一起来探讨,为什么Vulkan越来越受到开发者及企业,尤其是XR、游戏行业的青睐?未来渲染技术又将如何发展?以及虹图TexelJoy是怎么基于OpenGL、Vulkan进行提供产品服务,又将如何支持最新的渲染架构的?
 
疫情三年,音视频应用,如在线会议、在线教育、直播带货、音视频社交等等已经成为了现代人们生活中司空见惯的一部分,将常见的线下场景转至线上。在这些应用里,首先将数据流渲染到屏会设计渲染技术,更重要的是这些应用里对人像人体技术的应用,如美颜SDK特效的应用充分展现的渲染技术的价值和重要。
 
如果时间拨到2014年,也就是Vulkan项目还没有启动的时候,几乎所有的音视频应用刚开始萌芽,特效相机等AR应用刚开始成熟,但大家更多的聚焦在讨论特效有多么有创意,但随着4G到5G时代,越来越多的精细的模型、场景需要被渲染,焦点就从创意分散到创意+渲染效率。
 
在这5年多时间里,渲染技术的焦点转换又是如何一步一步实现的呢?
 
2016年前,主流的图形渲染API有OpenGL、OpenGL ES、DirectX、Metal等。OpenGL的应用领域较为广泛,支持多种操作系统平台(如Windows、UNIX、Linux、macOS等)。基于其开发的应用可以方便、低成本地在不同操作系统平台之间移植。既可以用于开发游戏,又可以用于开发工业、行业应用。OpenGL ES则是OpenGL针对移动端的裁剪版本。DirectX是微软针对Win系统下图形渲染的技术,Metal则是针对Mac/iOS系统下图形渲染技术,从占有率而言DirectX是远远超过Metal的。不难看出对跨平台有需求的应用,选择只有OpenGL/OpenGL ES。
 
那么OpenGL在和Vulkan相比,Vulkan能够更好的调动GPU的性能,OpenGL在使用GPU前需要CPU处理很多数据,而Vulkan能够提供更小的运行开销、更直接的GPU控制、和更低的CPU负载。
什么是
Vulkan
 
上面已经介绍了Vulkan是由Khronos Group发起的针对跨平台图形渲染的开源项目。最初名称叫GLNext,因此不难看出,这项技术最初是想取代OpenGL成为下一代渲染API的,但其实这是一个很大的误区。
由于Vulkan最初起源于AMD的Mantle API,深刻地受苹果Metal API和微软DirectX 12影响,因此让统一跨平台开发成为可能,大大降低了图形渲染跨平台的门槛,甚至比OpenGL还要方便,因为不需要根据不同性能、供电区分不同版本。
 

开发者为什么越来越多的使用Vulkan
“GPU的可编程性越来越强,越来越多的平台开始支持加速图形,计算,视觉和深度学习。灵活性和可移植性变得很重要。”
 
Vulkan解决了什么问题?
在没有Vulkan之前,OpenGL已经发展了25年以上,现在的GPU的性能越来越强,加上AI深度学习的迅速发展,性能上的要求越来越大,而OpenGL不能完全发挥现代CPU和GPU的性能优势。为了解决这些问题,行业对新一代GPU API就提出了更高的要求。
更简单的驱动复杂度和开销
上文已经提过,Vulkan提供更低的运行开销、更直接的GPU控制和较低的CPU负载。其通过批处理方式有效减少CPU的负载,将CPU从额外的运算和渲染中解放出来去执行其他的任务。
 
更少的用户操作难度
正是由于Vulkan本质上是AMD Mantle的后续版本,继承了前者强大的低开销架构,使开发人员能够方便全面地获取GPU与多核CPU的性能、功能和提升效率,开发者的操作难度被大大降低。
 
更高的单线程性能,支持多线程图形渲染
相比于OpenGL的面向CPU单核心设计,Vulkan原生支持多线程并发处理,能够更好地与当下普遍采用多核战略的CPU协同工作。同时在单线程工作下性能更强,也是源于它的低开销架构。
 
支持处理图块渲染
图块渲染Tiled rendering是一种在光学空间中通过规则的网格细分计算机图形图像并分别渲染网格(grid)或图块(tile)各部分的过程。优点在于减少了对内存和带宽的消耗,这使图块渲染系统的使用特别常见于低功耗硬件设备。而Vulkan对tiled rendering的支持,也使得在低功耗硬件设备的支持度更高。
 
Vulkan和OpenGL的对比
1. 更底层的指令必须由开发者在应用里提供,而不是驱动提供
在Vulkan里,GPU driver做更少的事情,把更多的控制权交给开发者,Vulkan强调的是开发者决定一切。Vulkan不会在驱动程序后台中做隐式的优化 "意图"。让程序员有更大空间去发挥,自由的调度流程和优化以及内存分配和释放。程序员需要自己去完成优化方案,而不是像传统的OpenGL API一样在驱动程序当中通过调用API模式来揣测并且推断所有操作的优化方法。
2. 坐标系是Y轴向下
OpenGL, OpenGL ES and WebGL: Y轴向上为正,(-1,-1)在左下角,Vulkan:Y轴向下为正,(-1,-1)在左上角。

3. 一些OpenGL声明即将弃用的部分被彻底弃用
OpenGL的内置管线转换、begin-end、fixed-function等被OpenGL一直宣称弃用的技术,在Vulkan中不再被支持。
4. 部分操作只可以在Shader做
Vulkan中开发者必须管理自己的操作,控制权由开发者掌握,但图形的移动、颜色、及纹理相关的功能,必须在着色器Shader中完成。并且Shader以一种半预处理的状态独立于应用之外,编译过程是在运行时建立管线流程时完成的。
5. 内存驱动架构不同
 
 
Vulkan的亮点
1. 命令缓冲区Command Buffers
Vulkan并不是使用函数调用来执行绘画或者内存转移等操作,而是保存这些操作到设置好的命令缓冲区中。这样绘画指令可以提前并且可以多线程执行。缓冲区以队列形式排布,当应用需要使用到时进行flush操作。每个命令缓冲区可以从不同线程填入。
 

2. Pipeline State Objects
Vulkan 使用基于对象的状态(称为描述符),允许应用程序提前预打包已使用状态的组合。编译后的管道对象结合了所有相关状态,允许更可预测地应用基于Shader的优化,从而降低运行时成本。这些更改的影响是显着降低了图形驱动程序的 CPU 开销,代价是要求应用程序预先确定它需要的状态,以便构建状态对象并从减少的开销中受益。
3. 更典型的总体框架图
关于Vulkan在这方面设计理念可以在管线Pipeline的设置当中体现。一个Pipeline包含了传统API中大部分的状态和属性。只不过Pipeline是需要事先创建好的,这样所有的状态组合的验证和编译都可以在初始化的时候完成,运行时不会再因为这些操作有任何性能上的浪费。                                                  

Vulkan
实战演练
Vulkan是跨平台图形渲染API一次大的提升,大大降低了跨平台开发门槛及提高了GPU的使用效率。
关于Vulkan的一些快速预览卡,可以参考:https://www.khronos.org/files/vulkan11-reference-guide.pdf
 

用Vulkan创建图形渲染的步骤:
1. Create the Vulkan Instance
2. Setup the Debug Callbacks
3. Create the Surface
4. List the Physical Devices
5. Pick the right Physical Device
6. Create the Logical Device
7. Create the Uniform Variable Buffers
8. Create the Vertex Data Buffers
9. Create the texture sampler
10. Create the texture images
11. Create the Swap Chain
12. Create the Depth and Stencil Images
13. Create the RenderPass
14. Create the Framebuffer(s)
15. Create the Descriptor Set Pool
16. Create the Command Buffer Pool
17. Create the Command Buffer(s)
18. Read the shaders
19. Create the Descriptor Set Layouts
20. Create and populate the Descriptor Sets
21. Create the Graphics Pipeline(s)
22. Update-Render-Update-Render- …
 
* 关于Vulkan的第一份使用示例可以供大家参考:
 
欢迎大家关注虹图AI开放平台公众号,后台回复“Sample2019.zip”获取。其中2019是使用Visual Studio的版本,不代表该示例程序编写的时间~
 
关于Vulkan以及图形渲染相关的实践内容,我们会在本系列后续内容中与大家分享。(虹图人像人体中美颜SDK部分是基于Vulkan进行开发封装的,性能极致,对开发者更加友好,十行之内完成一个简单的demo,点击【阅读原文】可查看详情。)
敬请期待~
到顶部