jquave 发表于 2022-8-4 21:45

GPU大百科全书:第一章 美女、方程与几何

十年前,还在读研的时候,由于课题需要开始接触 GPU 编程。那时讲 GPU 底层机制、架构原理类的资料非常少,中关村在线顾杰老师的《GPU大百科全书》系列连载文章是当时为数不多的参考文献。喜欢探究底层原理的我,如获至宝的把这些文章读了又读,虽然当时看不懂,还是喜欢看。

首先是因为顾老师的文笔流畅,像讲故事一样将 GPU 的发展史娓娓道来,其中很多以当时的热门游戏为例,喜欢游戏的同学千万不要错过;其次是因为顾老师的这一系列文章涉猎广泛,真可谓是“大百科全书”,从图形渲染到通用计算,从架构演进到 A & N 纷争,从计算核心到通信总线,无所不谈,无所不包;最后,感觉其中很多话题有推测演绎成分,难免存在疏漏甚至谬误,这一点顾老师在系列前言中也已说明。如果你喜欢探究 GPU 的底层原理,相信这些文章可以以给你启迪和共鸣。

草蛇灰线,浮脉千里,一饮一啄,莫非前定。NVIDIA 当前在 AI 生态的统治地位早在二十年前就埋下了伏笔 。看完顾杰老师的这个系列文章,相信你也能找到其中的脉络和线索。这里把顾老师的原文转载如下,作为学习笔记,也希望能给需要的同学提供更好的阅读体验。

原文链接:https://vga.zol.com.cn/234/2347871_all.html#p2347871前言:当你酣战在星际2的时候,或者当你在艾泽拉斯游历的时候,你有没有想过,眼前的这些绚丽的画面究竟是怎么来的呢?也许对大多数人来说,GPU 对于图形的处理过程并不是那么重要,但总会有些人,比如屏幕前的你,会像我们一样对周围的事物充满好奇。求知欲是人类最根本的欲望之一,搞明白 GPU 究竟在干什么,以及我们眼前绚丽多彩的画面究竟是怎么来的,对于你我来说都是很好的满足求知欲的事情。所以,GPU 大百科全书来了。
这是一本不算厚,不算旧,并未囊括古今天下之事,甚至还可能充满了各种谬误的“大百科全书”。但是我们相信,GPU 大百科全书一定会像 ZOL 显卡探索与发现频道的其他东西一样,能够对你了解 GPU 和图形世界的各种现象,以及它们背后的本源提供一定的帮助,甚至还能引起你与我们思想的共鸣。
好了,让我们翻开这本 GPU 大百科全书,来看看关于 GPU 的故事吧。从哪里开始呢?对,就从 GPU 的第一部分,几何单元开始吧。


沉鱼落雁

今天的开篇有些特殊,首先给大家带来的,是两位美女。
“下界的法尔希——我们就是在那里与命运相会了。” 充满谜团的少女,在几百年前曾与芳一样是古兰·下界的路希,在下界完成了使命,与芳一同成为水晶,一直沉睡在神殿的路希之间中,直到几百年后与芳再接到法尔希的使命并且苏醒,醒来后便发现自己已在茧中,承担着下界法尔希赋予的某种非常重大的责任,因为与塞拉年龄相近所以比较合得来,同时似乎是因为她而导致塞拉萨兹的儿子遇难。在故事中担任重要角色和线索。 



最终幻想13美丽的女性角色——香草

欧尔巴·戴亚·香草,最终幻想13最受欢迎的女性角色之一,红色双马尾,着装充满民族风,香草是一位给人以独特感觉的少女。尽管在同伴面前总是表现出一幅活泼开朗的样子,可内心却暗藏着面对残酷命运的强烈决心。她轻快的舞步还有那一眸一笑都牵动着许多男性玩家们的心。



欧尔巴·戴亚·香草是无数男人心中的梦想

