我们日常使用的设备基于不同的操作系统和硬件,比如我们在地铁上使用基于iOS的iPhone,在办公时我们会使用基于Linux或Windows操作系统的台式设备,现代的办公软件,娱乐应用甚至游戏都有跨平台的需求,旨在让用户在不同设备上获得相同的操作体验,从而提升用户粘性提高用户体验。
图形API(Application Programming Interface,图形应用程序接口)是应用层软件和渲染硬件层的桥梁,它经历了从固定功能管线到可编程管线的发展过程。

截止到目前,主要有四种主流的
图形API:
**OpenGL(Open Graphics Library):**历史最悠久的图形API,由SGI(Silicon Graphics)公司于1991年开发,1992年发布,1.0版本为固定功能管线,2.0开始引入可编程管线,优势为对于支持平台众多,从桌面平台到ES(Embedded System)版本支持嵌入式和移动平台,加上WebGL,OpenGL体系几乎实现了全平台支持,早期的跨平台游戏引擎(如Cocos)正是基于OpenGL实现了跨平台渲染的底层支持。2000年,一个由会员驱动的非营利性工业协会Khronos Group成立,这个组织由3Dlabs、ATI、英伟达和英特尔等企业共同创立,旨在制定免授权费的跨平台应用程序接口标准,OpenGL在这之后由该组织负责维护,在2008年发布了OpenGL 3.0版本,在2010年发布了 4.0版本,随着Khronos转向新一代图形API Vulkan,OpenGL已经不处于活跃的开发更新阶段,随着iOS在12版本后,已经把OpenGL标记为废弃技术。
DirectX(Direct eXtension **):**和OpenGL堪比一时瑜亮的图形API,但是和OpenGL的跨平台路线不同,DirectX专注于Windows平台,它由微软公司开发并维护,被广泛用于3D游戏的开发,和OpenGL不同,DirectX从设计伊始就采用底层可控的架构设计,减少 CPU 开销,充分发挥 GPU 性能,尤其在多线程渲染和大型场景渲染中优势明显,因此DirectX经常用于大型游戏的开发,同时它也是更现代的图形API。
**VulKan:**作为新一代底层可控架构图形API,于 2016 年由 Khronos Group 发布,由AMD Mantle演进而来,它试图在OpenGL和DirectX之间实现平衡,即同时获得底层可控的性能和功能优势和跨平台的支持,它的性能接近DirectX 12,它不仅支持桌面平台Windows和Linux等操作系统,还支持Android等移动平台,甚至通过MoltenVK(中间翻译层)在苹果设备上运行。
**Metal:**就如同再优秀的教师都无法同时兼顾班上最好的学生和后进生,OpenGL ES的性能瓶颈无法满足苹果设备的图形渲染需求,苹果公司自主研发并于2014年发布了专门针对苹果硬件打造的底层图形与计算 API-Metal,它同时兼顾底层可控性与开发效率,针对苹果 A 系列 和M 系列芯片的 GPU 架构(如 Apple GPU 的统一内存架构)进行定制化设计,提升开发效率的同时获得更优秀的渲染效果。
从图形应用程序接口的发展历史可以看到,因为硬件的不同,已经很难同时兼顾跨平台的开发效率和充分发挥硬件功能的渲染效果,如果想获得更好的效果,Windows上就要使用DirectX,iOS上就要使用Metal,随着图形应用程序接口的百家争鸣,对于跨平台渲染引擎的挑战出现了,于是RHI出现了。

RHI(Render Hardware Interface,渲染硬件接口)的概念最初由跨平台游戏引擎Unreal于Unreal 1.0时期提出,早期为了支持Glide和DirectX,引擎抽象出一层封装层,用于拉齐不同渲染底层驱动的差异,在Unreal 2.0-3.0时期,随着OpenGL和DirectX双雄并立,正式确立了RHI的地位,作为Unreal 渲染体系中非常基础且重要的模块,RHI用于实现不同DirectX版本间的兼容和切换,RHI成为了固定标准,随着现代底层可控图形接口的兴起,RHI从抽象层逐步转变为渲染资源管理,同时引入了渲染命令队列和命令缓冲等概念,实现多线程渲染,减少了CPU的开销。
跨平台GUI引擎Qt于Qt6正式添加了RHI,可以让GUI程序获得现代图形渲染API的原生效果和性能,由于GUI在渲染上更加简单,本着先难后易的原则,本教程计划从Qt开始,逐步通过代码学习和分析不同渲染引擎上RHI的设计和实现,试图得到设计RHI的最佳实践。
下一篇将从Qt6的源码开始,学习RHI