● 打开真实世界的大门
Pixel Shader1.0让图形界从固定的条条框框中跳了出来,但它存在精度不足的问题。Pixel Shader2.0弥补了精度方面的缺失,那它就完美了么?显然不。尽管Pixel Shader2.0能够提供足够让画面达到人眼分辨上限的精度,但它却存在不比精度不足好到哪里去的问题——它太过笨拙了。
3D图形不同于静态画面,连续动态画面的流畅度和画面的准确表现是同等重要的,如果硬件仅仅能输出准确的效果,却无法在输出速度上予以保证,用户获得的最终体现效果一样会大打折扣。随着Pixel Shader的逐步发展,其最大指令长度慢慢的从出现之初的16条发展到了2.0b的512条,这使得指令的执行效率成了摆在人们面前的现实问题。非常遗憾的是,Pixel Shader发展到2.0b为止都没有引入真正有效的提升指令执行效率的手段,跳转、分支、流控制等今天看来很平常的东西在当时全都是不存在或仅仅存在于“支持”这种程度的,这让Pixel Shader的执行效率出现了极大的问题。
3Dmark03的Pixel Shader2.0测试场景
与此同时,由于最大指令数本身的限制,程序员对每个像素所能够进行的改变实际上仍然会受到限制。如果想要添加更多更真实的效果,程序员往往需要让一个像素多次反复进入Pixel Shader单元中进行处理,这让本来就已经存在的效率问题变得更加雪上加霜。
好不容易能够表达正确的结果了,效率却跟不上,程序员们都觉得很不舒服。程序员不舒服,大商人的收入就会受到影响。于是注意到问题所在的微软推出了号称史上最完美的DirectX版本——DirectX 9.0C。
在DirectX 9.0C中,MS显然想将之前版本的DirectX中所遗留的问题一次性彻底搞定,Shader Modle3.0的最大指令数提升至65535,增加了寄存器数量,引入了动态程序流控制,将分支和跳转能力彻底开放给了程序员,同时通过多目标渲染(MRT)和延迟渲染(Deferred Shading)等创造性的技术保证了光栅化过程中整个流水线的整体效率,可以说DirectX 9.0C几乎解决了ALU利用率和效率之外的一切问题,它成了历史上第一个真正能够“实现一切特效”的图形API。
得益于微软英明的指挥和领导,支持Shader Modle3.0的图形构架拥有了远比之前构架更多的寄存器资源、接近无限长度的指令执行能力以及灵活的控制操作方式,因此也就具备了远比之前构架更高的执行效率。程序员们获得了比先前所有版本都多得多的自由度,他们终于可以在支持Shader Modle3.0的硬件中近乎于不受约束的尽情堆砌指令,来实现越来越接近于现实的色彩和效果了。