DirectX之Shader概述

      微软DirectX应用程序界面API首次发布于1995年,是为了在Windows平台上让开发人员们更容易操作多媒体和游戏编程资源而生的。在 DirectX之前,游戏的开发都是基于硬件的编程,显卡、声卡等的产品如此众多,要编写一款能运行在所有平台上的游戏简直是一件噩梦般的工作。

  DirectX包含2D/3D图形、声音、输入输出设备等多个组件,提供了一整套的多媒体接口方案。在统一的接口面前,硬件的差别性显得无足轻重,编程人员得以更有效率的开发各种多媒体、游戏软件。DirectX中3D图形方面是最受人关注的,因为在6.0版本之前它还不是3DFX的Glide 的对手,所以我们从DirectX 6.0谈起:

DirectX 6.0:加入了双线性过滤、三线性过滤等优化3D图像质量的技术,加入环境影射凹凸贴图,使3D游戏的画面更具有真实感。
DirectX 7.0:最大的特色就是支持了T&L,中文名称是“坐标转换和光源”,3D游戏中坐标和灯光的转换工作从此由CPU转交给了GPU,比DX6.1 性能提升20%。这也成就了nVIDIA GeForce 256与ATi Radeon 256的辉煌,令3DFX彻底退出市场竞争。
DirectX 7.0a:增强了力反馈游戏控制设备的性能和兼容性。
DirectX 7.1:与Windows Millennium一同发布。
DirectX 8.0/8.0a:支持Shader Model 1.0和1.1,从此在显卡中引入可编程像素着色器(Pixel Shaders)和顶点着色器(Vertex Shaders)的概念,同时应用在Xbox游戏机中。同硬件T&L仅仅实现的固定光影转换相比,VS和PS单元的灵活性更大,它使GPU真正成为了可编程的处理器。

小知识:什么是shader?Shader就是一段可以改变像素和顶点的小程序,这个Shader小程序可以为游戏场景添加一些基本的几何学特效。例如湖水的涟漪,它会让特定的蓝色材质发生移动、扭曲和倒映,这样就会给人波光粼粼的感觉了。若是要将一个物体渲染成玻璃的风格,它就会让一些材质发生透明和扭曲。

DirectX 8.1:Pixel Shader升级到1.2、1.3、1.4版,可以支持最高每时钟28指令执行,其中1.4版当时仅ATi Radeon 8500显卡支持。
DirectX 9.0 Shader Model 2.0:SM2.0的shader性能更强,支持最高96指令的pixel shader长度,同时DirectPlay和一些音频方面也有大幅提升。
DirectX 9.0 Pixel Shader 2.0b:ATI Radeon X600/700/800系列显卡首先采纳,开始支持更多指令(最高1536)和更多临时寄存器(32相比之前为12),同时还加入新的贴面寄存器(facing register)和几何实例(geometry instancing)的支持。
DirectX 9.0 Shader Model 3.0:支持更多指令,支持指令的流量控制和动态分支,从而使得编程人员可以在shaders中加入循环操作,使得编程更加容易,首次被Geforce 6800显卡采用。
从DirectX的发展史中我们可以看到,微软的3D API和硬件一同发展,新硬件带来新的DX特性,新的DX特性加速硬件的发展,在DirectX10上面,又是一个3D图形发展的新境界:
DirectX10:
  DirectX 10要在明年初与Windows Vista的首个正式版一同推出,它将大大改变软件开发人员进行Windows游戏开发的方式,而且很有希望给用户同时带来更好的画面和强劲的性能。

  现如今的驱动模式都是显卡驱动从属在操作系统核心之内,如果我们在玩游戏的时候当机了,整个系统也就挂掉了。而在DX10中,图形驱动已经独立开来,DX10的驱动分为了用户模式和核心模式, Direct3D, OpenGL, DirectX视频播放都是工作在用户模式,互相不会影响,更不能对核心造成损害。因此DX10能够提供比以往所有DX都强的整体稳定性。

  另外DX10的一大改革就是微软取消了所有的特定功能管线(也就是VS、PS、ALU等),使得任何硬件都是可编程的了,软件开发人员可以用shaders来模拟固定功能管线的功能,从而实现对旧程序的兼容。

DirectX 10: 仅支持Windows Vista

 

  鉴于DirectX10的更新较大,所以仅针对最新的Vista操作系统,而不会有兼容WinXP的DX10 版本。但是现在DX10的显卡还没有上市,而Vista上市初期肯定市场上大多数显卡都是DX9的,因此微软决定让DX9的显卡在Vista上使用一个 DX10的子系统——DirectX9.0L。在DX9.0L下,DX9显卡用户可以实现Vista的Aero等视觉效果,用DX9的模式玩游戏。

  在DX9上编程受到很多的限制,而DX10的目的就是完全消除这种开发上的限制,从而发挥硬件的全部性能,微软要把DX10的Vista打造成终极游戏操作系统。微软宣称相比XP上的DX9,DX10性能最高提升6倍,就是因为DX10上解决了DX9上无法解决的批处理问题,CPU分流给 GPU,不再有这种瓶颈;在DX10上,显存也是虚拟的,显卡可以自由共享系统内存来使用;Shader Model 4.0的指令宽度更高,每时钟可以做更多的工作;另外更重要的是,DX10上硬件的差别不存在了,例如不同的DX9显卡会支持不同的浮点数,支不支持 HDR、HDR+AA等功能,在DX10上不复存在,DX10显卡唯一的区别就是他们的“硬”性能指标。