什么?你不喜欢日韩的?没关系,我这里还有欧美的。
勇敢,坚毅,擅长飞檐走壁和射击,同时身材火辣的性感美女劳拉·克劳馥,曾经伴随着无数男孩们一同成长。随着古墓丽影系列的不断发展,劳拉的外形也更加的丰满和圆润,从单纯的热辣变的更加富有韵味了,她……



勇猛果敢的劳拉和她的古墓丽影

等等,这些美女确实沉鱼落雁闭月羞花,但她们和GPU、方程还有几何这些东西有什么关系啊?
美女显然不是白来的,她们美丽的外表以及婀娜的身姿背后,都附庸着一个讨厌的东西——关于几何的方程。而这些方程,正正是穿起美女、黑锅和几何关系的锁链。
该死的方程

要描述一个东西为什么讨厌,最直观的方式就是把它令人不爽的一面展现出来。方程令人不爽的特性,简直可以说太好表达了。



4D 坐标的剪裁矩阵

比如说这个裁剪矩阵,它可以用来表征某个点在视场空间中的位置,通过透视除法操作将坐标相对于摄像机视场的位置以数学的方式表达出来。对于常用的图形处理过程来说,这一步是最基本的也是必须的。



典型定点光照模型

如果说刚刚的那个矩阵还不算很令人困惑的话,这组顶点光照方程可以说绝对能让屏幕前 99% 的人感到一阵眩晕甚至进入自我保护状态了。该方程通过插值的方式计算出了生成多边形中某点的光照值,计算结果将被应用于纹理中以表达物体外表的基本光照关系。
啥?请讲汉语?看来我的展现过程已经可以结束了,恭喜你,你已经发现方程令人极度不爽的特性了。



反正我解不出这个方程,你呢?

没有人喜欢方程式,因为他们枯燥,晦涩,充满了蝌蚪一样扭曲的符号,把它们与现实世界联系起来不仅困难,而且极度痛苦。也许对数学家而言,方程式是一组又一组充满了和谐音符的华美乐章,但对常人来说,方程式除了杀伤脑细胞之外,似乎没别的意义。史蒂芬。霍金在其《时间简史》中有一句名言:“有人告诉我,我在书中的每一个方程都会使这本书的销量减半”,可见方程式对常人的杀伤力是多么的大。



顶点坐标与位置

可是,如果没有这些方程式,香草也好劳拉也罢,都没有可能出现在我们的眼前。
沉鱼落雁和该死的方程

香草的可爱和灵动,大部分来自她调皮且非常细腻的表情变化。姣好的面容配上传神的表情语言,人物的性格仿佛跃然纸上一般。劳拉的风韵则来自她妙曼性感的身姿,当她在古墓里辗转腾挪飞檐走壁时,玩家能够体会到强烈的柔韧的美与力量的美的结合。



身材除了性感更多了许多风韵的劳拉

问题是,她们都是假的,完全虚拟的人物。香草也好劳拉也罢,她们并不是找来了两个非常漂亮的演员扮演的,她们是完全不存在的,只活在内存中的角色。要让她们栩栩如生的来到屏幕前与你相会,就必须依仗方程这个该死的工具。



球坐标路径问题模型

首先,我们需要设立一系列方程,就像上面那些扭曲到极点的图案那样的,用它们来描述香草面部表情的细节之类的东西,比如说挑逗的眉毛,微微微翘起的眼角,或者下垂的双颊以及撅起的小嘴。这些表情背后都伴随着面部外形的改变,或者说物体外形的改变,而对于图形学来说,外形的改变就是多边形的改变,进一步来讲就是顶点坐标的变化。而顶点坐标的变化,是可以通过方程来描述的。



坐标描述方程

建立好方程之后,可爱的香草以及她的性格也就出现在了抽象的世界中,只要通过改变这些方程的参量,香草的一举一动都可以按照剧本的要求展现出来。虽然香草此时还只是一大堆纠结在一起的烦人方程,但只要你去把方程的结果表达出来然后输出到屏幕上,香草就能来跟你作伴啦。



