GPU大百科全书 第二章 凝固生命的光栅化
光栅化——死神来了……
前言:在上一期的GPU大百科全书里,我们目睹了可爱的香草从抽象世界走向现实,从方程还原成实体的全过程。可以说香草活了,因为几何单元,我们赋予了她完整的灵魂。
如果你正在为GPU图形单元创造鲜活形象而感到欣喜和雀跃,那我建议你最好先做好与之相反的心理准备,因为今天关于GPU的话题会很沉重,我们将目睹一个生命被凝固的全过程,也就是几何单元之后的图形过程——光栅化。
● 几何之后真的再无几何
几何过程结束之后,图形的世界是充满了欢笑的。得益于几何单元的精细调整,可爱的香草在她的世界里快乐的雀跃着,所有一切的事物都让香草或喜或怒,或哭或笑。而整个世界仿佛都被她的美丽感动,也跟着一起变得鲜活起来,每一座外形精致的城堡、每一汪波光淋漓的池水甚至每一棵随风摇动小草都有了自己的生命。在几何单元里,一个完美的三维世界正在以自己的方式存在着。
光栅化之前几何单元生成的美丽小世界
这个美丽的小世界并不知道,在前面等待着他们的不是绚丽多彩的美好未来,而是完全的毁灭和死亡。小世界脆弱的生命,就好像烈日下的露珠一般,一瞬间就消逝了。
Rasterization光栅化过程图示
香草本来正在逗弄着伏在青草上的一只蝴蝶,她的微笑和纤细的手指好像将生命的能量注入到了蝴蝶身上一样。但毫无征兆的,香草的动作突然凝固了,仿佛时光停滞了一般,整个世界的一切全都不动了,紧接着,一面看不见得巨大墙壁飞快的将整个世界压成了一张扁平的画面。世界中的一切都栩栩如生的保持了时间停止一瞬间的状态,只是没有了厚度,也没有了生气。
被2D化的3D世界
在这个小世界诞生仅仅几纳秒之后,它们被送入了地狱的深渊。在那里,小世界中的一切,甚至包括世界本身都将从三维的立体形态被压成一张二维的平面,世界中的事物也将因此而崩毁凝固,所有的美丽都将被冷酷的封存在一个没有厚度的空间中并被冻结起来,从而失去一切生命的活力,变成了一个个的标本,一个世界的标本。而执行这一切的死神,就是整个光栅化过程中最重要的单元——Rasterizer,死神收割世界的过程Rasterization,就是我们经常听到的光栅化。
死神(光栅化)不是刽子手,她只是完成自己的使命
将生命化为乌有并将它们变成标本,其实并不是死神的本意,死神不是破坏和毁灭的神灵,她只是在完成着自己的使命。是谁赋予了她这样的使命,去毁灭一个又一个美好的世界?死神对世界的毁灭,又是怎样完成的呢?我们今天的故事所要展现的,就是死神使命的起因,经过和结局。
顾杰所写过的技术分析类文章索引(持续更新) | |
2、 忠实微软是否有用 A/N统一构架细节分析 | |
3、揪出幕后罪魁祸首 是谁拖累了统一架构 | |
5、融聚的未来在哪里 APU构架方向发展分析 | |
7、NV也玩融合 探GTX700核心CPU+GPU构架 | |
11、iPad2也成无尽陷阱?移动GPU构架全揭秘 | |
● 一切皆因你而起
CPU和几何单元通力合作,又是生成又是调节的,好不容易弄出来了一个精巧的小世界,为什么马上又要毁了它呢?
答案其实就在你的眼前——之所以要把三维世界变成二维,就因为你面前的显示器只能显示二维的画面……
显示器只能显示二维画面
从第一台显示器诞生之日起,人类的图形界面输出特点就注定了图形处理过程的命运。不管内存中的三维世界多么精巧逼真,最终输出给人们观看的永远都只是一副没有厚度的二维的画面。人们急迫且日益高涨的需求显然不可能让他们等到空间立体显示技术出现才去考虑玩3D游戏的问题,所以,建立在这种平面输出基础上的现代图形渲染工业,自然也就要面对构筑模型是三维但输出设备却只能显示二维画面的问题。
直到今天3D立体显示技术也没有重大突破
是的,Rasterizer(光栅化)之所以成为死神,并且收割着一个又一个的美丽世界,都只因为屏幕前的你——对于图形化的世界来说,你就是上帝,这些世界的诞生就是因为你的需求。你想要这个世界,所以世界才会被创造出来,然后被赋予了生命,也正是因为你的急切,这些被创造出来的世界又要被无情的二维化,里面的一切都被冻结,而Rasterizer作为死神,不过是为了满足你的需求而执行了被赋予的使命而已。
任何图形世界都逃不过被二维化的命运
不管出于什么原因,Rasterizer作为死神的使命已经存在了,她没有能力抗拒命运,因此只能默默的接受这一安排,并静静地完成自己的使命。接下来,就让我们看看这位生命的冻结者——光栅化,究竟是怎样收割一个又一个世界的吧。
● 光栅化与线透法
Rasterizer(光栅化)收割3D世界所要面对的第一个问题,就是西方写实派美术的基础——线透视关系。
透视效果
“透视”一词源自拉丁文“perspclre”,意为看透。为了将立体物体的图像转化到平面上以完成作画的过程,人们开始了关于透视的研究。最初研究透视是采取通过一块透明的平面去看景物的方法,将所见景物准确描画在这块平面上,即成该景物的透视图。随着研究的深入,人们将在平面画幅上根据一定原理,用线条来显示物体的空间位置、轮廓和投影的科学称为透视学。这种方式,也就成了今天图形渲染工业中Rasterization的基础。
线透法
在多种透视方法中,最常用到的是线透法。线透法的基本原理,在于将物体的每一个点全部以连线的方式与观察视野,也就是我们的眼睛相连,然后再将一块平面置于这些线上,由线穿透平面所构成的投影来确定物体在画面中的形态。无论是现代西方美术、摄影还是图形渲染工业,一切与现代西方美术有关并以平面化展现立体物体形象为任务的领域,都要依赖线透法来实现最终的画面效果。
线透法在构图中的应用
我们所要看到的物体,就是几何单元中创造出来的一个个小世界,要将他们反映到屏幕上的过程,实际上就是一个根据透视原理作画的过程,摄像机镜头或者说屏幕的位置,就是线透法中反映物体形状的平面,而Rasterization对每个小世界的收割,本质上也正是一次作画的过程,只不过本质上要更具破坏性一些罢了……
光栅化过程
为什么要用“破坏性”这个词呢?因为与其他线透法艺术创作的对物体上各特征点的还原不同,Rasterizer过程是直接将现有的几何模型中的点全部变换成二维形式。这个过程,就是我们接下来要讲的Transform。
● 死神的镰刀——Transform
Transform词如其意,就是指对立体物体的变形。三维空间中的物体会自然地呈现三维坐标系的特征,其上的每一个点均会带有完整的三维坐标向量。想要将这些点固定在二维世界中同时还要符合透视关系,这就是Transform的工作。
点线变形关系
透视关系,其实归根结底还是数学关系,物体到投影面的形态属于标准欧式几何,人们可以用典型规范的数学手段加以描述,于是将三维物体二维化得过程,便可以通过方程变换的形式加以完成了。经过计算,所有三维空间的点都可以在保证与观察者也就是摄像机位置存在正确关系的前提下,变成一个没有真实Z轴的二维点。简单地说,就是可以被装进画里了。
被二维化的三维图形
由于这是整个光栅化过程的核心,因此,光栅化也经常被称作坐标变换。不难发现,这种基于数学关系的投影转变跟摄影有着非常接近的关系。如果没有Transform过程,我们甚至可以直接将坐标变换过程理解成是在拍照。快门咔嚓一响,香草和她美丽的小世界不仅可以完美正确的被记录并展现出来,而且拍完照还能继续快乐的活下去,多么美好啊。
摄影只是对景物形状的平面化复制
但现实不是童话,被创造出来的世界是不可能永远存在下去的,GPU显然没有足够多的晶体管用来存放这些被创造出来满足人们视觉需求的小世界。所以,当世界被创造出来的那一瞬间起,其实它面对死神镰刀的命运就已经注定了。
● 吞噬生命同时凝固美丽
也许你会问——为什么光栅化的过程是这里,为什么如此匆忙,为什么让这个世界刚刚创造出来就要被定格到二维空间,如果世界能够再多存在一会,这样随着后面单元的操作,它显然将变得更加丰富多彩啊。
经过Pixel Shader操作的图形
我想说的还是那句话——现实不是童话。
由于透视关系的缘故,我们显示器所在的固定视野会导致视线中大量遮蔽关系的出现,立体世界中那些被遮挡的以及因为角度问题背对摄像机视野的面将无法被我们所看到,如果不进行光栅化过程,不考虑视觉关系就直接将几何单元生成的空间全部根据需要进行材质和像素填充,渲染那些看不到的部分对于GPU来说显然是一种极大的资源浪费。
遮蔽关系导致的无效渲染说明
另外,光栅化之后GPU所要处理的操作,将会是像素和材质,由于整个渲染过程所操作的最基本单位是像素,所以光栅化操作所转化的二维画面,其实就是一个以像素为基本单位构成的平面。后续的颜色处理,将围绕着这个平面内所有的像素展开。如果不进行光栅化操作,而是继续维持可操作的顶点和几何模型,未被冻结几何外形将无法为像素和材质的操作提供保护。世界原本是美丽的,但错误的构筑世界的工作配合却可能会毁掉这种美丽。
光栅化是保证显示效果正确的基础
如果死神不在这里收割生命,后面的操作将无法完成,整个图形渲染过程都可能会毁于一旦,这不仅意味着美丽的世界将可能不再美丽,而且还将严重影响神,也就是屏幕前的你欣赏和享受图形世界的美丽带来的快乐。所以死神不得已,只得举起了自己手中的镰刀。
● 死神的叹息——Rasterizer(光栅化)操作过程
应该说,死神对生命的收割过程,其实是非常优雅的。
整个图形流水线都是以Rasterizer为中心的
当几何单元完成对顶点以及模型的操作之后,所有构成世界以及世界内物体的顶点坐标将开始进行3D坐标-2D坐标的方程变换运算,运算的基本规则就是摄像机/屏幕位置与物体之间透视关系的数学描述。随着变换运算的完成,Rasterizer会创建一个由像素构成的2维平面,然后调动Vertex Shader/Unified Shader单元,根据运算的结果将构成模型的顶点一一对应至平面的像素点上。
3D坐标变换
除了运算常规的变换方程之外,Rasterizer还会对物体的位置进行必要的前后判断,并将被遮蔽物体的顶点予以删除,这部分操作被称为Z-culling。不会被看到的顶点将会被这一步操作裁减掉,不会出现在像素平面上。当所有顶点最终都被一一对应到像素平面上之后,物体的几何外形将被冻结,留下来的,就只有一副投影到2D平面上的由像素构成的画面了。
坐标变换
一个世界的毁灭以及其中生命的消逝,有的时候未必是摧枯拉朽以及血流成河的。死神就好像弹奏着古典钢琴曲的肖邦一般,优雅的求解着各式各样的坐标方程,同时轻轻地将一面透明的巨墙压向了面前这个刚从几何单元中走出来的鲜活的小世界。
梵高笔下二维化的《星空》
当巨墙接触到世界之后,里面的一切便悄无声息的融入了二维的平面之中,世界完全被二维化之后,一切生命以及世界本身就都板结成了凝固的画卷,画卷中的每一个点,都是这个世界以及其中的生命曾经存在过的证据。死神轻轻叹了一口气,小心翼翼的卷起了这幅像素构成的画卷,把它交给后续的单元进行像素和材质操作,然后静静地凝望着几何单元的方向,等待着下一个小世界的到来。
死神在静静地凝望
Rasterizer虽然是死神,但绝非嗜杀如命,他仅仅是完成了自己的使命。
● 死神的烦恼——闭塞Z光照问题
死神并不是全能的神,他也有自己的烦恼。比如说——自己使命的意义。
除了满足二维平面输出对坐标变换的要求之外,Rasterizer(光栅化)最大的意义,便在于减轻流水线后续的无效渲染的压力。事实上死神每次挥舞镰刀时,支撑它的除了使命感所带来的麻木的平静之外,就只剩下这个了。但现在,死神开始怀疑自己是不是真的可以为后续单元的工作大幅减轻压力了。
Z轴闭塞检查
光栅化操作,是发生在模型完全建立,并且完成基本光照及对应纹理之后的操作环节。由于透视固有的视线前后遮蔽问题,建立好的模型存在很多看不到的部分,光栅化过程对Z值得判断,可以将这些看不到的部分剔除掉,表面上看,极大的减轻了后续的渲染压力。
光照纹理操作
死神是清醒的,他注意到了一个细节——光栅化操作,是发生在模型完全建立,并且完成基本光照及对应纹理操作之后的操作环节。
完成基本光照的图形
由于缺乏足够有效的流水线前Z检查手段,Z-culling无法有效减轻无效光照操作负担的问题,已经成了困扰整个光栅化过程的最大难题。光栅化操作确实可以有效的提升后续的大部分纹理和像素操作的有效率,但对于闭塞Z光照的问题,Rasterizer本身似乎还无能为力,后续的流水线单元依旧承受着极大地无效光照操作的负担。以生命为代价来达成的目的最终无法完美的实现,这让死神颇有些耿耿于怀。
Deferred Shading过程
好在人们也意识到了问题的存在。为了解决无效光照操作的问题,Deferred Shading技术出现了,它将光照操作的步骤直接转移到整个流水线后端的MRT(多目标渲染)里。虽然这还不能从根本上彻底消灭无效渲染,而且Deferred Shading本身还有诸如运算要求极高等许多问题有待解决,但随着技术的进步以及DX11中引入的Compute Shader所提供的运算能力的助益,Deferred Shading已经开始越来越多的发挥自己重要的作用了。
由Deferred Shading实现的1000光源效果
望着新加入的伙伴,死神释然了。再一次找到自己使命的意义,让他能够更加平静的去面对世界的毁灭以及生命的消逝,因为他知道,自己这么做是有意义的。
● 死神永生
在工作之余,死神也会经常打量四周并发出些许的唏嘘,感慨一下这时光飞逝物是人非的世界。
曾经红极一时的T&L
从显卡出现到今天,风风雨雨这么多年,整个流水线早已不再是当年那个简单的画笔了。TSE变成了Geometry,硬件化的T&L单元来了又走,Vertex Shader和Pixel Shader结合成了Unified Shader,TMU变成了TA,甚至还冒出来了只在CPU中才会出现的Cache……随着技术的进步,太多单元被替代,修改甚至取消。
T&L最终被Vertex Shader替代
自从图形渲染工业出现第一天起就已经存在在图形流水线之中的Rasterization(光栅化),会不会也逃不掉同样的被替代甚至被取消的命运呢?
Rasterization过程
我们前面提到过了,Rasterization过程是建立在现代图形渲染工业核心的基础之上的,只要你面前的屏幕依旧是一块由像素作为基本单位的没有Z轴显示能力的二维平面,三维图形就必须经过坐标变换才能进行下一步的渲染。
Rasterization过程分解
与此同时,光栅化作为现代图形渲染工业最核心的过程,已经深深的植入了图形渲染过程的灵魂深处,甚至大多数人在提到图形渲染流水线时,都会简单的称其为“光栅化流水线”。作为沟通几何—像素的桥梁,Rasterization已经成了一个不可替代的必要阶段。如果去掉Rasterization,后续的材质操作和像素操作都将面临天翻地覆的变化,甚至完全无法进行,整个流水线过程都将面临改写的命运。
光栅化流水线
所以,在可以明确预见的未来中,死神仍将和现在一样静静地站在流水线的前端,轻轻地将一个又一个的世界压成没有厚度的画面,用凝固生命作为条件让渲染继续下去。
● 死亡不是终点,它只是新的开始
在图形渲染过程中,光栅化是一个非常特殊的环节,它极其直接而且过程简单,几乎只是对立体物体的投影表达,并不像其他单元那样充满了各种花俏的细节和技巧。光栅化的作用也只有为了适应屏幕而进行的涉及Z值比对的立体-平面坐标变换,以及冻结几何外形这两点而已。唯一特殊的地方,在于经过光栅化之后,平面化的几何物体的外形将不再改变,而且原始的立体几何模型也将消失。所以从这个意义上来讲,原来构成立体世界的几何模型以及立体世界本身,都已经死了。
完成2维化以及Pixel Shader的几何图形
尽管在本篇GPU大百科全书中,我们频繁面对了死神以及死亡这两个沉重的话题,甚至还目睹了上一篇大百科全书中刚刚诞生的一个鲜活世界仅仅几纳秒的生命,以及它快速消逝的全过程,但请不要因此而觉得压抑或沮丧。
《入殓师》向我们传递的信息——死亡不是终点
关于死亡,电影《入殓师》中包含了一段经典的对白:“棺木合拢之时,便是灵魂远行的开始。死亡不是终点,而是超越,是通往下一程的起点”。每当回味这些伴随着低沉且和缓优美的大提琴一起出现的台词时我都在想,平静、安详、充满了敬畏和希望,这应该是我们面对生命逝去时所应该具有的态度吧。
一个新的生命正在等待着更加精彩的旅程
死神并不是生命的收割者,他是通往下一段旅程的引路人。对于图形世界来说,尽管Rasterization(光栅化)终结了一个世界的生命,但他同时也意味着一段新旅程的开始。因为接下来的流水线中,还会有纹理、像素、混合以及输出等许多精彩的环节,等待着这个世界的另一种形态去经历、去探索。随着死神轻轻地将二维化的世界交给流水线后续的单元,一个生命结束了,而另一个崭新的生命也随之诞生了,这个新的生命不仅将拥有一段更加绮丽的经历,而且最终会变得更加美丽。
在下一期GPU大百科全书中,我们将随着新的生命一起,开始这段全新的旅程,敬请期待吧。
GPU大百科全书 第二章 凝固生命的光栅化的更多相关文章
- GPU大百科全书 第一章:美女 方程与几何
沉鱼落雁 前言:当你酣战在星际2的时候,或者当你在艾泽拉斯游历的时候,你有没有想过,眼前的这些绚丽的画面究竟是怎么来的呢?也许对大多数人来说,GPU对于图形的处理过程并不是那么重要,但总会有些人, ...
- GPU大百科全书索引(有助于理解openGL工作流程)
GPU大百科全书索引 0.GPU大百科全书 前传 看图形与装修的关系 1.GPU大百科全书 第一章:美女 方程与几何 2.GPU大百科全书 第二章 凝固生命的光栅化 3.GPU大百科全书 第三章:像素 ...
- PMP 第二章 项目生命周期与组织
1 项目组织机构类型有哪些? 区别是什么? 职能型 矩阵型 项目性 2 什么是事业环境因素? 什么是组织过程资产? 如何区分事业环境因素和组织过程资产? 事业环境因素:事业环境因素指围绕项目或能影 ...
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少分配率, 最重要的规则,缩短对象的生命周期,减少对象层次的深度,减少对象之间的引用,避免钉住对象(Pinning)
减少分配率 这个几乎不用解释,减少了内存的使用量,自然就减少GC回收时的压力,同时降低了内存碎片与CPU的使用量.你可以用一些方法来达到这一目的,但它可能会与其它设计相冲突. 你需要在设计对象时仔细检 ...
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 将长生命周期对象和大对象池化
将长生命周期对象和大对象池化 请记住最开始说的原则:对象要么立即回收要么一直存在.它们要么在0代被回收,要么在2代里一直存在.有些对象本质是静态的,生命周期从它们被创建开始,到程序停止才会结束.其它对 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- Python黑帽编程 2.0 第二章概述
Python黑帽编程 2.0 第二章概述 于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一 ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
- 精通Web Analytics 2.0 (4) 第二章:选择你的网络分析灵魂伴侣的最佳策略
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第二章:选择你的网络分析灵魂伴侣的最佳策略 在Web Analytics 2.0的新世界秩序中,您必须跳出"单一真理来 ...
随机推荐
- Android5.0新动画之VectorDrawable
SVG是前端的一套标准,Vector是在Android中使用,他只是实现了SVG语言的Path的标签 Vector的常用语法 M = moveto(M X,Y): 将画笔移动到指定的坐标位置 ...
- fdsf
https://blog.csdn.net/chen_2890/article/details/83757022Elasticsearch环境搭建和介绍(Windows) https://blog.c ...
- 【UVA1515 算法竞赛入门指南】 水塘【最小割】
题意: 输入一个h行w列的字符矩阵,草地用“#”表示,洞用"."表示.你可以把草改成洞,每格花费为d,也可以把洞填上草,每格花费为f.最后还需要在草和洞之间修围栏,每条边花费为b. ...
- Spark 性能相关参数配置详解-任务调度篇
随着Spark的逐渐成熟完善, 越来越多的可配置参数被添加到Spark中来, 本文试图通过阐述这其中部分参数的工作原理和配置思路, 和大家一起探讨一下如何根据实际场合对Spark进行配置优化. 由于篇 ...
- Java-实体与集合转换
import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector ...
- linux系统/proc/stat信息与top的cup信息的联系及区别
一. /proc 目录 Linux系统上的/proc目录是一种文件系统,即proc文件系统,与其它常见的文件系统不同的是,/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文 ...
- VMware Workstation 虚拟机暂停后无法启动 出现Exception 0xc0000006 (disk error while paging) has occurred.错误
虚拟机暂停了,突然停电,再开机后无法启动暂停的虚拟机,出现下面的错误 VMware Workstation unrecoverable error: (vmx)Exception 0xc0000006 ...
- [C++] Memory_stack_heap
STACK_HEAP_MEMERY_MAP NOTICE: For p1 , where is the address of p1 ?(0x200400) IN STACK For p1 , wher ...
- p1429 平面最近点对(加强版)
传送门 分析 我们可以枚举每一个点算它的最近点 估价函数应该分为3种情况计算: 大于max,小于min,位于min和max之间 代码 #include<iostream> #include ...
- cakephp中sql查询between
$trading_list = $this->Trading->find('all', array('conditions' => array('buy_time BETWEEN ? ...