Chapter 3 – The Graphics Processing Unit

3.4 可编程着色器以及API的进化

可编程着色器框架的原理可以追溯到1984年公布的论文“shade tree”。一个简单的着色器与其相对应的shade tree如下图所示。

在1980年后期,根据shade tree的原理开发了RenderMan Shading Language。现在的电影行业仍旧使用该语言作为渲染工具,只是增加了一些其他改进的特性。

消费级的第一次成功问世实在1996年的十月一日,由3dfx Interactive生产。他们的Voodoo显卡能够很好得渲染游戏Quake。该硬件执行了完全固定功能的管线。在GPU自身支持可编程着色器之前,有过多次尝试通过多个渲染通道来执行可编程的着色操作。Quake III:Arena的脚本语言是第一次在这方面成功的尝试。正如我们在上一章节提到的,GeForce256是第一个被称为GPU的硬件,但它是不可编程的。不过,这款GPU是可以设置的。

在2001年初,NIVIDIA的GeForce3是第一款支持可编程顶点着色器的GPU,其通过DX8暴露给开发者,之后还支持了OpenGL。这些着色器以装配式语言的方式进行编程,之后被驱动转换为微代码。像素着色器也由DX8引入,但是像素着色器缺少实际的可编程性——其支持的有限的程序被驱动转换为贴图blending state,并与硬件的“register combiner”相绑定。这些所谓的程序不仅限制于指令数量(12个或者更少),而缺乏重要的功能。依赖性的贴图读取以及浮点数数据类型由Peercy第一次提出,这也是真正意义上的可编程性。

那个时候的着色器并不支持flow control(分支),所以着色器需要预算相同的条件并从中选择一个或者在多个结果之间进行插值。DX定义了Shader Model这一概念,并以此基于对着色器的支持将硬件进行了区分。2002年见证了DX9与Shader Model 2.0的诞生,其意味着真正意义上的可编程顶点着色器与像素着色器。当然,OpenGL也推出了类似的功能。对于随机贴图的读取以及16位浮点数的支持最终被加入到着色器中。着色器资源,例如,指令,贴图与寄存器的上限不断增加也使得着色器可以处理更多更复杂的效果。对于flow control的支持加入到着色器中。随着着色器的长度与复杂度不断增加,装配式编程模型显得越来越笨重。幸运的是,DX9推出了HLSL。该着色器语言由微软与NVIDIA以通研发。同一时间,OpenGL ARB也推出了GLSL。这些语言很大程度上受C语言语法与设计思路的影响,同时也引入了RenderMan Shading Language中的元素。

Shader Model 3.0在2004年推出,并且支持了动态flow control,这也使得着色器的功能更为强劲。其将可选择的特性变为需求,并且进一步提高了资源的上限,还加入了对于在顶点着色器中读取贴图的中的部分支持。在2005年下半年和2006年下半年,新一代的游戏机XBX360以及PS3面世,它们都配备有支持Shader Model 3.0的GPU。任天堂的Wii则是最后一个大范围生产的只支持固定功能GPU的游戏机。从那时起,固定功能管线就退出了历史的舞台。此时的着色器语言已经可以通过多种工具进行创建和管理。如下图所示。

在2006年下半年,着色器的可编程性随着DX10与Shader Model 4.0的推出进一步被扩展。其中的一些主要特性,如几何着色器以及stream output。Shader Model 4.0包含了对于所有类型的着色器来说统一的编程模型(顶点着色器,像素着色器,几何着色器)。资源的上限进一步增加,同时还支持了整型数的数据类型(包括了位操作,bitwise operation)。

在2009年,DX11与Shader Model 5.0问世,加入了tessellation着色器与计算着色器,也被称为DirectCompute。其加大了对于CPU多线程的支持。OpenGL也在自己的4.0版本和4.3版本分别加入了对于tessellation与计算着色器的支持。DX与OpenGL有着不同的进化轨迹。微软控制了DX的API,所以其更多地与独立的硬件供应商进行合作,例如AMD,NVIDIA和Intel,还有游戏开发者以及计算机软件设计公司,以此决定暴露哪一些特性。OpenGL则由软件及硬件供应商联合开发。由于多家公司参与研发,OpenGL的一些特性会在DX推出之后再问世。然而,OpenGL支持插件,供应商定制等等其他特性。

下一个API中的大改动由AMD的Mantle API所主导。游戏开发商DICE作为合作伙伴也进行了开发,Mantle的理念是去除大多数图形驱动的开销,让开发者直接控制GPU。此外,这一重构进一步支持了CPU的多线程运算。这一API大大降低了CPU花费在驱动中的时间。Mantle的这一理念也被微软所采纳并且在2015年推出了DX12.需要注意的是,DX12并没有专注于暴露新的GPU功能,其余DX11.3所暴露的硬件特性保持一致。但是,DX12重新设计了API,使其更好地运用于现代GPU架构。之前CPU驱动的开销所导致的瓶颈被大大降低。从旧API进行移植变得困难。

Apple在2014年推出了自家的低开销API,Metal。Metal所支持的第一代移动设备是iphone 5s与ipad air。除了效率,这个APi还大大减少了CPU使用率以节省电量。该API拥有自己的着色器语言。

AMD将Mantle捐赠给了Khronos Group,其在2016年初推出了自己的新API,名为Vulkan。与OpenGL相同,Vulkan也支持多个操作系统。Vulkan使用了一种新的上层中间语言,名为SPIRV,它可以被用于着色器与普通的GPU计算。预编译的着色器是可移植的,所以其能用于任何支持Vulkan的GPU。Vulkan也能用于非图形的GPU计算,因为其不需要显示窗口。Vulkan与其他低开销驱动API的不同是,上至工作站,下至移动设备,Vulkan可以运用于不同的操作系统。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据