from: http://www.opengpu.org/forum.php?mod=viewthread&tid=7376&extra=page%3D1
本连载的主要目的,是介绍最新的PC和GAME所使用的最新3D图形技术的发展趋势。
暂时的方针是,首先是考虑介绍比较新的PC Game和PS3,XBOX360等新时代游戏机的游戏所采用的技术。
那么首先,想回顾一下近年来的3D图形技术的进化历史。
实时3D图形技术的进化历史
目前,不仅索尼的PS3,微软的Xbox360,任天堂的Wii这些最新的游戏机,以及最新的微软Windows Vista的用户界面变成了3D图形,就连NDS和PSP等掌机,以及一部分最新的移动电话也支持了3D图形技术。
说来,实时3D图形是怎么进化着,并向未来发展的呢?今后,要长期和实时3D图形打交道的人,先试着整理基础知识吧。
1980年代后半到90年代前半,Flat Shading 到 Texture Mapping的时代。
在这之前3D游戏还没有应用, 基本上[3D图形]是用在技术训练的模拟,解释自然现象或光学现象的学术研究,比如说对影像表现的应用等,在专业用途和学术用途的领域里进化着。从1980年代后期开始到1990年代,大型游戏制造厂商在街机用途的游戏系统里采用了实时的3D图形系统。从这开始3D图形才真正在游戏里被有效的利用。
要说这个时代具有代表性的作品就是NAMCO(南梦宫)的「winning run」(1988年)、SEGA(世嘉)的[Virtual Fighter(VR战士)」(1992年)。那时候虽然也使用多边形模型来实时表现,但多边形数很少,采用的lighting也是以多边形为单位的Flat Shading为主流。
但是,游戏和3D图形的相遇,确立了[实时3D图形]这个领域,并一直支援着它的进化。
在NAMCO的[RIDGE RACER(山脊赛车)](1993年)里, 应用Texture Mapping 的3D模型(在多边形上贴上贴图)可以自由运动,就好像是从积木集合体那样的3D图形开始,一下提高了真实性。
[Virtual Fighter(VR战士)」(1993年)。只是以多边形单位lighting为基本的[Flat Shading],也没有Texture Mapping这个概念,因此,脸和服装都使用”某种形状的多边形”来绘制(C)SEGA。
1990年代中期~家用游戏机开辟了面向消费者的实时3D图形。
当时,除了特殊的图形工作站,如果限定在[游戏平台],那么当时3D图形技术最先进的是街机游戏系统。然而,1994年发生历史性的逆转,那就是SONY PlayStation(PS1)和 SEGA Saturn的登场。
尽管分辨率不是太高,但提供给消费者对应Texture mapping的实时3D图形的意义很大。在这些主机上,实时3D图形和3D游戏图形以并行的关系性,开始急速的进化。
另一方面,很遗憾,这时适合普通消费者的PC的3D图形技术,要比游戏机大幅度落后。适合普通消费者的PC 3D图形技术真正的普及,是在1995年登场的新操作系统,Windows95的时代之后。
微软发表了把Windows环境下的Sound,Graphic,network,Game controller等多媒体API组件整合到一起的「DirectX」,Windows 95也采用了它。DirectX后面增加版本号的称呼也成为惯例、Windows环境下真正的3D显卡开始普及。实时3D图形可以使用是在1997年发表的[DirectX 5]之后。
也正是这个时候,大型的CPU/Chipset制造厂商Intel的新图形端口AGP(Accelerated Graphics Port)总线技术也投入实用化。强大的图形芯片制造厂商NVIDIA推出了RIVA 128系列,ATI(2006年和AMD合并)推出了RAGE 3D系列。都深受欢迎。比PS1登场晚了3年,PC平台终于有了可以和PS1同程度的实时3D图形。
NVIDIA的「RIVA 128」
DirectX 5時代、「用PC玩3D游戏」并广为传播的「Quake II」(1997年、id software)
(C)1997 id Software,Inc.All Rights Reserved。
DirectX 6時代,以显卡的经典游戏而闻名的「Incoming」(1998年、Rage社) (C)Rage Games Ltd 1998。
(西川善司)
1990年代后期~ DirectX的急速进化历史
1990年代后期,由于PC业界团结一致的致力于强化PC,使图形实现了急剧的进化
1998年,发表了整合了当时已经发表的各种实时3D图形功能的DirectX6,次年1999年,决定了今后PC图形进化方向性的DirectX 7也被发表了。
直到DirectX 6以前,3D图形处理硬件,只担当多边形和相应的像素的计算(光栅化rasterise处理),和处理贴上材质纹理等像素单位的处理。
DirectX 7中,实现了把之前CPU担当的顶点单位(多边形单位)的坐标变换处理和光照处理,改由3D图形硬件来担当的结构。特别是在那时,把用图形 “硬件” 进行“顶点单位的坐标变换(Transform)和光照处理(Lighting)”的结构,称作[Hardware T&L] (T: Transform L: Lighting)
还有,因为这个契机,PC业界理解到[担当全部图形处理的处理器]的含义,开始把这样的硬件(处理器)称为GPU(Graphics Processing Unit),以后也就这么定下来了。另外不得不说句闲话,GPU的这个称呼,发音和文字上都和CPU(Central Processing Unit)对应着。作为对应DirectX 7的GPU,NVIDIA的GeForce 256和ATI的第一代RADEON登场了。
搭载了「NVIDIA GeForce 256」的显卡
实时3D图形技术上,虽然这之前感觉游戏机一方走在更前面一些,但是从进入DirectX 7时代开始,形势完全被PC逆转了。这是因为,家用游戏机都被普及性优先的战略所制约,只能以5年为一个周期变更硬件配置,相对的,PC每年都可以吸收最新技术完成进化。还有,当时游戏机的份额之争是在3个制作商之间争斗,相对,PC图形因为是在近10个制造商之间争夺,所以也对激烈竞争的根源起了不小的影响吧,但是,直到进入了DirectX 8時代,大淘汰的浪潮终于涌了过来,GPU制造厂商也缩小到数家。
「GIANTS:CITIZEN KABUTO」(2000年、PLANET MOON STUDIOS)。在DirectX 7时代,PC的实时3D图形的表现力完全凌驾于家用游戏机之上。
(C)2000 Planet Moon Studios. All Rights Reserved. Planet Moon and the Planet Moon logo are trademarks of Planet Moon Studios. Giants, Giants: Citizen Kabuto, Interplay, the Interplay logo, and "By Gamers. For Gamers." are trademarks of Interplay Entertainment Corp. All Rights Reserved. Exclusively licensed and distributed by Interplay Entertainment Corp. All other copyrights and trademarks are the property of their respective owners.
2000年 Programmable Shader Architecture(可编程着色器架构)展开帷幕。进入GPU制造商淘汰的DirectX 8时代。
虽然在1998年世嘉•Dreamcast,2000年受到期待的索尼•PlayStation2开始发售,但是在3D图形的处理能力上,它们和当时的PC图形保持在同等程度。
确实,虽然PC DirextX一方有着先进性,但硬件(GPU)的急剧进化并不能牵引软件业界,
PC一方变得难以技术同步。
虽然那么说,但作为PC业界,不管怎样都维持了每年一定会积极采用全世界研究者们创新出来的最新3D图形技术的基本方针。说到原因,对最新技术牵引的PC业界来说,导入像家用游戏机那样的缓慢的进化循环是很难的。PC一方每次在新GPU上搭载新机能, DirectX就要为了可以利用这个机能新添加的API,这使DirectX不断的增长。
此外,实现的新功能在实际应用里使用是没有限制的,这样的功能作为DirectX内的化石功能持续残留着。GPU则也要为了这些化石功能消费晶体管,不合理的成本和电力消耗是没有意义的。
就在这时,设法把图形处理用软件方式实现,并导入到GPU里的想法被提出了,从而有了加入[shader可以编程实现]这个含义的,[可编程着色器](Programmable Shader)的概念(待续)
世界第一个面向消费者的采用可编程Shader架构的GPU「GeForce 3」
GeForce 3的人脸动画DEMO,利用可编程着色器实现的基于法线贴图的凹凸贴图表现,对衣服的外形和人肌肤的褶皱也一样适用。
那么,在上次最后介绍的是可编程着色器架构(Programmable Shader Architecture),最早支持它的DirectX是2000年末发表的DirectX 8。
作为对应DirectX 8的GPU,NVIDIA GeForce 3,ATI Radeon 8500等被投入市场。还有,2001年微软推出的Windows XP,也集成了DirectX 8。
可编程Shader有担当顶点处理/多边形处理的[可编程顶点着色器]( Programmable Vertex Shader),和处理像素单位的阴影和处理相关纹理的[可编程像素着色器] (Programmable Pixel Shader)两种类型,在各自的着色器单元(Shader Unit)上,有着把各种各样的Shader程序来实现为3D图形的处理的结构。而且,作为用语,如果直接说[Programmable Shader],有指双方(VS和PS)的情况,或者是指这个整体的概念。
并且,由于这个Shader程序是软件,开发者可以自己制作独创的Shader程序,就可以在GPU上实现新的图形功能。
这样,即使不等待每年发表的最新3D图形技术和下一代GPU登场,如果开发了实现这个技术的Shader程序(除了性能上有差别),那么也会产生从实验或实践中获益。这个技术传播后,也产生了硬件和软件业界就为再次互相靠近的契机。
但是,可编程Shader架构的实现,要求GPU制造厂商有很高的技术能力,在接下来DirectX 9登场的时候,支撑了初期实时3D图形的GPU厂商的撤退变得很显眼,淘汰的结果,2001年以后,GPU制造厂商的两大巨头NVIDIA和ATI激烈的GPU战争变得突出。
现在,除了两个公司以外还在开发对应PC消费者的量产GPU的还有英特尔(但集成到芯片组里)和S3公司。支撑PC图形黎明期的3dfx公司,2000年被NVIDIA收购,类似的Number Nine公司也在1999年倒闭了。Windows 9x时代,在日本有着极大人气的MATROX公司,虽然也最后投入了DirectX 8代GPU「Parhelia」系列,但并不成功,此后就远离了对应最新技术的GPU开发。面向专业工作站用GPU的3Dlabs公司在Windows 9x时代虽然也投入了对应消费者的GPU,但也是徒劳,2002年被Creative公司收购,2006年宣布退出专业用GPU业务。从芯片组制造厂商SiS派生出的GPU专门制作厂,新成立了XGI公司,2006年,在对应最新技术的新GPU开发方面,事实上也是退出了。
【千里马肝注:以本人的经历举例,XGI上海研发部先是被ATI收购,不久后ATI又被AMD收购。】
对了,在DirectX 8发表约1年后的2001年末。微软发售了以DirectX 8为基础的游戏机,第一代「Xbox」。这里就不做过多讨论了,不过,Xbox是世界上首个采用可编程Shader架构的家用游戏机。
第一代「Xbox」。搭载了以GeForce 3为基础的GPU,API使用DirectX。
Xbox和PC两方发售的「分裂细胞(Splinter Cell)」(育碧 UBI SOFT),让世界了解了基于可编程Shader的3D图形的可能性。
2002年/2003年~ Shader Modle 2.0和第一期DirectX 9时代
DirectX 8时代的programmable shader(可编程着色器),因为每个GPU制造厂商有若干个分支版本混合在一起的关系,所以被规定为SM1.x。然后到了2002年,新的可编程shader,支持2.0规格的DirectX9发表了。
可编程 shader的规格,用Shader Model(简称SM)的关键词后面加版本号来指出架构的方式,近年来变得常态化。总之,例如DirectX 9时代应该就是指「SM2.0」对应GPU兴起的时代。
SM2.0可以执行比SM1.x更长的Shader程序,命令种类的增加,能使用的命令组合的限制也被降低了。还有,以前只有Vertex Shader可以使用的浮点运算精度,现在Pixel Shader上也可以使用了,Pixel Shader的阴影处理的计算精度和能够表现的动态范围也扩展了。这个扩展决定了未来被称为[高动态范围渲染] (High Dynamic Range Rendering:HDR Rendering)的产生,成为实时3D图形新趋势的契机。
DirectX 7/硬件的T&L (T:Transform,Lighting)的第一代GPU,并且对应DirectX最初的可编程Shader的GPU都是从NVIDIA发布的显卡。相对的,DirectX 9/SM2.0对应的GPU的最初显卡是ATI发布的Radeon 9700,都是让人感慨很深的事情。虽然NVIDIA也投入了与之对抗的GeForce FX,但制造上有问题,性能上也不利,SM2.0时代在ATI的优势中过去了。
首款对应SM2.0的GPU,ATI发布的Radeon 9700系列,后面的9800,低端的9600/9500系列也受到了欢迎。
SM2.0时代ATI的优势被确定,这时最被盼望登场的VALVE公司的大型游戏[半条命2(Half life 2)],也是以ATI的Radeon 9500/9600/9700/9800系列作为最合适的GPU,展开了销售战略。
[Half Life 2] (VALVE)最初是预定在2003年发售,几次延期后,在2004年末被推出了,虽说有好有坏,HL2为SM2.0时代GPU的构筑做出了贡献。
(C)2004 Valve Corporation. All rights reserved. Valve, the Valve logo, Half-Life, the Half-Life logo, the Lambda logo, Counter-Strike, the Counter-Strike logo, Source, and the Source logo are trademarks or registered trademarks of Valve Corporation in the United States and/or other countries. All other trademarks are property of their respective owners.
2004/2005/2006年~ Shader Modle3.0和第二期 DirectX 9时代
SM2.0虽然说是"2.0",但和1.x时一样,产生了几个小型的分支。NVIDIA在GeForce FX
里组装了起名为可编程Vertex Shader2.0a(VS2.0a)和可编程Pixel Shader 2.0a(PS2.0a)。
DirectX 9登场约2年之后的2004年,微软并没有发表DirectX 10,而是发布了新的DirectX 9的小幅升级版(minor version up),完成了Shader Model3.0,即SM3.0的对应。
SM版本提高了1.0,但DirectX版本没有提高的原因有[为了配合即将推出的Windows Vista一起推出],[考虑到之后出现的ATI制造的GPU没对应SM3.0」等多种说法,但具体不明。
【千里马肝注:ATI和NVIDIA有着不同的公司风格:ATI从来不搞自己的一套,专心跟着Microsoft的标准走,老大说一决不说二;而NVIDIA一直都喜欢推出自己的标准,不论是SM中VS和PS的版本、OpenGL的EXT、以及Cg和CUDA等,应该说是一个很有活力和野心的公司,在推进技术的同时,也给行业带来了某种程度上的混乱。】
实际上,SM3.0里Shader程序的程序长度限制被取消,Vertex Shader、Pixel Shader双方的指令集也被扩充。SM2.0里动态条件分支和循环虽然只限在VS里,但在SM3.0中,PS里也可以支持了。实际上,可编程Shader的VS和PS的差距没有了。还有,从Vertex Shader还支持了可以访问Texture(纹理)的新技术「Vertex Texture Fetching: VTF」(别名 Texture link),在那时深受欢迎。
首款对应SM3.0的GPU,是NVIDIA发布的GeForce 6800系列,意外的是,ATI在2004年新登场的GPU、Radeon X800系列,还是选择停留在只对应SM2.0。
NVIDIA的GeForce 6800系列。首款对应SM3.0的GPU,再次从NVIDIA那边登场了。
Radeon X800系列,是对应Vertex Shader 2.0a和像Piexl Shader2.0b扩展改良的SM2.0的GPU。2004年是两大巨头步调不一致,用户混乱的一年。在把SM2.0称为“2.0” 的同时,因为ATI和NVIDIA都独自扩张,也出现了细节版本号的不一致。
2004年也是新的总线端口,「PCI-Express」被开始使用的一年。显卡的总线迎来从AGP到PCI-Express x16总线的转移期。2004年~2005年,当用户要购买新图形卡或替换,在选择「是SM2.0(ATI),还是SM3.0(NVIDIA)」的同时,还要做[是AGP还是PCI-Express]这个纠结的抉择。
那么,NVIDIA在第2年的2005年投入了第二代的SM3.0对应GPU「GeForce 7800」系列。作为一贯主张「2004年应该贯穿在SM2.0的成熟」的ATI,在2005年,比NVIDIA晚了1年半的时候,投入了自己首款对应SM3.0的GPU「Radeon X1800」系列。但是Radeon X1800虽然支持SM3.0的基本特性,但却没有对应VTF。
接着,2006年NVIDIA发表第三代的对应SM3.0的GPU「GeForce 7900」系列,与之对抗的是ATI的Radeon X1900系列的投入。两个公司,虽然都是在前一代型号上"+100"来定位下一个性能提高的产品,除了性能方面以外也可以吸引眼球。再者,ATI Radeon X1900系列也结束了没有VTF的状况。
虽然两大巨头GPU厂商ATI、NVIDA都已经推出对应SM3.0的GPU是一件好事,不过关于VTF的支持,两个公司的步调不一致。使得SM3.0的VTF成为了次要的功能,是否支持这样的主要功能,对用户和实时3D图形技术的进化给予了不小的影响,这成为迎接即将到来的DirectX 10时代的一个大问题。(待续)
SM3.0中,作为特殊功能而大受欢迎的[VTF]。但是,因为ATI没有支持VTF,VTF的效果只能在这个NVIDIA的Sample Demo里看到。
在家用游戏机的世界,2005年末微软推出作为该公司的第二代游戏机「Xbox 360」。图形技术方面对应DirectX 9/SM3.0,接下来将详细描述其具体性能,值得注意的是Xbox 360 GPU(Xenos)有着世界首个采用统一着色器(Unified Shader)架构的特征。Xbox 360 GPU是由ATI制造的,意外的是,和同时期ATI对应PC发表的Radeon X1800系列设计完全不同,这一点很有趣。之前推出的Radeon X1x00系列全部都没有对应VTF,不过,Xbox 360 GPU对应了。
微软「Xbox 360」。
Xbox 360的游戏软件「Gears of War」(2006年,Microsoft)。实时3D游戏图形就此到来了。
Gears of War and the Crimson Omen are either registered trademarks or trademarks of Epic Games,Inc. in the United States and/or other countries. All rights reserved. (C)2007 Microsoft Corporation. All Rights reserved. Microsoft,the Microsoft Game Studios logo,Xbox,Xbox360,the Xbox logos,Xbox Live and the Xbox Live Logo are either registered trademarks or trademarks of Microsoft Corporation in the United States and /or other countries.
【千里马肝注:关于Unified Shader,下图可以作为一个很好的说明。如果把Unified Shader翻译成“统一架构”的话,那么早期的就应该叫做“分离架构”。新架构的好处就是不会出现之前的vs很忙ps很闲,或者ps很忙vs很闲,能够最大限度的发挥所有着色器的能力,以相同着色器数量规模实现更高的性能。】
2006年末,索尼那边的新游戏机「PlayStation3」(PS3)被推出了。PS3的GPU由NVIDIA担任设计(索尼负责制造),虽然给予了「RSX」的专用名称,但基本设计是与GeForce 7800系列大体上相同,在图形技术上是和竞争的Xbox 360一样对应同世代的DirectX 9/SM3.0。
索尼「PlayStation3」。
「摩托风暴(MotorStorm)」(SCE Europe)。不单是图形的表现,加上高度真实的物理模拟的特性,使其成为被大受期待的PS3游戏。
MotorStorm TM (C)2006 Sony Computer Entertainment Europe. Published by Sony Computer Entertainment Inc. Developed by Evolution Studios. MotorStorm is a trademark of Sony Computer Entertainment Europe. All rights reserved.
新世代的游戏机战争应该称为「Xbox 360对PS3」之间的竞争,实际上,虽然表面若无其事,但这里「ATI对NVIDIA」也展开了战斗。无论如何,二大最新游戏机的图形一同成为可编程Shader 3.0的架构。PC和游戏机都进入了SM3.0的时代。
另外,游戏平台的另一个强者,任天堂投入了新世代游戏机「wii」,不过图形技术上采用了并没有太多进化的方针。
【千里马肝注:需要注意的是,三台主机的发售时间分别为Xbox360是2005年11月,PS3是2006年11月,Wii是2006年11月(比PS3晚几天)。所以论GPU硬件而言,Xbox360的C1/Xenos是基于ATI的R500修改的,同时期的ATI X1800是R520核心,而Wii的Hollywood性能与ATI X1300差不多(RV515核心,RV是低端产品的前缀,通常是R的阉割版)。相比同时代的显卡,Wii图形不论是显存上、技术上、分辨率上都要差一大截。作为发售比Xbox360晚一年却选择了更低端的产品,显示出Nintendo开辟一片蓝海的决心,结果也如预期一样,Wii的销售量一度等于XBox360和PS3的和。】
2007年 Programmable Shader4.0和DirectX 10的时代开始。
1年后,DirectX的版本号更新和1990年代后期有差异,DirectX 9从2002年开始的4年时间,大概占据了Windows XP的全部生命周期。2006年后期发生了ATI被CPU制造厂商AMD收购的事件,不过如果回顾一下的话,2000年以后的实时3D图形历史,实际上可以说是「ATI对NVIDIA」的战斗历史。
2007年初的时候,微软早早的发表了新的操作系统「Windows Vista」。与这个同步,作为新版DirectX的「DirectX 10」被前后大约耽搁了5年后也发布了。
在SM4.0中,和SM3.0相比,扩充了新的指令集,具体的有追加了整数运算指令,和二进制位运算指令,因此像CPU那样通用程序的功能也被强化了。还有,指令集对应顶点着色器和像素着色器的差异没有了,微软把这个称为通用着色器(common shader)架构。
SM3.0和SM4.0的比较。
同时Texture(纹理)的访问数量,从SM3.0的16个扩大为SM4.0的128个,拥有共享指数E的新的Texture格式RGBE也被支持了。对应实时游戏的低负荷HDR渲染成为可能。
并且在DirectX 10/SM4.0中,最大的改变是第三个可编程Shader[Geometry Shader]的加入。
因为直到现在,把顶点相关的事务称为「geometry」的很多,很多人也认为[Geometry Shader]和[Vertex Shader]是一个意思,实际上是和Vertex Shader不同的,但是在[处理顶点相关信息]这点上和Vertex Shader一样。
Geometry Shader功能是可编程的增减顶点,正确把线段,多边形,粒子等图元(Primitive)进行增减。
【千里马肝注:以本人的经验,Geometry Shader因为加入时间的关系,在早期的显卡中,可能是硬件上的原因,其实是由display driver来实现的,意思也就是software方式即CPU的处理,而不是在GPU管线上实际意义的hardware方式实现,所以其效率非常低下。不过,貌似直到现在为止,Geometry Shader的效率一直都没有得到什么根本上的改善。】
并且,用作呼应在顶点处理阶段增加Geometry Shader处理的形态,也新增了把Vertex Shader 或 Geometry Shader 的输出在显存上的功能,写回输出功能Stream Output的结构。依靠这个功能,在顶点阶段类似的[Vertex Shader->Geometry Shader->Vertex Shader]的重复处理成为可能。
让Geometry Shader和Stream Output的组合,使得高细节3D模型的变形加工无保留的成为可能。使用GPU做CPU那样的通用处理为目的的GPGPU(General Purpose GPU)的用途也很有价值。期待这个广泛的应用。
DirectX 9/SM3.0的渲染管线
DirectX 10/SM4.0的渲染管线
DirectX 10/SM4.0是Windows Vista专用的,因为严密的版本控制没有产生分支版本。
DirectX 10/SM4.0也发表了在Windows Vista上的独占性提供方针,Windows XP和以前的操作系统并不支持。虽然微软在Windows Vista销售之前宣称「Windows XP的支持延长」,但「DirectX 10/SM4.0是Vista及之后版本专用」的方针并没有改变,实质性的实时3D图形的进化交给了Windows Vista和以后的操作系统。
实际上,DirectX 10/SM4.0只提供给Windows Vista专用,主要的原因是驱动模型的大幅度改变。
DirectX中的图形子系统Direct3D,在设计之初并没考虑到会被同时被多个应用程序使用的情况。而在Windows Vista里,图形用户界面是使用Direct3D 9(Ex)来实现的,Direct3D 10也被另外实现。同时,让多个3D应用程序运行,对应GPGPU的用途也进入视野,旧的单线程设计很不方便,伴随着Windows Vista的大变革而被发布的DirectX 10/SM4.0,对应了多线程,采用了运行稳定性更高的新的GPU驱动程序架构。这就是「WDDM : Windows (Vista)Display Driver Model」。
【千里马肝注:Windows Vista中的Aero效果,就是直接使用的Direct3D实现的,当使用Win+Tab快捷键切换程序时,窗口被渲染在Render Target上以立体的方式展现出来,同时标题栏还使用了blur的shader以实现模糊的毛玻璃效果。】
WDDM驱动程序分为用户模式和内核模式,这个设计,使得来自应用程序的错误驱动控制很难引起系统的崩溃。还有,按照GPU硬件的多线程对应程度,分为WDDM1.0/2.0/2.1等版本。WDDM 1.0负责实现DirectX 9和针对以前的旧设计的GPU,而以DirectX 10为目的开发的GPU,则由WDDM 2.0及以后版本的实现来提供。1.0和2.0/2.1的差别实际是对应多线程等级的不同,1.0对应的是非抢占式多线程(Non Preemptive Multi-thread), 2.0/2.1是对应的是抢占式多线程(Preemptive Multi-thread),另外2.0和2.1的区别主要是多线程粒度上的差异,2.1可以在更细小的目标内做线程切换。
Windows Vista的图形子系统。
非抢占式是自发的进行线程切换的多线程实现方法,抢占式是用分时技术(Time Sharing),自动的切换线程的多线程实现方法。
【千里马肝注:Windows Vista之前的display driver是运行在kernel-mode的,所以有句话是“75%的蓝屏都是由display driver引起的”,原因也是相比其他的driver,display driver最为活跃,如此复杂的driver也是由人编写的,难免会有bug,于是导致了系统的不稳定。那么从WDDM开始,display driver基本上是运行在user-mode的,为什么说是“基本上”,那是因为还有小部分的核心模块“一般被称作mini port driver”依然放在kernel-mode,于是即使display driver长时间未响应或是崩溃了,不仅有Timeout Detection,还可以Recovery,于是系统相对来说更稳定了。】
从DirectX8开始的可编程Shader,虽然有SM1.x/2.0/3.0的版本制定,但是每次由于GPU制造厂商的独自扩展,最终变得混乱。这样的分支版本混在一起,不仅仅用户挑选产品很难,来自软件业界的排斥也很大。这样,微软在DirectX 10以后,把DirectX 9之前存在称为
Caps(Capability Bits Test)的这种用作检测图形特性是否支持的结构废弃了,而进行严密的版本控制的方案。由于这个方案,宣称对应DirectX 10/SM4的GPU,必须能实现DirectX 10/SM4.0全部的功能。DirectX 9/SM3.0时代那种NVIDIA支持VTF,ATI不支持VTF的事,在DirectX 10/SM4.0的时代不会再发生。
【千里马肝:在Direct3D9的年代,因为后缀abc等多个版本中,新增了大量的新特性,作为开发者无法保证使用的特性是否被支持,于是必须通过提供的caps接口来检测,如果不支持,要么必须关闭该功能,要么必须另行实现一套实现达到类似的效果,导致了开发难度的增加。】
这样,一旦实时3D图形的基本功能的实现告一段落,今后的功能强化, 因为有很高的复杂度原因,有必要经过业界团体的严格讨论.。
统一着色器(Unified Shader)架构和全新的DirectX。
对应DirectX 10/SM4.0最先登场的GPU,是NVIDIA的GeForce 8000系列。之后,竞争对手ATI(AMD)才投入了RADEON HD2000系列。
NVIDIA最先发布了对应DirectX 10/SM4.0的GPU NVIDIA「GeForce 8800 GTX」。
ATI和NVIDIA两个公司对应DirectX 10/SM4.0的GPU,在硬件特征上的共同点上是采用了[统一Shader架构] (Unfied Shader Architecture)。
在可编程shader上虽然有Vertex Shader、 Pixel Shader以及新的Geometry Shader三种,但在渲染场景中的使用情况,相对于Vertex Shader,Pixel Shader的负荷,新的Geometry Shader,在应用程序里的使用很有限,并没有太多需要使用的场合。之前的Vertex Shader、Geometry Shader,Pixel Shader数量固定的Shader Unit分配设计,其实浪费比较大。各Shader,虽然确实在完成各自特有的作用,但实际演算内容是以向量或矩阵计算为主体,各Shader间并没有太大差异。
如果是那样,要准备大量的“通用”的可编程Shader Unit,对应不同的运算,把它们作为Vertex shader、Geometry Shader,Pixel Shader来启用,难道不合理吗?
这就是统一Shader架构的基本考虑方式.。
根据这个,顶点负荷大时,Vertex Shader能发挥到更多的效能,Pixel Shader负荷高时,Pixel会发挥更多的效能。
以前的GPU中,一旦Vertex Shader或Pixel Shader任意一方出现瓶颈的话,性能就无法提升,而且,也没法利用空闲的Shader Unit。
统一Shader 架构,因为承担负荷的shader增加,相应的瓶颈就降低了。
为了稍微看的明白,图例上边是以前固定分配方式的架构,下边是统一Shader架构。
虽然ATI比NVIDIA对于DirectX 10/SM4.0 GPU的推出要迟一些,不过[统一Shader架构]实际上在2005年登场的Xbox360-GPU就里实现了,对于新的架构ATI一方要略胜一筹,尽管不是最早推出DirectX 10/SM4.0的GPU,但在统一shader架构方面,ATI其实是更早推出的。
2008年以后~未来的DirectX「DirectX 10.1」和「DirectX 11"之后"」
DirectX 10是在2007年3月被发布的,在旧金山召开的游戏者开发者大会GDC2007上,微软提到了DirectX 10以后的规划。
先是DirectX 10的细小变更(minor change)版的DirectX 10.1发布,Shader Model为4.1版。
作为扩展功能,除了WDDM2.1正式支持以外,扩张了多重采样方式的抗锯齿(MSAA:Multi-Sampled Anti-Aliasing)的采样位置的可编程化,支持多个RenderTarget中个别的进行Present。SM4.0对于Cubemap Array支持机能的扩展进化也完成了。当然,为了统一扩展的步调,虽然10.1里包含了0.1的尾数,但因为微软做了很好的版本控制,并没有更多分支版本登场。
DirectX 10.1/SM4.1包含在2008年3月提供预定的Windows Vista Service Pack1里,安装SP1后就可以使用。目前对应DirectX 10.1/SM4.1的GPU有AMD(ATI)Radeon HD 3000系列,S3 Graphics也发表了对应的Chrome 400系列。不过,另一方面NVIDIA表示不会推出对应DirectX 10.1/SM4.1的GPU。于是事实上,对于DirectX 10的支持上,AMD(ATI)和NVIDIA的决策开始出现了不同。
【千里马肝注:2008年上半年谣传称,NVIDIA在年底或者明年年初拿出一款支持DirectX10.1的显示卡,但NVIDIA公开辟谣称:DirectX10.1相比DirectX10变化太少,NVIDIA会直接提供对DirectX11的支持。DirectX10.1对NVIDIA显示卡性能提升无任何帮助,所以NVIDIA并没有必要去迅速跟进。】
AMD的ATI Radeon HD 3870,最早对应DirectX 10.1/SM4.1的GPU。
S3 Graphics的Chrome 440GTX,以比主流的对应DirectX 10.1/SM4.1 GPU更便宜的价格吸引购买者。
并且,在这个时候,微软预定发布DirectX 11。
对于DirectX 11和之后版本中,会实现那些功能虽然还未定,但明确的是会带来几个大的变革。
1个是加入可以把GPU更加灵活利用成通用处理器的结构。特别是似乎最初要计划作为媒体处理器的流处理器在此以后会更容易被使用。具体的还讨论了,把向GPU输送的向量数据结构朝着更灵活的目标扩展,用GPU把处理后输出的数据流在每个处理结果上做交换,分配在多个缓冲buffer的结构。
还有,为了对应3D图形以外的科学技术计算用途,对应的演算精度从现在的单精度提到双精度64位小数(FP64)。在性能性方面进行那样的对应就不用说了,为了把那样做成通用处理器的性能强化,应该要寻求在GPU上的内存随机存取性能的强化和缓存系统的改良的要求。
并且,除了DirectX 10/SM4.0的Geometry shader以外,在DirectX 11以后的渲染管线上加入了新的处理Stage,这个就是[Tessellation]阶段。Tessellation如果简单的说,是遵从某种方法把多边形分割的结构。从DirectX 9/SM2.0开始开始支持Tessellation,但限定在特定的GPU上使用,并不是主流机能。但是,在DirectX 11之后,这个被规定作为正式的标准机能。还有,进行Tessellation的单元,也就是[Tessellator],最初并不是可编程Shader,而是表明作为固定功能单元提供的方针。顺便说下,虽然现在并不是DirectX的规格,不过Radeon HD 3000系列搭载了作为固定机能的Tessellation单元。这个会不会成为DirectX 11的正式配置现在还不明了。
Tessellator 虽然是是固定单元,但是作为替代,把进行多边形分割时的控制点在可编程上进行控制,新设了被称为(Control Point Shader)的第4个可编程shader。这实际上应该说是辅助Tessellator工作的可编程shader,DirectX 11以后的版本,也有进一步在未来的DirectX世代中被整合的可能性。
DirectX 11 以后的渲染管线想象图
至此,在发表了DirectX 11之后,为了从困扰实时3D图形多年的课题的透明对象的绘制顺序的束缚中解放,把「A-Buffer」的概念用某种形态导入。
实时3D图形里,为了避免半透明绘制不正确的情况,需要把3D透明物体从远往近进行排序。当使用「A-Buffer」,除了在渲染时Shader算出颜色以外,要把轮廓mask信息和深度值信息等一起写入到FrameBuffer,在最终绘制时,虽然还是要绘制成合乎逻辑的影像,但对于渲染有完全排除绘制顺序依赖性的优点。
本来A-Buffer是乔治•卢卡斯带领的Lucas Film设计成离线渲染用的技术,是个在渲染开始时,在GPU一方无法预料那个复杂性的结构。所以,那个实时/硬件实装就被预想成相当复杂的结构。但是,A-Buffer结构对于3D应用开发者和3D引擎设计者来说,能大幅度的减少软件方面的负担,它的实现被寄予了相当的期望。
DirectX 11登场时期还不太明了,还有,从第4个可编程shader被投入考虑,绝对会是可编程shader的版本上再加1,成为SM5.0。
A-Buffe的感念图,在"A"上加入了anti-aliased, area-averaged accumulation等多个含义。