3D游戏图形API简史

什么是图形API

我们常听到的OpenGL、DirectX、Metal等都属于图形API,它的本质是一整套编程接口,用来将应用程序与显卡驱动联系起来。有了图形API我们可以仅仅调用它的函数来更改渲染状态、缓存顶点数据、开始绘制等等,而如果没有它,我们就需要直接调用显卡驱动的接口来进行渲染,这会涉及到非常多的硬件接口,例如对寄存器的操作,相当繁琐。一般来说我们都不会希望在渲染的同时还要去关注对硬件的控制。

硬件显卡厂商例如NIVIDIA、AMD,他们如果要和图形API合作往往就需要在显卡驱动去实现这些API。正如前面所说,图形API本身只是一套接口并没有实现代码,只有显卡驱动实现了这些API后,这个显卡才可以支持这些图形API。

LowLevel的图形API一般会开放出更多与内存管理相关的接口给开发者,但这需要更细致的管理,使用得当可以显著降低CPU的开销。例如Vulkan、Metal便属于这种。

OpenGL的发展

OpenGL在1992年由SGI(Silicon Graphics Inc)发布,是应用于CAD、VR和游戏等领域的跨平台图形API,基于不同平台可能会有衍生的API,例如WebGL、OpenGL ES等。在2006年后,由非盈利团队Khronos维护,这个团队涵盖了显卡商、操作系统商还有浏览器商等,意在创建免费开放的跨平台API。

它最初是作为Iris GL的一个替代品而出现的。Iris GL是SGI的专用图形API,由于它有一些与3D图形无关的API以及一些专利等原因,不适合作为行业的广泛标准,于是SGI编写了OpenGL 1.0规范。在之后,每隔一段时间OpenGL便会出现新的增量更新。

1992年,SGI发布了OpenGL 1.0。
2003年7月,OpenGL ES 1.0发布,它是专为手机、平板电脑、游戏主机等嵌入式系统设计的一个OpenGL API子集。
2004年9月,SGI发布了OpenGL 2.0,这其中就有GLSL 1.0(OpenGL Shading Language)的面世,这是一种类C语言,可以用它对固定管线的顶点/片段着色器进行编程。与之相伴的还支持了MRT(Multiple render targets)和NPOT(Non-power-of-two textures)。
2006年7月,OpenGL API规范的控制权转交给Khronos团队。
2008年8月,OpenGL 3.0发布,支持FBO(Framebuffer Objects)以及VAO(Vertex Array Objects)等多个功能,同时支持了非常多的特性,从这版开始OpenGL支持向后兼容。
2009年8月,OpenGL 3.2发布,从这个版本开始,OpenGL官方文档废弃了固定渲染管线,发布了核心模式(Core Profile),这种模式的灵活性与效率更高,之后至今迭代也都是基于这个核心架构这个版本也增加了新的着色器阶段:几何着色器。
2010年3月,OpenGL 3.3和OpenGL 4.0一起发布,带来了新的标准规范,自此之后GLSL的版本号与OpenGL版本号保持一致,即GLSL 3.3/4.0。同时新增了曲面细分着色器。
2017年7月,OpenGL 4.6发布,这也是至今最新的版本。
2018年6月,苹果在所有平台上弃用OpenGL(其实也就是不维护了),鼓励开发者使用他们专有的Metal(这时候Metal已经发布几年了)。这可能使得开发者为了兼容多平台不得不使用好几种语言GLSL/HLSL/MSL。

Vulkan的发展

Vulkan于Khronos在GDC 2015上首次公开,它的也曾被叫做是“Next Generation OpenGL Initiative”(glNext),旨在对OpenGL和OpenGL ES的一次重新设计,将两者统一到一个API中。

