【西川善司】GPU和Shader技术的基础知识(转)(4)

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系列。

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等多个含义。

--电子创新网--
粤ICP备12070055号