统一shader构架:

  统一shader构架的首次应用是在微软Xbox360游戏机上,它通过统一shader功能的方法来达到让显卡处理器工作更有效率的目的。
  在DX8、DX9显卡中有两种shader单元:Pixel Shaders和Vertex Shaders单元,其中Vertex Shaders处理顶点,给出一个3D物体的形状,而Pixel Shaders制造shaders填充入这些三角组成的形状之内,给出了3D物体的外观,使它活了起来。
  shaders处理单元的数量随着显卡的发展越来越多,DX8/DX9构架中两种shaders有各自独立的指令集,独立对场景进行渲染,难免会出现pixel shaders已经满负荷而vertex shaders只用了一半能力或是相反的情况,从而使得显卡的shaders不能实现最优的效率,下图就是ATi展示的两个极端例子:渲染鲨鱼的场景 Vertex shaders已经满负荷,而Pixel shaders还很清闲,因为没有多少像素工作要做;而另一个水面场景的渲染则是正好相反。
  而在统一shader构架中,一个shader既可以进行Vertex处理,也可以进行Pixel处理,从而提高效率和性能。

统一shader构架并非必须

  没有了以往DX9硬件中PS、VS的天然物理分割,在统一shader构架之中,需要有一个高效率的控制器,用来动态给shader们分配渲染任务。在xbox360中,这个控制器就是负载均衡单元,这个单元用来组织和分配进入到shader处理流程的数据,它要保证shader们被完全利用,同时还要保证最好的处理顺利,使游戏场景能够快速被渲染。

  每个shader单元既可以处理Vertex又可以处理Pixel,它们的功能都是一样的,使得这一切成为了可能,而这一切都是硬件层次的工作,游戏编程人员并不需要多做了解。Xbox 360的Xeno处理器具有48个统一shader单元。

  虽然统一shader构架如此具有意义,微软并不“强迫”显卡厂商们在DX10中采用,也就是说即使不支持统一shader构架的显卡也可以 100% DX10 SM4.0兼容。不过现在看来ATi和NVIDIA的下代显卡都是统一shader构架的,Intel也宣布支持此构架。

DirectX 10的Geometry Shader

  除了专门处理像素的Pixel Shader和专门处理多边形顶点的Vertex Shader之外,DX10中还加入了一个Geometry shader,专门用来处理场景中的几何图形。Vertex Shader每一次运行只能处理一个顶点的数据,并且每次只能输出一个顶点的结果。在整个游戏场景中,绘制的几何图形的任务量是非常庞大的,如果仅仅依靠 Vertex Shader来完成,处理场景的效率会很低下。Geometry shader几何着色器可以根据顶点的信息来批量处理几何图形,将点、线、三角形等基本的构图元素连接起来,创造出新的多边形,快速的将这些处理结果传递给其他Shader。

  Geometry shader几何着色器工作在顶点与像素着色单元之间,当显卡中的顶点着色单元生成顶点信息之后,就会将这些结果交给几何着色器来构成更为复杂的几何图形,最后交由像素着色器来为这些几何图形添加各种材质。Geometry shader的工作就是“接点”,将顶点之间用线连接起来。例如,当Geometry shader拥有两个顶点的信息时,它就可以将两个点连接起来组成一条线,通过这条线可以绘制其他延长线上的点,而通过连接三个顶点就可以绘制出一个三角形,最后通过计算延长线上的点,就可以绘制出更为复杂的几何图形。

  Geometry shader的出现使得游戏开发人员可以设计出更为复杂的动态器官、几何放大、动态模糊、脸面皱纹、真实阴影、剂塑、置换、卡通等等效果,同时把CPU从这些繁重的计算任务中解脱出来,这是一个巨大的突破!

small batch问题的解决带来的性能提升

  DX9的硬件发展已经很完善,各种灯光效果、HDR等的处理使得DX9下的游戏画面非常漂亮,但是DX9下的硬件资源浪费也很严重,主要是一个众所周知的“small batch”问题。

  在DirectX9管线中,一个渲染的对象物体从一个应用程序(例如游戏)转换成API层次的代码来执行,API把这些代码交给驱动程序驱动硬件来渲染对象,对象每次从API到驱动这个阶段都会有一个额外开销,对象数量越多这种额外开销就越大,延长执行时间,从而导致严重的性能问题,这就是 “small batch”问题。尽管没有完全消除这个问题,DX10中大大减少了API到驱动的额外开销时间,以前API到驱动的时间占据总体物体渲染时间的40%,现在只需要20%的时间就可以完成了,从而使得游戏开发者们放心大胆在游戏中加入更多的渲染对象。

  DirectX 10还有几项关键性的提升:

HDR Lighting:DX10显卡支持两种新的浮点HDR格式,可以更有效处理HDR特效。
GPU虚拟内存:材质贴图容量不再局限于显存容量,内存也可以被GPU自由支配了。
更好的几何示例(geometry instancing):让游戏开发者有了更多物体几何运动的方式选择。
最大内存材质分辨率由DX9中的4096x4096上升到DX10的8192x8192。
Xbox360游戏中控制系统的引入,XInput部件使用户在PC Vista中可以使用游戏机的控制设备了。
Directsound做了小幅更新,未来会有更大功能提升。
Stream Output:geometry shader可以输出到缓存区。

结论:

  从DX9到DX10的革新会像是从DX7到DX8那样显著吗?或许不是,因为几乎所有的重要DX10游戏特效都是延用DX9的,DX9显卡都可以处理,只是效率比较低而已。但是在新的DX10 API上,游戏开发者们在游戏中加入各种特效,并使它们高效运行上将更加得心应手,从而大大提高游戏的真实性。此外就是原来CPU的一些工作,通过新的 API可以转移给GPU来做;新的geometry shader提高游戏物体的几何数量,使得游戏中HDR lighting、volumetric fog、景深等特效更易部署。

你可能感兴趣的:(3D图形学)