API的—小步图形工业的一大步管窥Directx 11与通用计算技术

2009-10-27 10:22
微型计算机 2009年16期
关键词:着色器开发者顶点

陈 可

从Directx 9到DirectX 10,微软几乎将API打破重来以构建全新的渲染体系,Directx 10也成为了第一种影响硬件设计的图形API——统一渲染架构代替传统的分离渲染,从而赋予GPU更高的渲染效率和可编程能力,也为通用计算提供良好的基础,之后的DirectX10.1就属于功能上的小升级。而到DirectX 11,微软引入了更多的新技术,但同时又保有DirectX 10.1的全部特性,换句话说,DirectX 11实际上就是DirectX 10.1的扩展集,所有DirectX 10.1硬件所遵循的API对于DirectX 11同样适用。

对用户而言,这样的设计在兼容方面很有好处:无论软件还是硬件,都可以完美地向后兼容。现行的Directx 10游戏,在Directx 11环境下都可以正常运行。而对软件开发者来说,包容的设计使他们能够非常平滑地过渡到DirectX 11,而不需要像DirectX 9到DirectX lO过渡那样突兀和漫长。这样一来,软件厂商可以直接转入DirectX 11技术体系,这对于后续产品开发是非常有利的。不过,DirectX 11不仅只是简单的升级,它带来相当多的新颖特性,比如引入通用计算着色器(Compute Shader),允许GPI以事更多的通用计算工作,而不仅仅是3D运算,这可以鼓励开发人员更好地将GPU作为并行处理器使用。还有就是引入多线程渲染、提高GPU的工作效率t新增的镶嵌技术(tessellation)可以帮助开发人员创建出更为细腻流畅的模型,实现高质量实时渲染和预渲染场景。

首先我们来看DirectX 10体系的渲染架构,DirectX 10加/LGeometry Shader(几何着色器,简称GS单元)设计'让GPU可以直接处理模板阴影特效(Stencfl Shadows)、动态法向量图(Dynamic cube maps)及位移贴图(Displacement mapping)等操作——过去这些操作是由CPU来完成的。此外,Geometry Shader最高可支持1024个顶点处理,同时可把不必要的顶点数据删除,这两项功能使得绘图运算将较以往更具效率。除了纳入几何着色器外,DirectX 10的渲染流程其实并没有改变,顶点渲染与像素渲染依次进行,只是在硬件层级上,渲染工作不再由独立的顶点着色器、像素着色器进行,而交给通用的统一着色器(或者说统一渲染单元)。

现在我们接着来看看DirectX 11的渲染管线。最引人注目的变化就是:在顶点渲染之后,DirectX 11新增了外壳着色器(Hull Shade~简称HS)、镶嵌器(Tessellator)和域着色器(Domain Shader)三个新的管线;而在像素渲染环节,DirectX 11则新增了计算着色器(Computer Shade,简称CS),这些新增的部分也就是DirectX 1l的关键所在。

在DirectX 11中,新增的Compute Shader(Cs)计算着色器拥有核心地位。与DXl0中引入的GSYh何着色器不同的是,CS并不是渲染管线的一部分,它的主要用途在于增强GPU的通用计算能力。

我们知道,现在的GPU能够被应用于某些通用计算工作,譬如在高并行计算应用中,GPU就表现出十倍于CPU的卓越能力。对游戏开发者而言,经常出于某种需要希望GPU能执行通用计算指令,但以往的渲染结构却对GPU制造了诸多障碍——比如说,程序员可以在一个像素着色程序中强行加入通用算法,但却无法随意利用诸如树形结构之类的数据结构,这就给程序员带来很大的麻烦。因为要在像素间共享数据的过程非常繁琐,先绘制三角数据结构、再加入贴图是唯一的解决方案,但这将严重影响GPU的渲染性能。而在DirectX 11和CS着色器的帮助下,未来的游戏开发者将不再受困于此,他们可以直接越过复杂的数据结构、并在这些数据结构中运行更多的通用算法。而这些算法将由CS着色器专门负责,不会给渲染单元带来额外的负担。

CS代码可以做到高度灵活,它们可以支持随机读写、不规则列阵(而不是简单的流体或者固定大小的2D列阵)、多重输出,并可根据程序员的需要直接调用单线程或多线程应用。CS体系中拥有32Kb容量的共享寄存器和线程组管理系统,具备可执行无序Io运算的能力。总之,CS可以带来几乎无限的新型应用,关键在于开发者能够在多大程度发挥它的功效。

在获得灵活性的同时,CS也会带来一些性能损失。由于单线程任务现在无法以像素为单位,所以这些线程将会丧失几何集合功能。从技术上讲:虽然CS程序依然可以利用纹理取样功能,但是原本的“自动三线LOD计算”将会丧失自动功能,程序员必须指定LOD指令。另外,一些并不重要的普通数据的深度拣选l(depthculling)、抗锯齿(anti-aliasiug)、a混合(aIpha blending)和其它运算不能在一个CS程序中被执行。