不解方程你就永远都看不到我呀

什么?你不去?你问为什么我不去干这个令人头晕恶心的工作?我才不去呢,你以为我傻啊,那些方程看起来好像都要纠结到一起去了,我就算想把他们拆成能看的图形也没那本事啊,这种苦力的差事我才不干呢。
想见香草就要去跟方程战斗,可这个黑锅明显你我都不愿意去背,怎么办?   
黑锅谁来背

其实在有关方程的问题上,要做的事情不止翻译这么简单。首先要把方程的结果转化成坐标,然后还要对这些坐标进行处理,把它们转化成实实在在看得见的点,再把这些点放在正确的位置上,对他们进行细腻的调整已达到最佳的效果,最后在把它们连起来形成表面。这种说起来都有些拗口的活儿,你我这样的肉眼凡胎能耐再大也是干不成的,我们只能寄希望于有谁能出来帮我们背掉这口巨大的黑锅。



DX10几何处理过程

好人总是有的,能出来替我们背这口黑锅的,就是劳苦功高的GPU先生。



完整的几何引擎

现代GPU的几何单元具备完整的 setup、顶点调节、多变性调节、基本光照调整以及相关的材质调节等多种功能。通过几何单元的动作,程序员创造的抽象数学将被还原成实在的可视空间几何体,这些几何体还会进一步的根据程序要求被调整到适当的位置,已达到微调模型外形实现不同效果的目的。



第一块三屏输出显卡——Parhelia512的几何单元

用正常的汉语来说,就是几何单元替我们看懂了那些晦涩的数学公式,计算了它们的结果,然后在我们可以看到的地方把那些结果所表示的点全部标了出来,接着再根据程序的要求调整它们的位置,最后把这些点全部连起来形成了物体。香草可爱的笑脸,劳拉凹凸的身段,都是这么从那些扭曲的符号中走来的。   
背黑锅的黑历史

要说真正的的几何处理能力,其实GPU一开始是不具备的。我们都知道,GPU 的前身显卡所充当的角色曾经是单纯的画笔,CPU 指哪里,显卡就画哪里,CPU 让画什么显卡就画什么。第一代 GPU 革命虽然让 CPU 丧失了对Tranform 和 Lighting 的霸占,但第一代 GPU 依旧不具备调节完整的几何调节能力。顶点的位置依旧是 CPU 说了算,所有关于几何形状的计算全部由 CPU 来完成,而且一旦确定就不能再行更改。



顶点的生成不在图形流水线过程之中

后来,随着模型精度的一步步提升,顶点的数目也跟着多边形的增长一步步的激增,终于到了 CPU 无法负载的地步。于是,第二代 GPU 非常彻底的断灭了 CPU 复辟夺权的企图——它通过 Vertex Shader 彻底拿走了 CPU 调节几何的能力。现在,CPU 就只剩下最原始的生成顶点这一功能了。



第一代集成VS单元的GPU——NV20

Vertex Shader 的出现,让 GPU 第一次有了独立自主的调节模型内顶点的能力,也让 GPU 内部出现了像素处理和Trangle Setup 之外的新鲜事物。第一代 VS 单元即可实现通过快速实时的顶点调节来模拟真实面部表情的能力,NVIDIA 伴随 NV20 发布的 Tech Demo——“Zoltar the Magnificent” 第一次向我们展现了实时调节顶点对图形真实感的重要性。可以说今天香草的一眸一笑,都是当年 VS 出现的功劳。



香草的一眸一笑都来自VS的调整

第一代的VS虽然让GPU具备了一定的几何处理能力,但他背黑锅背的并不出色,时不时的还要CPU过来扶一把。直到DirectX 10将所有Shader执行单元统一,并由此带来了更加广泛的Shader应用领域之后,Geometry Shader的出现才让GPU彻底替我们背了跟数学缠斗的黑锅。
背黑锅也是一门技术活

