1食物?画卷?食物的画卷
在今后的《舌尖上的硬件》系列当中,我们将会继续保持这样的视角,以各种美味的组合和制作过程来为您展现不同的/半导体芯片技术细节,五味的搭配因何而鲜美诱人、图形处理过程是怎样的精妙、食物为何会让我们大快朵颐、芯片的性能究竟由哪些要素决定、这个世界到底蕴藏了多少和谐与调和的艺术,小小厨房中所发生的一切将会成为我们带您认识电脑世界的载体。最终,我们将会一起探寻、发现并赞美这个世界的本质。如果一路上能够有您相伴,我们感激不尽。
信守承诺,带着一颗探索并感悟世界的心,我们和新的一期《舌尖上的硬件》一起回来了。
在上一期的《舌尖》栏目中,我们同您一起在烤箱和披萨的世界里经历了一颗半导体芯片生产的全过程。虽然过程曲折,但当我们注意到自己正在以一种全新的“不那么冰冷”的形式来展现大自然的神奇时,我们觉得再多辛苦都是值得的。
大自然的恩赐,不仅仅在于它为我们奉献了食物或者其他让我们生存下去的物资,这个世界给予我们的最有用的东西其实是蕴藏在事物背后、统治并推动世界运转而且能够为我们所发现的规律和本质。食物是我们最容易接受的东西,以它为切入点来展现同样蕴藏在技术背后的各种本源和真实,不仅能让这些看似晦涩的过程变得生动和容易理解,还可以让我们明白许多足以影响我们生活的道理。所以在新一期的《舌尖上的硬件》中,我们将继续以食物为线索来发现那些以前未曾注意过的东西。
比如说,您想过图形渲染过程与厨房的联系么?
这地方也能让我们联系到图形渲染?我们经常会徜徉在绮丽的图形世界中,在GPU的帮助下享受渲染而成的游戏带给我们的感官刺激。我们也会经常出没于厨房,亲手烹制各种各样的美食给家人以及亲朋好友分享。可每当站在厨房正中时,有多少人会想到我们接下来即将做的事,竟然会跟显卡即将进行的图形渲染过程有着惊人的相似呢?
不如还像以前一样吧,让我们一起下厨房做上一道美食,并在烹饪的过程中亲自体会一下二者间奇妙的联系吧。
2作画的方法
● 作画的方法
同以往一样,既然我们是打算要通过美食的指引来理解图形渲染过程,进而感悟蕴藏于这个世界背后的更深层次的联系,那么图形渲染过程究竟是怎样的一番景象就是我们首先要解决的第一个问题了。在之前的《GPU大百科全书》中,我们已经尽自己所能向大家展现过图形渲染的基本流程、意义、特点以及与它们伴随在一起的种种奇闻异事了。如果您还没有看过这一系列的连载,不妨先跟我们一起简要的回顾一下GPU执行渲染工作的基本过程。
图形流水线的渲染流程既然是“3D图形应用”,那么图形的3D几何处理就自然成了整个GPU流水线过程的第一步。几何处理的目的很简单,就是帮你把描述图形的数学方程转化成虚拟空间的“实在”的物体。程序会将需要描述的物体表面的特殊关键点以空间坐标的形式加以描述,这些被称作“顶点”的点就构成了物体模型的基本框架。GPU的几何处理过程,就是将这些顶点及其位置变化描述到虚拟空间中,再依据程序需求对这些点加以必要的修饰,然后通过将这些点相连来构成要描述物体的外形。
DirectX 10的几何处理过程尽管GPU所处理的工作是围绕着创造立体感视觉体验来进行的,但在GPU里能够称得上是立体空间中进行操作只有几何单元一部而已。无论我们的模型如何富有立体特征,它终究只能被呈现在我们面前这个2维的,以像素为最基本发色单元的平面屏幕之上。因此将立体模型转化为平面投影模型,并借由透视效果来达成3D立体视觉特征就成了GPU完成几何处理之后要执行的工作了。在GPU单元中,完成这部分坐标变换工作的单元就是我们俗称的“光栅化单元”——Rasterizer。
像素化与采样过程光栅化过程完成了几何模型的平面化,同时为图形处理同屏幕像素对应做好了准备工作,所以GPU接下来要做的事情,就是处理物体表面的颜色细节了。处理颜色细节的手段有两个,分别是负责大范围实现颜色基本细节的材质操作和负责修饰颜色细节并呈现正确效果的像素处理。
TMU单元结构材质操作的本质相对简单,它就好像服装店将分开运过来的大小款式不同的衣服穿到尺寸各异的模型人偶身上一样,程序员们会事先制作包含很多色彩和图案的材质库,每片材质都会有规则可以坐标度量的尺寸。接下来,他们还会在程序中为物体表面规定好特定的色彩和图案特征以及适应类别范围。当光栅化完成之后,每个多边形新具备的坐标将成为确定它“形状”的新参数,材质单元根据事先规定好的特征范围去材质库中进行查询,然后再根据形状参数确定预制材质中截取的部分,最后把这些材质拷贝出来覆盖到对应区域之上。按照不同物体表面的需求确定需要的材质的尺寸、位置以及形状,然后去材质库里翻找适应的材质并把它贴对地方,这就是材质操作的全部内容。
Pixel Shader处理范例与“定性、翻找、然后拿过来贴上”的材质操作不同,像素处理是一个运算倾向更加明显的操作步骤。程序员预先烘焙的材质并不能充分的反应随机性极强的场景中真实的光影效果,所以我们必须通过修改一部分像素的颜色来达到表现正确视觉效果的目的。像素的颜色是由三原色混合而成,每个像素的色彩均可由被数字化的三原色的混合过程计算得来,因此GPU处理像素的方式,就是透过GPU中的ALU集群依据程序员编写好的指令直接运算与颜色数据改变相关的方程。如果说材质单元是搬运工,那么像素处理单元就是一个又一个的计算器了。
ROP单元结构抓好了材质,算完了像素,整个图形处理最后的工作就是将它们“涂抹进”已经二维化了的几何模型所在的位置了。Fillrate,或者说我们平常所说的“填充”工作是由ROP单元来完成的,它可以将已经所有我们已经处理过的图元混合在一起里构成最终的画面,并将这些画面送入帧缓存中等待输出。除此之外,ROP还承担了抗锯齿、alpha混合、无early-Z场合的Z值检测以及HSR等一系列工作。
顺序的GPU硬件渲染流水线步骤如果无算后效、CS或者物理特性等等其他运算过程的话,一次常规的图形执行过程到ROP为止就算全部结束了。整个GPU架构的基本处理流程和最终目的,就在于顺序的执行几何处理、光栅化、材质、Pixel Shader以及混合输出这5个部分的操作,并以此来生成一副具有透视效果的、可以让我们产生空间立体错觉的平面图画。
那么,它跟厨房又有什么联系呢?
3改良版红烧肉工艺大公开
● 改良版红烧肉工艺大公开
想要了解GPU渲染图形的过程和厨房的联系其实不难,我们只要和之前一样带各位做上一道菜,相信很多人就能明白其中的道理了。这次我们做的是什么菜呢?那就是上帝给予东方肉食动物们的福祉和恩赐——红烧肉。
一碗典型的南式红烧肉红烧肉是一道以五花肉为制作主料的热菜,烹饪技巧以炖制为主,口味甜鲜咸鲜皆宜。肉食肥瘦自古以来便是一个众口难调的问题,喜食肥肉者难以接受瘦肉的干柴,喜食瘦肉者不能容忍肥肉的油腻,但惟独红烧肉这道菜可以无差别的博得所有肉食动物的好感。五花三层的猪肉经过制作之后,美味不可用言语来形容,肥而不腻,瘦而不柴,堪称中华美食中的荤菜翘楚。
红烧肉大抵上可以按是否放水以及用酱油还是用炒糖色作为上色手段来区分南式和北式做法。原教旨的南式做法以翻炒+纯酱油炖制为基础,浓油赤酱但却也因此而压抑了肉本身的香气,而且全程无水工艺也会导致肉块口感偏硬。传统北式做法以焯烫后炒糖色再小火慢炖来诱发五花肉最本质的“肉味儿”而且口感更加软糯,可惜因为没有经历纯粹直接的炒制所以会错过了一部分脂融氨基酸以及融化油脂直接解离成鲜味物质的过程,同时油糖稀对肉块的包裹也会阻碍各色调料与肉本身的混合,所以在香气层次上逊于南式做法。
焯烫+炒糖色的北式红烧肉以我们今天要进行的话题,也就是图形渲染过程与厨房的联系来看,带炒糖色过程的纯粹北式做法似乎可以更加方便我们接近主题。但有介于我本人以及周围的同事多是比较坚定的改良主义者,同时《舌尖上的硬件》栏目本身也带有浓郁的假公济私,借文章由头满足ZOL部分吃货私欲的味道,一切以更好吃为前提,所以……好吧,看来我们要对现有的红烧肉做法进行一些必要的改良和革新了。
改良版红烧肉材料大揭秘我们用来压箱底的红烧肉秘方来自南北结合,首先以正常的南式炒制过程来取代北式做法的焯烫,让肉拥有解离出鲜味的机会,然后在炖制开始瞬间加入蜂蜜来替代炒糖色环节,这可以在同样生成甜鲜味道的基础上让肉块本身的香气能够不被封住的散逸出来;在完成炒制之后,我们将肉块回锅与葱姜蒜等一起稍加复炒,然后加滚开水以及蜂蜜再转小火慢炖的方式来回归北式做法诱发肉香的目的。这种做法不仅能够让红烧肉尽可能的同时具备北式肉香以及南式浓香,还可以方便我们更加完整的还原GPU处理图形渲染的过程。
好了,馋虫也勾了,“秘方”也泄露了,咱们该开工了。
4刀章——几何处理
● 刀章——几何处理
一切烹饪的起点都是刀章,自从我们的祖先将烹饪的地点从山洞的篝火旁搬到了厨房的锅里之后,将食物加工成适宜的形状就成了做饭这件事的起点。形状加工不仅能够方便食材配合烹饪器具,更可以让各种味道更加充分的融合和升华。
这个德行显然是不能下锅的,所以让我们来切块吧
我们买来的五花肉是普通的长条状,虽然也不是不能直接下锅,但以此做出来的“红烧肉条”肯定霸气过剩却口感不足,所以对其进行适当的切块是必须的。依口感和个人喜好不同,通常的红烧肉块可以被切成1~2厘米不等的方块或矩形块。我们只要把肉条按这样的尺寸切好,做肉的准备工作就算完成了。
这不就是几何处理过程么?
模型的几何处理过程同样发生在任务开始的起点,同样是对物体/模型外形的处理,几何处理和刀章在任务的起点就这么相遇了。在我们的红烧肉制作过程中,切块完全可以被看做是一个几何处理过程,尤其是曲面细分过程——我们对肉块的几何外形并不满意,希望通过丰富多边形数量/几何细节来改善最终的结果,所以我们通过在原肉块的特定位置上设定新的1~2厘米间隔的坐标点,并以此为基础将肉块划分成更细小的形状。
曲面细分就是一个对物体表面进行修饰的过程显而易见的,这个过程不仅很好的契合了几何处理过程,包括顶点位置确定、生成新的顶点、调整坐标以及多边形生成等等环节,而且还导致了一个更加有趣的推论——切肉的速度以及几何处理过程的快慢都可以由两个要素决定,那就是切肉者(处理单元)的经验技巧(效率)以及切肉者(处理单元)的数量。如果我的刀章娴熟,别说是切点红烧肉,就是“三两肉飞快一铺一大盘”也不是什么难事,而同样的,如果ZOL众吃货能够在饕餮之余过来帮帮忙,大家一起动手同样可以大幅加快切肉的速度。几何处理单元也是一样,增加单元总量以及提升每个单元的几何处理效率都能大幅提升几何处理的速度。
OK,现在肉切完了,该上锅考验真本事啦。
5光栅化——您不是已经在看照片了么?
● 光栅化——您不是已经在看照片了么?
好吧,屏幕前的您也许会在我们开火之前提出新的问题——几何处理这件事在做红烧肉的步骤中可以被体现的,可红烧肉跟光栅化本身又有什么联系呢?
有啊,这透过二维平面的屏幕呈现给您的烹饪过程,您不是已经在看了么?
透视效果受限于条件限制,我们不可能把每一位读者都直接请到我家来观看《舌尖上的硬件》中各色食物的制作过程并品尝制作成果,所以我们只能将制作过程拍摄成照片,再将这些照片穿插在文字中呈现给屏幕前的您。
拍摄成照片,呈献给屏幕前的您。光栅化过程这不就来了么?
光栅化过程光栅化的过程,本质上其实就是一个拍摄照片的过程,存在与虚拟空间中的三维几何体在经历了光栅化过程之后,实际上就等同于被保存在了一张写满几何体顶点坐标信息的照片上了。不管是最终呈现在屏幕上还是保存陈纸质相片,我们经常会进行的照相活动其实就是一个标准的将光栅化过程。您正在观看的这些可以证明“ZOL众吃货斑斑劣迹”的厨房照片,实际上就是一组已经完成光栅化的图形处理过程。
Rasterization光栅化过程图示这个过程跟GPU处理的唯一区别,在于照相及观看过程是借由光学投影的自然规律完成,而GPU的光栅化则是以坐标计算变换的形式来完成的。
6炒制和纹理共舞
● 炒制和纹理共舞
未经加工的肉通常都是红白相间的,这颜色很直观的透露出了肉块所处的状态信息——生的。除去逼出血沫的作用,无论南式的炒制还是北式的焯烫,这些与处理工作的目的都是相同的,那就是给五花肉块“断生”。
炒制完成
在经历了炒制或者焯烫之后,五花肉块表面的蛋白质会发生性变,进而转变成略微发黄的乳白色,这种变色的过程就是肉块完成断生预处理的标志。无论肉丝、肉片、肉段还是肉块,通常情况下都肉类食材都可以用蛋白质变性带来的表面均匀变色来作为完成预处理的标志,就好像在肉块的表面均匀地涂上了一层或白或黄的纹理。
没错,这跟在几何体表面均匀地涂上一层纹理是一样的。
四重材质贴图纹理操作的基本特征,在于快速同时大量的将已经预先设置好的物体表面颜色基本细节填充到物体表面。我们在前面曾经提到过,相比于后面的像素处理,“定性、翻找、然后拿过来贴上”的纹理操作更偏向于操作性的劳动。尽管受限于固定材质以及预先烘焙不可能将现实随机情况考虑周全,单纯的材质贴图想要解决光线关系及渲染色彩准确率的问题会十分困难,但它依旧可以快速并且相对简单的大量实现物体表面基本色彩信息的表达工作。
纹理定址及拾取操作炒制的过程在红烧肉的烹饪过程中仅占很少的时间比例,炒制过程中所发生的有机化学反应(香味和色泽的来源……好吧抱歉我扯远了点)与后续的炖制过程相比也更单纯,这从侧面说明了其复杂程度,但过程不复杂并不代表工作量就会小。炒制需要时刻把握火候以及肉块的状态,需要几乎一刻不停的翻动食材,这些过程基本上耗费了整个烹饪过程中一半的体力和精力。这样的特征亦如材质操作一样,尽管比不上ALU的运算来得复杂,但其本身反复进行的大量load/Store/Fetch等等动作无不需要耗费大量周期来完成。而且在GPU具备直接生成新像素的能力之前,材质操作也将是唯一的能够在像素化图元操作过程中快速完成基本颜色表达的手段。
红烧肉不可能没有炒制、焯烫的环节,材质操作之于渲染过程亦是如此。一切要素,都决定了材质操作这个看似搬运工的“重体力劳动”在图形化过程中不可动摇的地位。
7Pixel Shader牌酱油
● Pixel Shader牌酱油
我们在透露红烧肉改良秘方时曾经有过这样一句描述:“以我们今天要进行的话题,也就是图形渲染过程与厨房的联系来看,带炒糖色过程的纯粹北式做法似乎可以更加方便我们接近主题”,这句话并非没有来由,因为接下来要进行的过程,是一个可以和像素颜色处理过程对应上的环节。
生抽和老抽的比例是秘密这种事我会乱说么
红烧肉之所以被称之为“红”烧肉,皆因为其表面那层红润诱人的色泽。而将肉块从炒制或者焯烫后黄白的表面色彩转变成这样的颜色,缔造红烧肉软糯同时肥而不腻的口感,并且将整个烹饪过程中最核心的酱香以及肉香完美的融合在一起的步骤,就是整个红烧肉烹制过程中最核心的关键——调味及上色过程。
虽然没有炒糖色,但我们追加了蜂蜜为红烧肉提供鲜艳色泽的途径有炒糖色、酱油或者二者的结合体,无论采用哪种手段,想让红烧肉保持诱人的颜色都是一门极富技巧性的工作。炒糖色的过程虽然短暂但需要万分的谨慎和丰富的经验,稍有不慎就会让融化的糖稀变糊导致色泽混黑,并且影响最终成品的味道。酱油的使用则更是一门艺术,用生抽还是老抽、二者的比例、施放时机、混合方式以及与火候的搭配等等,这些要素不仅同炒糖色一样决定了红烧肉的色泽,同时还跟最后的口感及味道息息相关。
着色的技巧来自经验,而无论何种经验的产生以及使用,大堤上皆来自有形或者无形的计算过程。也许我们自己并没有察觉,虽然每次烹饪的总量不同,但当食材完成各种前置准备并下锅之后,我们其实已经差不多完成了与味道相关的一系列复杂计算,这些计算的结果会告诉我们诸如锅里的这些肉需要放多少生抽或者以怎样的火候炒多久糖色才能维持色泽的红润之类问题的答案,而这些答案的付诸实施则赋予了红烧肉正确的颜色表现,就像Pixel Shader赋予画面更加真实的色彩那样。
根据需求以及条件的改变现场计算正确的颜色,这就是我们和Pixel Shader所做的事。
shader可以实现单纯贴图无法实现的皮肤效果我们是游戏和应用的最终使用者,精确预测我们在开放游戏环境中的每一个动作进而预先设置固定变化套路的图像是绝对没有可能100%表现正确画面的,无论开发者多么努力,创造力丰富的玩家总会在有意或无意间寻找到开发者没有考虑到的角度、位置以及观察方式。想要一劳永逸的解决这一问题,办法就只有将所有的变化全部抽象成数学关系的形式加以表达,这样只要以我们实时的行为作为初始条件,程序就能根据预设好的数学关系计算出与当前状况相符的颜色改变量以及最终色彩表现的数值了。
不同的光照会导致极大的真实度差异Pixel Shader的像素修饰过程就是这样的一个步骤。材质无法根据千变万化的随机场景改变而表现正确的颜色,于是程序员们便在程序端写入了能够以玩家控制变量以及其他场景变化表达所需要素为初始条件的数学方程,透过由ALU集群实时执行这些方程来计算当前瞬间场景内所有可是物体表面颜色改变的数据。这些精确到像素点的数据可以直接修正材质原有像素上的颜色问题,并且让我们获得程序员希望表达的预设效果。
像素操作达成动态折射效果后的cube mapping也许我们做红烧肉时决定使用多少酱油只需要一瞬间,但如果将千变万化的食材量、环境因素、前序烹制过程产生的影响以及食客口味的偏好的所有要素全部考虑周全并作为初始条件加以计算,其背后的运算量确实非常巨大和复杂的,如何管理这些计算任务,就成了计算能否高效完成的必要前提,像素修饰过程也是如此。想要在整个场景中表现正确的色彩以及各种视觉效果,“ALU高效率的完成巨量的计算动作”以及“及时有效的管理这些计算动作背后的任务以便让ALU能够及时执行它们”这两点都很关键。大脑凭借着极端复杂的结构达到了极高的任务管理能力,这让我们能够以经验为蓝本在一瞬间便完成与红烧肉着色相关的一系列复杂计算,而GPU同样需要复杂、充沛同时科学的任务管理体系来维持ALU集群的运作。
以站厨房的经验而言,我应该还可以称得上丰富,控制生抽和老抽的比例以及小火炖煮的时间以便获得正确色泽这件事对我来说并不算困难,所以在加过酱油之后,我们对今天红烧肉的着色结果还是很心的。
8后效、CS、Deferred、调料球以及老白干
● 后效、CS、Deferred、调料球以及老白干
每一个家庭主妇/煮夫都有自己的厨房“一招鲜”,那就是各种令人眼花缭乱的香料。花椒大料草果香叶桂皮白芷肉豆蔻罗勒草百里香……只需要在烹调时加上那么一点点,一道美食便好像经历了点石成金的炼化一般焕发出了诱人的香气。图形渲染同样有属于自己的“一招鲜”,那就是层出不穷的渲染技巧和先进的可编程技术。
幕后英雄之八角、香叶、桂皮对于视觉效果处理而言,单纯的材质操作和Pixel Shader都显得“简单粗暴”,是不足以及时高效的表达全部特性的。只有适当的辅以各种巧妙的直接表达或者间接提升效率的手段,我们才能更加流畅的获得特效更加丰富细腻的图形表现。所以我们需要感谢各种长期存在于幕后甘当隐形英雄的那渲染技巧和新技术,比如PostProcess、Compute Shader或者Deferred Shading等等。
PostProcess(后效处理)是一种在完成常规渲染之后将目标送回像素流水线进行再加工的处理手段,大部分时候它都以Pixel Shader为实现手段。PostProcess可以以更强烈的目的性和针对性来实现诸如模糊、景深以及特殊光效果处理等“传统”特效,这种二次修饰甚至多次修饰的过程大大简化了初始渲染的难度和精度要求,事实上等效于将渲染及特效实现任务分解成了更加简单的多个部分,并且提升了完成同样效果前提下整个流水线的渲染速度。
PostProcess示例Deferred Shading是一种通过延迟处理的思路,将光照操作的步骤从传统的Pixel Shader前段直接转移到整个流水线后端的MRT(多目标渲染)的处理方式。作为延迟渲染的一种操作手段,它可以让所有像素在统一完成其他一切步骤并实现Z Occlusion Culling之后再集合在一起统一进行关于光照的运算和操作,从而避免了大量的无效光照计算。Deferred Shading透过延迟操作可以完成几乎全部涉及光照的操作,能大幅提升可操作光源总量,而且场景的复杂度越高,Deferred shading所能够带来的效率提升也就越明显。
Compute Shader+Deferred Shading实现的1000光源场景Compute Shader是DirectX 11相对于之前版本DirectX最大的革新,它的最大特点在于解除了Shader Programs的几何关联限制。剥离几何极大地提升了Compute Shader的执行效率,近乎于纯数学指令形式的Compute Shader可以使用比过去灵活很多的各种全新buffer,可以透过并行管理方便的实现数据共享,可以透过树结构和延迟操作快速执行任意过程,还可以以纯数学代码的形式插入到任意图形过程中以提升这些过程的速度。
快到调料球里来这些幕后英雄并不是渲染过程的主力,它们就好像我们做红烧肉时放进去的那两勺老白干或者调料球里的八角桂皮等等香料一样。香料从来都不是食物中直接被食用的那部分,甚至对于相当一部分懒人来说都是可有可无的存在,即便一点都不加,食物在烹熟之后照样可以食用。但香料可以为食物的味道增色颇多,让食客能够体会到“美食既愉悦”的感觉,所以要想善待自己的舌头,适当加入合适的香料是必须的。后效或者CS等等技术的作用也是一样,它们可以加快整个图形渲染的进程,让有限的GPU资源可以更有效为程序员所用,并借以实现更多更为精彩的视觉特效。
9时间+火候——最棒的Fillrate操作单元
● 时间+火候——最棒的Fillrate操作单元
肉块、酱油、调料球和白酒也都已经齐备,该折腾的都折腾完了,现在我们的锅里已经有了一碗红烧肉所具备的一切要素。可截止到目前为止,肉块还是肉块,酱油还是酱油,香料和白酒也都还各自为政,所有的食材还没有完成充分的混合。要让这一锅东西最终变成一碗红烧肉,我们还需要另外两个帮手来搞定最终的环节,那就是时间和火候。
老白干在转小火精炖时还要再补一次小火慢炖是勾引肉香绝佳的手段,厨房里自古就有“急火鱼慢火肉”的讲究。在小火的长时间精炖下,各色调料会在适宜的温度中慢慢的与食材融合,酱油调制出的红色会附着到肉块表面并沁入其中。只要控制好火候和时间,红烧肉的最终上色和烹制就能顺利完成。甚至对于整个烹调过程而言,最后的精炖过程是最关键也是最重要的。
同样的,我们的图形渲染过程也已经进行到一个关键的节点,我们已经完成了几何处理,通过光栅化过程达成了像素化的要求,从材质库里找到了合适的纹理,并且通过ALU集群的通力运算搞定了这块纹理中所有需要修改的像素的颜色,可这些工作的结果,也就是已经处理好的图元要素却还像锅里的肉块、酱油、白酒以及调料球一样各自独立。如果想要得到一副最终的画面,如小火精炖一般把所有的图元要素牢固的组合在一起才是最后的关键。担当这一关键操作的单元,就是我们所熟悉的ROP。
ROP位于图像处理过程的最后一步ROP单元对图形元素的“组装合成”过程分为以下几步:首先,拾取好的材质以及由shader处理完成的像素会被传送到对应的z/stencil buffer进行z/stencil检查和不可见剔除,然后特定范围深度值的像素将被输送到alpha单元进行透明度检查并完成alpha Blending操作,剩下的像素将会被填充进2D化模型需要的范围内,这一过程就是我们常说的Pixel Fillrate。
渲染示例由于像素上的效果已经被shader以数学的形式处理完毕了,因此如果没有AA操作,那么到这里为止图形渲染工作就算彻底完成了,所有效果的混合及填充将会让正确的画面最终得以呈现,这幅完成处理的画面会被送入output buffer等待输出。而如果程序要求进行AA操作,比如MSAA,那么ROP中的AA单元还需要对填充完毕的画面进行若干次多重采样,然后再对采样出来的像素点进行color Blending操作,完成之后的画面才会被送入帧缓存等待输出到屏幕上。
抗锯齿操作过程时间和恰到好处的火候让颜色和味道凝固在了红烧肉中,而ROP则让所有图元要素凝固在了图像中,这就是厨房和图形渲染之间的联系,也是我们一直致力于探寻并共同感悟的大自然赋予万物的奇妙联系。
10加点好玩的应用特性怎么样?
● 加点好玩的应用特性怎么样?
其实照常理来说,红烧肉的制作进行到小火精炖的环节基本上就算是大功告成了,剩下的工作就只剩耐心等待而已。但我们说过,《舌尖上的硬件》是一档带有浓郁的假公济私,借文章由头满足ZOL部分吃货私欲的味道的栏目,一切都要以更好吃以及可以满足吃货们为前提,所以我们决定继续发扬开拓创新精神,让这碗红烧肉变得更加美味。
比如说,放点香菇再加俩鸡蛋进去怎么样?
进一步提鲜用的香菇经我们改良的红烧肉在炖煮过程中会释放出充分的鲜味元素,这些美味被闲置在肉汤中其实是很浪费的。如果能以香菇进一步提鲜,再用一些吸附性很强的食材来收集这些鲜味元素,并将它们更充分的与酱油及其他调料结合在一起混合,最终产生的效果一定会让任何吃货都得到无上的满足。鸡蛋强烈的吸附特性以及本身平和的味道,让它成了我们的理想选择。在放入香菇并以小火慢炖半小时之后,我们向锅里加入了几个煮到半熟然后剥皮的鸡蛋。
滚水2分钟后捞出剥壳的半熟蛋鸡蛋并不是红烧肉菜谱中必须出现的要素,但却可以起到锦上添花,让一碗红烧肉变得更加丰盛甚至丰满的作用。就我们的观察,几乎所有爱吃红烧肉的吃货们都会同时极度喜欢红烧肉里炖制的鸡蛋。这种看似无关但却可以提升整道菜给予食客的享受的手段,和我们在游戏中遇到的诸如物理特性之类的附加值是一样的。这些附加元素与游戏和图形渲染本身并没有直接的联系,但它们的加入会丰富游戏过程的体验,甚至可以进一步改善渲染后画面的表现。
物理特效以图形渲染过程而言,物理特效跟它并没有直接的联系,但当吃货们嘴里塞满吸饱了红烧肉浓香的卤蛋时,大自然在万物间建立的微妙联系应该会在他们的内心中留下更加深刻的震撼吧。
厄……应该吧……只要他们别光顾的吃就行了……
11味道的地图
● 味道的地图
在经历了一个半小时以上的小火慢炖以及各个吃货完全没有良心和基本常识的胡乱催促之后,我们的红烧肉终于出锅了。考虑到屏幕前诸位的承受能力,我们权衡之后决定还是放弃吃货们四大金刚还俗一般惨烈的吃相展示环节……
出锅喽
从切块、下锅炒制到放入各种调料精炖,发生在砧板和锅里的一系列神奇的变化让我们亲身体会了美食和烹饪的乐趣与享受。同样的,从几何处理、光栅化到纹理操作、像素修饰以及最终的混合输出,发生在GPU中的一系列图形渲染过程也让我们获得了亦真亦幻的图形视觉体验。随着一碗红烧肉的制作完成,一个完整的图形渲染过程也跟着一起走完了,每每想到这里,我们都会对“美食即享受”这句话有更深一层的理解。
视觉的享受同样精彩
切块VS几何处理,拍照一样的光栅化过程,给几何体“断生”的材质操作,和我估算生抽与老抽比例同步进行的ALU集群对像素颜色的计算,还有最后的小火慢炖与ROP混合图元要素的对应,这些其妙的联系其实早在GPU诞生之前就已经存在了。规律就在那里,只等有心人去挖掘,只要您肯用心去观察和体会,就能和我们一样发现生活中许多看似平行的事物之间神奇的内在联系。
想知道味道跟它的联系么?红烧肉是一道诱惑力很强的美食,可这诱惑又来自何处呢?没错,那就是味道。酸甜苦辣,人生百味,我们的生活早已与味道紧密的联系在了一起,在生活中被创造出来的GPU自然也不例外了。想知道您平时未曾留意的味道背后都有哪些故事么?想找到五味的搭配因何而美丽诱人的答案么?想了解味道中蕴藏的哲理同GPU逻辑单元设计之间的联系,并更具象的感悟这个世界的神奇么?下一期的《舌尖上的硬件》,让我们不见不散吧。