ZOL上一篇GPU相关介绍的分析(1)

Zol总的来说还是与pconline有些不同,比如前者更痴迷技术细节,而后者更看重市场与应用。比如今天想分析的这篇顾杰同学的深入分析《GPU大百科全书》就是其中的代表,此文让我想起了很久前一篇名为《深入了解内存》的译文,都是那么技术化而又读来让人兴趣盎然,这才是好的“技普”文章(自己瞎取的名字,相对于科普而言)。这类文章既能让我们走进越来越专业的技术分工,又能时不时跳出技术细节,看看这些技术对我们实际生活和用户体验的影响。没有太多故作的高深,却能从不同角度给不同目的的读者以启发。希望将来我也能写出这样的好文来。

回来看看《GPU大百科全书》这篇文章,我读这篇文章的目的主要有三个:其一是很功利的,为了写一份申报书并完成当前的项目中利用GPU优化性能的任务;其二比较超脱,对图形图像处理细节和硬件实现流程的兴趣,总想分析GPU数据流的处理过程和其中对大规模并发处理的实现机制;其三就有些“其翼若垂天之云”了,希望能做出CPU和GPU融合的探索。该文目前尚处在连载过程中,因此就一篇一篇学习和分析,如果有更新的或者更有价值的资料将一并记录下来,以待自己查阅。那么,首先来看看系列的第一篇《美女、方程与几何》。

首先,作者从两位游戏MM引出了图形图像学的本质-方程式,进而用“4D坐标的裁剪矩阵”和“典型定点光照模型”这两组相对直观的方程式分别解释了计算机如何表示“一个点在视场空间中的位置”以及如何“利用插值的方式计算生成多边形中某点的光照值”。老实说这一段吓住了我,不加引号的话,我觉得自己都难以句读,想起了商务出版社垃圾版本的《纯粹理性批判》。

然后,作者给出了用户所见的动画效果与上述方程式的联系:即游戏人物面部表情的变化,也就是物体的外部形变,其实质就是多边形的变化,也就是顶点坐标的变化(这里我理解作者仅仅是为了单纯化问题,其实还有很多材质的变化,否则看起来就很机械了),而顶点坐标的变化是可以通过方程式描述的。就这样,作者架起了图像动画效果与方程式之间的关系,有意思吧,就是喜欢这样深入浅出的文章。

接着,作者肯定了正常人们天然的对方程式的厌恶,并将读懂这繁杂方程式的工作交给了该文的主角(同时也是本文的主角)-GPU,人和物一样都有自己擅长的事情,或者说命运安排的事情,唯一的不同仅仅是是谁在安排。需要说明的是,该文在此处引用的一张名为“DX10几何处理过程”的图很有概括性,该图将整个GPU渲染的数据流概括出来:From CPU->Vertex shader->Geometry shader->Raster->Pixel Shader->To Framebuffer。多么简练的步骤,也为该文的写作脉络奠定了基础。所谓shader,百度名片(什么时候出了这个东西?)里的解释是“渲染或着色,是一段能针对3D对象进行操作、并被GPU所执行的程序。有些负责对3D图像表面进行处理,有些负责3D对象纹理进行处理。根据操作对象的不同,可分为对顶点进行各种操作的Vertex Shader和对像素进行操作的Pixel Shader”。说的还是比较清楚的,核心意思就是:Shader就是一段GPU执行的程序,操作顶点和像素。

之后,作者指出完整的几何单元包括:完整的setup、多边形调节、基本光照调整以及相关材质调节等。通过几何单元的动作,就可将抽象的方程式还原成空间几何体,并按照程序控制将这些几何体放置到合适的位置,最后通过微调模型外形实现不同的效果。之后,作者开始梳理GPU发展的历史:首先是CPU主导的年代,那是GPU完全听命与CPU,仅负责transform和lighting,而顶点位置,也就是几何形状都是CPU负责。其后(NV20时代),由于图形日趋复杂,CPU无法处理所有的顶点,GPU也就利用自身的Vertex Shader实现了对几何图形的调节(比如面部表情),而CPU仅负责生成顶点。最后,到DX10的时代,GPU通过Geometry Shader实现了所有Shader的统一,最终独立的完成3D渲染,从此,人们才彻底将对方程式的解读的包袱丢给了GPU。

最后,作者完整的介绍整个3D图形生成的过程,如下:首先,CPU“泵送”顶点信息(CPU负责生成模型的各种顶点)并发送给GPU。然后GPU将这些顶点坐标“描绘”到人可以直观看到的可视空间中。此后,setup单元利用正确的规则将顶点连接起来(三角形),从而形成物体的外形。然后,GPU根据方程式将部分顶点操作到新的坐标(该文中的“扯动”很有现场感)实现动画效果,由于仅仅局部顶点需要被操作,所以降低了CPU生成顶点的开销。接着,GPU的Vertex Texture和Vertex lighting单元通过加载“带光照信息的底层纹理”实现对模型的蒙皮和打光操作,到此常规几何过程基本结束。

但由于人们对图像细节的偏执,对越来越精确、细致的几何体的需求也急剧提升。CPU再也无力承担“泵送”顶点信息的义务了。因此在DX11时代,新的Geometry Shader搭配Tesselation(直接翻译为“镶嵌”,意思是细分曲面),通过GPU自己对曲面图形的细分(由镶嵌系数决定),生成新的、更加精细的顶点位置,此时CPU仅承担基本顶点的生成工作。

上述镶嵌过程可以在增加3D图像精细度的同时,解放了部分CPU资源。但这还是没有办法降低多个模型同时生成时(比如千军万马中每个士兵的3D模型)所需要的顶点量激增问题。为此GPU引入了Vertex instance和DrawInstance函数,通过创建通用模型并将该模型的基本信息“封装成一个位于基础索引内/类的只读信息包”(也就是模板了)。最后通过LOD修改,实现新模型的创建。

上述就是该文第一篇连载的内容。写得比较翔实,最重要的态度!该文作者的态度是在太好了,总是为了读者考虑,千方百计为读者真正理解技术思路而工作。大量运用比喻和图片,完全没有故作高深,同时还给想要深入的读者以启发。唯一有些问题的是结构还比较随意,当然,本来就不是论文,结构和逻辑上的过分追求只能适得其反。

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s