标准的几何流程是一个比较复杂的数学转换过程,既然霍金说加一个方程就会让读者减半,那我就掠过那些恼人的蝌蚪文和教科书式的说教,改用群众们喜闻乐见且通俗易懂的普通汉语来进行过程的描述吧。请相信我,我一定会让你明白发生了什么的。



霍金的话我觉得很有道理

一个完整的几何过程是以 CPU 泵送顶点信息为起点的。3D 图形程序开始运行之后,最先忙活起来的是 CPU,它会根据程序的需要生成构成模型的所有顶点,然后略带怨气的将这些顶点的坐标发给 GPU,在几何单元接收到顶点坐标之后,将香草从方程世界解救出来的作战任务就正式开始了。



最终幻想13的角色建模过程

首先是“描点”,几何单元会按照我们看得见的位置,也就是屏幕的位置为视线的起点,以此出发来设置一个可视空间,构成香草柔美外形的所有顶点都会被撒在这片空间之中。由于CPU发送过来的关于这些点的信息只不过是他们在空间中所在位置的坐标,因此几何过程的第一步动作,也就是把这些点按照坐标要求摆放出来的过程,就成了沟通数学和人类世界的重要桥梁。



顶点输出过程

在顶点被摆放妥当之后,setup 单元接下来要做的事情就是连接。按照正确的规则将顶点连接起来之后,物体的外形也就被确定下来了,这样,我们的香草就有了实在的外形“骨骼”。当你抬头仰望星空时,你看到的永远都只是一颗一颗的星星,只有把它们连起来,星座才会出现,setup 输出三角形的目的也在于此。



多边形输出过程

完成多边形的构成之后,我们就来到了整个步骤的灵魂——顶点的操作了。我们前面说过了,香草面部表情的细节,比如说挑逗的眉毛,微微微翘起的眼角,或者下垂的双颊以及撅起的小嘴,为每一帧画面的不同表情乃至不同外形去规定以及生成一套新的模型显然是非常不划算的事情。以上这些要求其实都可以通过对对应位置的顶点进行操作,“扯动”多边形形状来完成。因此程序员会事先创造出香草的表情,然后通过方程规定好这些表情中特定顶点的位置,而几何单元所要做的,就是在保证其他绝大部分顶点和模型位置不变的前提下,根据方程的规定将这些顶点操作到合适的位置,这不仅可以大幅降低 CPU 生成顶点的次数和数量,更可以非常灵活自由的实现程序员想要的外形效果。因此顶点操作这一步,可以说是整个背黑锅过程最根本的核心。



光照蒙皮纹理

进行完上述诸多操作,我们的香草就有了外形,接下来要做的就是蒙皮和打光,Vertex Texture 和 Vertex Lighting会按照程序要求提前访问材质库,并为整个模型附上最基本的带光照信息的底层纹理,就好像把框架模型变成一座石膏雕像一样。到这一步,常规的几何过程基本上就算完成了。香草就此从满是方程和符号的抽象的世界里具体化出来了。
锅越来越黑了

我们生活的世界是不断演进的,一切都在一刻不停的发展着,不论是人们的需求还是由此产生的技术进步都是如此。这直接导致了一件事——随着人们需求的逐步提升,GPU 要应对的几何环境,越来越复杂了。



由于可操作顶点不足,香草的这个悲伤表情就不是很明显

回到香草这里,我们的大美女吸引人的地方就是一眸一笑,但 CPU 生成的顶点数量在很多时候都是不够的,过少的顶点不仅会大幅降低模型精度,影响香草姣好的面容,更会因为调节点过少而影响表情表达的精度,让那些本该传神的表情显得僵硬。于是,我们有了增加顶点的需求。



更高的多边形数量能大幅提升图形表现