CS可以为开发者带来多种多样的灵活渲染,这项先进技术应该正中游戏开发商们的下怀:它们的兴趣大多是寻求先进技术来增强游戏引擎,比如增强抗锯齿性能或无规则透明度的性能,带来更先进的DeferredSh8ding(延迟着色)技术、后处理效果(post processing effect)等等,CS都可以大放异彩。除T_k述这些特殊的渲染应用,游戏开发者可能还希望让GPU完成诸如IKnnversekinematics,逆运动学)、物理计算、人工智能计算等过去由CPU完成的通用计算,而利用CS在GPU I-执行这些算法时,可以获得非常理想的效率。

早在XBOX 360平台上,ATI就带来了一项名为“Tessellation(镶嵌化)”的新技术。这项技术的用途就是提升硬件的利用效率、用最低的资源获得最好的渲染效果——简单点说,我们可以将它比作数据传输中的压缩技术。

Tessellator可以将原始的图形分成很多更小的图形,然后它还可以将这些小图形组合到—起、形成一个新的几何图形,这种几何图形更复杂,当然也更为逼真。打个比亢Tessellator技术可以让某个图形变成立方体,并通过旋转让其从底部看起来像是个球形,而这两者实际上都使用相同的数据,达到节省资源的目的。

在DirectX 11系统中,Tessellation处理过程包括外壳着色器(Hull Shader,简称HS)、镶嵌器(Tessellator)和域着色器(DomainShader)三个组件,其中HS外壳着色器负责接收琐碎的图形数据和资料,镶嵌器(Tessellator)只负责分块处

理,它根据HS的指令要求生成大批量的、确定数量的点,然后将数据传送给域着色器(Domain Shader),再由它来将这些点转换成3D处理中的顶点,最终就生成了相应的曲线和多边形。

如果开发者能够娴熟地运用镶嵌化技术,那么就能够极大程度提升游戏性能、或者说在保有当前性能的条件下显著提升画面品质。这一点我们可以从下面的对比中看出来:在采用传统高细节模型渲染时,原始模型需要动用巨量的三角形,数据量十分之大,最终获得354fps的渲染性能。而采用低细节模型和Tessellation技术来生成相同的效果,所需的数据量与前者简直不成比例,渲染性能可达到821.41fps,两者对比非常悬殊。然而,镶嵌化技术也不是万能的:其使用的是一项完全固定的单元,不具备任何可编程能力,这就意味着开发者没有丝毫回旋余地。这一点看起来与图形技术的发展方向背道而驰。微软之所以在DirectX 11中纳入这项技术,很大原因就是因为Tessellation确实具有显著的效果,以至于微软无法拒绝。

双核处理器早已经成为PC系统的标准配备,三核、四核更是进入主流市场,然而,现在只有为数不多的游戏产品能够对多核平台提供良好的支持,原因在于为多核平台编程十分困难,只有高水准的开发者才能够胜任,但显然并不是所有的游戏公司都有这样的一流好手。因此,直到今天为主,仍有很多数游戏都还只能在单线程下工作,即只能支持CPU的单核运作,其它核心的计算力无法得到充分发掘。

只要开发者采用DirectX 11作为开发平台,那么代码本身就能直接支持多核平台,DirectX ll在底层接管了多核平台的资源分派问题。DirectX 11预示着多线程游戏真正步人现实,我们才可以说多核心处理器被真正派上了用场。对于一套四核游戏平台,当某个渲染场景中有^像和它的三个镜像,DirectX 11就会启动四个线程进行并行处理,效率显然要比目前单线程处理的方式快上数倍!而更令人兴奋的是:多线程技术不仅适用于DirectX ll平台,它同时也能够让现有的DirectX10硬件受益。比如说基于DirectX 11开发的新款游戏,可以很好支持多线程,而当它在DirectX 10硬件平台上运行时,多核优化的机能依然有效,前提是AMD和NVIDIA必须为各自的DXl0硬件开发出相应的驱动软件才行——就目前看来,这项工作的进展非常顺利。

猜你喜欢
着色器开发者顶点
过非等腰锐角三角形顶点和垂心的圆的性质及应用(下)
基于UE4 实时射线追踪技术的研究与探讨
基于Unity Shader石油泄漏现象模拟的研究
基于IMx6的opengl图形着色器开发研究
关于顶点染色的一个猜想
iOS开发者调查
iOS开发者调查
栝楼产业开发者谢献忠
基于可编程渲染管线的雷达图像分层模型设计与实现
一个人在顶点