与OpenGL相同它也是一个跨平台的2D、3D图形API,不同的是它是一个Low Level图形API,即会开放出更多与内存控制相关的接口。此外它还能较好的支持多线程并行(OpenGL4.0+是为单线程设计的),这使得它的操作和维护比OpenGL复杂得多。另外OpenGL使用GLSL来编写着色器,每个显卡商需要为GLSL单独编写编译器来转换为在显卡上运行的机器码,在这点上Vulkan不同,它会先由操作系统把GLSL预编译为一种名为SPIR-V(Standard Portable Intermediate Representation)的中间码,再由显卡商编写Vulkan驱动程序对GPU进行一些特定的优化,加载速度变快了还节省了显卡商的开发及维护成本。这和Direct3D的HLSL预编译很像。
2016年2月,Vulkan 1.0发布。
2018年2月,Khronos发布MoltenVK,可以理解为MoltenVK是用Metal实现了Vulkan的API,这使得macOS和iOS也能支持Vulkan了。虽然绕了趟远路,但从Dota2的表现上来看,依旧比OpenGL高出了50%的帧率。
2018年3月,Khronos和GPUOpen公开V-EZ项目,它是“Easy Mode”的缩写,是一个基于Vulkan的中间层,相比于Vulkan它保留了Vulkan的大部分API,提供了更简单的内存管理API,封装了诸多底层细节。旨在开发者更容易上手Vulkan。
2018年3月,Vulkan 1.1发布。支持了HLSL语法以及光线追踪。可以更好的模拟DirectX 12。spirv更新至1.3。
2020年1月,Vulkan 1.2发布。新增了23项扩展以及更好的支持HLSL。

Direct3D的发展

Direct3D是用于微软应用程序的3D图形API,是DirectX中的3D图形API(DirectX是微软平台上处理与多媒体相关的API合集)。使用HLSL语言编写着色器。

1996年6月,第一版Direct3D 2.0跟随DirectX 2.0发布,有"retained mode"和"immediate mode"。
1998年8月,Direct3D 6.0发布,增加了许多新特性,如multitexture、模板缓冲区等。
1999年,Direct3D 7.0支持了T&L硬件加速
2000年11月,Direct3D 8.0发布,引进了可编程管道概念,新增了顶点/片段着色器,这个时候Direct3D完全超越了OpenGL。
2002年12月,Direct3D 9.0发布,发布了Shader Model 2.0。支持浮点纹理格式、MRT(Multiple render targets),9.0是最后一个支持WindowsXP的版本。
2006年11月,Direct3D 10.0发布,仅支持Windows Vista以上操作系统。固定功能管线被淘汰,取而代之的是可编程渲染管线。新增了几何着色器阶段,发布了Shader Model 4.0。
2009年7月,Direct3D 11.0与Windows7一块被发布,Direct3D 11.0新增了曲面细分着色器和Computer Shader,支持了多线程处理技术,发布了Shader Model 5.0。

  • Shader Model提升到5.0,采用面向对象的概念,并且可以完全支持双精度数据;
  • Tessellation曲面细分技术获得微软正式支持,逐渐走向成熟;
  • Multithreading多线程处理;
  • 提出Compute Shader通用计算概念,可以直接把GPU当做并行处理器来用;
  • 新的Texture Compression纹理压缩方案,在画质损失极小的环境下带来了硬件资源的节约。
    两种新的压缩算法:BC6和BC7,BC6是专门针对HDR图像设计的压缩算法,压缩比为6:1,BC7是专门为LDR(低动态范围)图像设计的压缩算法,压缩比为3:1。
    2015年1月,Direct3D 12.0包含在Windows10一块被发布,更好支持多核心、多线程的优化,降低GPU处理瓶颈,并提升硬件功耗表现。简化了Direct3D 11中的管道状态对象(Pipeline state objects)。在很多
    2018年10月,发布了Direct3D 12光线追踪DirectX Raytracing (DXR)的扩展包。

Metal

Metal是一款Low Level、Low Overhead的3D图形API,由苹果公司开发,并在2014年6月随iOS8公开。相比于OpenGL,Metal对底层拥有更大的操控性,同时又有着多线程上大量的优化。Metal Shader使用的是Metal Shader Language(MSL),是一种基于C++ 14的语言。

2014年6月,Metal发布。
2017年6月,Metal 2发布,相比Metal有了大量的优化,支持了VR。

操作系统与图形API

3D游戏图形API简史

参考文献

https://en.wikipedia.org/wiki/OpenGL
https://www.khronos.org/opengl/wiki/History_of_OpenGL
https://en.wikipedia.org/wiki/Vulkan_(API)
https://gpuopen.com/v-ez-brings-easy-mode-vulkan/
https://en.wikipedia.org/wiki/Direct3D
https://zh.wikipedia.org/wiki/DirectX
https://en.wikipedia.org/wiki/Metal_(API)