在一些其他的游戏,比如说时下火热的幕府2全面战争中,小兵甲乙丙丁不再是没有存在感的炮灰,他们的音容笑貌以及一举一动都会被真实的展现在屏幕前。这些细腻的表现如果有一两个,或者哪怕有十个八个都不怕,问题是幕府2全面战争所挂的名号是“全面战争”,成千上万个音容笑貌一举一动都很细腻的角色混在一起用刀枪剑戟火铳大炮什么的交流感情,他们的所产生的顶点压力之大,足以让任何传统的对顶点的操作手段都脸色发青。



能观察每一位士兵的幕府2全面战争

很明显,代解数学公式并把它们反映到显示视觉这个黑锅可不是那么好背的。但同样明显的是,人类的需求是无止境的,在实现真正的视觉虚拟现实之前,模型的精度需求会不断的提升,顶点数量会没完没了的增加,对他们控制的难度也会越来越大,除非数学死掉或者全人类一瞬间都进化成了能看着方程组脑内渲染的怪物,否则几何这口黑锅只会越来越黑。
背锅的命运无法逃避?那就微笑着面对吧

“尽管像素和像素着色器更加吸引人们的目光,但几何体才是一切的根源所在。没有了几何体,我们将发现光照、阴影和反射毫无意义。因为提高底层几何体的复杂度,将同时提高像素的质量。” ——Evan Hart对于几何模型精度的需求,永远是图形需求最重要的组成部分。模型精度的增长所带来的好处是显而易见的,但由此带来的顶点负载也是 CPU 断然不可能承受的。CPU 不肯背这口新的黑锅,GPU 就只好硬着头皮顶上了。



模型细节演进

于是,在 DirectX 11 GPU 当中,我们发现了几何部分的重大变化——除了熟悉的 setup 之外,Tesselation 和功能更加完善的 Geometry Shader 来了。



曲面细分过程

区别于以往的传统的处理方式,新的 Geometry Shader + Tesselation 允许 GPU 自己生成新的顶点并完成设置工作。现在 CPU 还是干以前一样的工作,基本模型的顶点还是由他来生成,而且数量也没有变化,只不过当顶点再次流入到 GPU 之后情况会发生些许变化。现在的几何单元会先查看程序中是否包含一种叫做镶嵌系数的新东西,如果没有,则几何单元重复上面的香草解救大作战;如果有,则几何单元将会进入一个全新的状态。



Hull Shader操作实例

首先,CPU 生成的模型依旧不变,几何单元在阅读了同顶点模型信息一起传过来的镶嵌系数及方程之后,会先让Geometry Shader 中的 Hull Shader 对曲面要求进行解析,按照要求寻找其中的控制点,然后让 Tesselator 单元根据系数的要求生成全新的点。新生成的点全部在旧有顶点范围之内,当这些新生成的点被 Tesselator 单元送出之后,Hull Shader 会根据程序的镶嵌说明把它们送到新的位置上并完成必要的调整,最后再由 Domain Shader 把Hull shader 调整好的镶嵌点变成新的顶点输送给 setup。



DX11几何流水线过程

好像很神秘的曲面细分过程,其实就这么简单——程序员对模型的外表不满意,于是就在平平的多边形的里面生成新的点,再把这些点稍微拉离原多边形的平面,最后再把这个点跟多边形原有的顶点一连,完事了。



曲面细分过程详解

这里有一点值得注意,我们的原始的模型依旧没变,香草还是香草,她不会因为这些新的顶点而变成香菜。但如果镶嵌系数过大,香草也许会变胖,或者好像去了一趟韩国而且失败而归之类的……因此镶嵌或者说曲面细分过程需要适度,这样既可以保证模型细节的进一步细腻化,又不会因为新加入的细节过于明显而导致喧宾夺主并显著改变原始模型的基本特征。
怎样背黑锅才最快

应付了曲面,接下来我们要面对的就是另外一个更黑的锅了。曲面细分可以缓解 CPU 生成顶点的压力,让 200 万多边形的模型轻松拥有 2000 万多边形才会有的细腻外形。但即便没有曲面细分,200 万多边形到 2000 万多边形也不过是翻了 10 倍,对这种需求 CPU 虽然不一定可以流畅的予以满足,起码还是存在执行的可能的。而如果场面上需要 1000 个人物同时出现,其模型总量显然会成百上千倍的激增,为每一个人物都单独生成模型显然就不现实的。CPU 也许可以应付 10 个香草的需求,但 1000 个兵哥哥人人都要来的话,绝对会把 CPU 彻底压死。



一个一个的为这些士兵生成模型很不现实

GPU 是坚韧的,既然生活必须面对一个又一个的艰难险阻,那我们就积极去克服它们,健康向上的活着吧。



逐步增加的几何压力

因为有积极的克服困难的心态,所以我们有了顶点引证(Vertex Instancing)和 DrawInstanced 函数。



顶点引证实例

要明白引证的原理其实并不困难。设想一下,假如你是一个非常危险的职业——网络水军,每天的任务就是发几百个 100 字左右的,内容相近但又不能完全相同的帖子,如果一个字一个字的敲,你显然不具备任何完成这份沉重任务的可能性。但如果你事先编写一个比较通用的范本,把它保存在剪切板里,然后在 Ctrl-V 之后稍微改上几个字,那完成任务的速度将会显著提高。顶点引证所做的事情,其实跟这个是一样的。



有了引证,这种场景的实现就轻松多了

对大数量的拥有重复性但却有不能完全相同的模型来说,程序可以先创建一个通用模型的基本信息,然后将模型的基本信息封装成一个位于基础索引内的只读信息包,这就是网络水军们得通用帖子模板。几何单元可以通过SV_InstanceID 的索引来快速读取通用模型信息,并跳过重复的创建过程,这就是著名动作 Ctrl-V。接下来只要对通用模型进行一定的 LOD 修改等常规动作,即可完成一个全新模型的输出。



顶点引证实例2

由此可见,科技其实没什么神秘之处,它跟艺术一样,都是源于生活又高于生活的。
几何之后再无几何

作为图形流水线的第一部分,几何单元承担着沟通数学与显示空间,将抽象方程具体化的第一步任务。几何单元的意义是无可替代的,它让三维图形学拥有了真正的 3D 的意义,它让一个又一个的香草和劳拉,或者小兵啊城堡啊车马炮啊,甚至是银河战舰或者星球什么的,从数学的孤芳自赏中走了出来,变成了一个个生动的实在的物体景象。几何单元,是向常人展示显示艺术的数学之美的先行者。



香草的活泼可爱全拜几何单元所赐

几何单元的发展是迅速的,正如 NVIDIA 的 Evan Hart 所说,没有几何体,像素、光照、阴影什么的都没有任何意义。几何是 3D 图形的基础,对几何精度的提升对图形质量的贡献远比其他层面的提升都更加明显。我们甚至可以说几何单元就是现代 3D 显示技术。



模型和实际效果的关系

然而,在图形流水线过程中,真正的具备 3 维空间意义的处理过程,却只有几何单元一处而已,当几何单元处理过图形数据之后,后续的所有步骤将全部在 2 维空间中进行,再也没有实在对应空间的 3D 坐标了,甚至这个过程的执行场所,都不能说已经脱离了几何单元。我们看到的所谓 3D 图形效果的处理,其实几乎都是在 2 维空间中完成的。



多边形空间坐标变换

这是什么情况?难道我们都被骗了么?为什么3D图形效果要跑去更低一级的维度上进行处理啊?这这中间又发生了些什么呢? GPU 以及图形处理后续的步骤又都是怎样的呢?在下期 GPU 大百科全书中,我们将深入 GPU 处理过程的第二个阶段——光栅化,来一一探寻上面这些问题的答案。敬请期待吧。
GPU 大百科全书索引


[*]第一章 美女、方程与几何
[*]第二章 凝固生命的光栅化
参考


[*]^英伟达高管交流纪要https://xueqiu.com/6846564531/223664454
页: [1]
查看完整版本: GPU大百科全书:第一章 美女、方程与几何