11.1_基于物理的渲染
提纲
在之前的光栅化阶段,我们发现光照、纹理、阴影的计算背后其实都有物理学原理在起作用。
越贴近真实的物理过程,我们的渲染结果也就越完美。
其实在图形渲染中,有一种渲染方式,就是基于物理的渲染,PhysicallyBasedRendering,也就是我们通常简称的PBR。
简单地说,物理渲染是一种着色和渲染技术,这种技术,通过使用更符合物理学规律的方式来模拟光线,使得物体看起来更具有真实性。
PBR的核心技术是BRDF,也就是双向反射分布函数。
它描述的是物体表面将光从任何一个入射方向反射到任何一个视点方向的反射特性。也就是说,从入射光经过某个表面反射后如何在各个出射方向上分布
真正学习BRDF需要我们在数学、物理这些方面都有一定的基础。数学方面,需要大家了解球面坐标、立体角、投影面积。物理方面,就需要具备辐射度量方面的基础了。
以BRDF为基础的PBR的模型有很多。比如下面常见的7个。
什么是经验模型?也就是使用基于实验提出的公式对BRDF进行快速计算。最典型的就是在9.3节中给大家介绍过的冯模型,Blinn_Phong模型,Whitted_Phong的模型。后面的两项,则是基于物理的BRDF模型,这样的模型需要根据物体表面材质的几何以及光学属性建立反射方程,从而计算BRDF,实现极具真实感的渲染效果。这也是我们今天关注的重点。
在基于物理的BRDF中有三个重要的知识点,那就是次表面散射,菲涅尔反射,微平面理论。
首先我们来看看次表面散射。真实世界中,物体有很多是半透明的,比如皮肤/玉/蜡等等。
次表面散射就是光线射入半透明材质以后,在内部发生散射,最后射出物体并且进入视野中的现象。
这时候光的传递过程是这样的。光从表面进入物体,经过内部散射,除了有部分光从原来的入口点重新射出。还有部分光,通过物体表面的其他顶点射出来。
比如这里,电影<超能陆战队>中大白的白色身体。略微有点透明的感觉。这其实就是典型的次表面散射现象。
第二个理论,是菲涅尔反射,或者说叫菲涅尔效果。大家知道,当光入射到折射率不同的两个材质的分界面的时候,一部分光会被反射。而菲尼尔反射告诉我们,我们所看到的光线会根据观察角度的不同,以不同强度来进行反射。
根据菲涅尔反射,这个视线垂直于表面的时候,反射就比较弱。视线如果不是垂直于表面的时候,夹角越小,反射就越明显。就像这幅图所表示的,这个猴子的视线,与平面的夹角越小,反射就越明显。所以,当这个猴子看到这个河流的时候,近处的反射不明显,更多的看到的是折射、透射,所以可以看到河底的石块儿。而远处的反射就很明显了,看到的更多的是倒影。
同样的道理,当你看一个圆球的时候,圆球中心的反射就会比较弱,而靠近边缘的地方,反射就会比较强,甚至会照射出周围的物体。
最后,我们再来看看所谓微平面理论,就是把一个物体的表面看做是由一系列微小的,我们肉眼不可见的微平面所构成的一个宏平面,它的整体有一个法向量方向N。
而这些细小的我们肉眼不可见的平面就是微平面,每一个微小的平面,都会根据他自己单独的法线方向N',在这个方向上计算反射光线。
V是视点方向
L是照明方向
H是半角法线,也就是V和L的角平分线
图中的这个黑色平面的法线,与半角法线是相等的,所以,它会反射光线,
但是也不是所有这样的微平面都会反射光线,很显然,有部分可能会被遮挡
微平面理论,在实际计算的时候,就采用了一个NDF,也就是法线分布函数,我们把它叫D(h)。
用它来描述组成表面一点的所有微表面的法线分布概率。
可以这样理解,像NDF输入一个朝向h,NDF就会返回朝向是h的微表面数,占了微表面总数的比例。
比如说我们可能算出有8%的微表面朝向是h的,那么就有8%的微表面可能把这个光线反射到这个V方向。
那么在光照作用下,在微观层面上不规则的表面就会造成光的漫反射,因此。我们得到的高光反射是模糊的。大家看这里。这个高光反射其实有模糊的感觉。
其实,在这里大家就可能联想到了几何纹理部分的内容了,这里,我们要进行一下说明。在几何纹理中,我们想要得到一种表面凹凸不平的效果。
所以不管我们真的让表面凹凸不平了,还是只是给了他一个法线上的扰动。目的,都是在于利用光照计算,达到凹凸不平的视觉效果。
比如左边浮雕贴图后的效果,可是这里的微平面理论,它的立足点在于,他认为即使在光滑的表面,在微观上都是凹凸不平的。比如右边的这个球的表面实际上很光滑了。我们只是用微平面的方法实现了模糊的高光反射,以取得更强的真实感。
11.2_游戏中的渲染
看大片、玩游戏都是我们主要的娱乐项目儿,这两项,都离不开图形学,离不开图形渲染。
一般对于一部影片,他为了追求真实感,往往可以不计成本。当然,达到的效果也要看这个时代计算机的处理能力。
比如皮克斯公司的约翰拉塞特为了一部玩具总动员等待了十年。
而卡梅隆导演为了一部阿凡达,同样也是等待了十年。
这个时候可以用离线渲染的方式使画面达到极致。因此,每个时代的经典大片都能反映那个年代图形技术的最高水平。
然而对于游戏,要求就有所不同,他需要实时渲染。有时为了保证游戏画面的流畅,我们不得不在画质上做出妥协。
我们今天将对游戏中的渲染技术进行讨论。这些渲染技术有些是为了提高玩家真实感体验的,有些是为了提高游戏的实时性的。
比如运动模糊,这种现象是因为相机或者摄影机的快门时间内物体的相对运动产生的。
我们在10.1节中曾经进行过讨论,通过合并有微小位移的多幅图像,就可以达到运动模糊的效果。
第二个就是镜头泛光效果,这是由于眼睛的晶状体和其他部分的散光而产生的。他的表现,是在光源附近出现一种辉光。
在现实世界中,透镜无法完美聚焦是泛光效果的物理成因。即使是理想的透镜,也会在成像的时候由于衍射而产生一种名叫艾里斑的光斑。
而我们在10.1节中,也给出了这种特效的大致模拟方法。
第三个,是天空盒。他其实是纹理贴图技术的应用,天空盒是一个包含了整个场景的立方体。他周围的六个面都有不同的贴图。游戏中使用天空盒的例子有群山、白云、星空,比如这里的天空和就来自于上古卷轴三中的星空。
天空盒的作用是通过比较小的开销,让玩家以为他处在一个比实际大得多的环境当中。也就是说,这个玩家感觉它位于一个广袤的世界中,但实际上,他只是在一个小小的盒子里,比如这个场景中,玩家感觉到这个云端在远处。但其实,他只是某个立方体表面的一张贴图。
之前我们做过这个天空盒的实验。大家在今后开发游戏的时候,可以用到它。
第四个是公告板_Billboard技术。这是一项让着色四边形根据视角方向来旋转的技术,它产生的效果让物体看起来总是面向观察者。比如游戏中人物的血条,无论你的镜头怎么转,血条对观察者的位置是不变的。
它还可以完成很多特别的效果,比如实现没有固定表面的效果,烟雾、火焰、爆炸、云彩等等。
其实我们在之前的5.4遇见非规则粒子系统中介绍过他,并且在给出的历程中对他进行了实现。今天我们重提他,想告诉大家,这些效果虽然可以由其他更真实的技术来实现,但是对于游戏来说,公告板技术最吸引人的地方在于实现这些效果所使用的系统资源极低。
以上的四种技术,在我们的课程中都不是第一次出现了,那么下面的两项技术对于大家来说就是全新的,他们一个是延迟渲染,一个是层次细节。
首先就是延迟渲染,既然说到延迟渲染,我们就会想到它一定有一个相对的概念,的确他相对而言的就是正向渲染。
所以,我们首先要来看看正向渲染的过程。那也就是渲染管线的一般流程,
光照计算是在片元着色中进行的
深度测试它属于片元操作的工作之一。
大家有没有想过这样的一个问题,我们辛辛苦苦进行的着色计算。得到的结果未必会对最后的显示产生影响。既然这样,我们是否可以这么考虑?
那就是先做深度测试,确定好哪些片元可见,再进行着色计算。
这样一来是不是可以减少计算量?
我们来分析一下,比如这个场景中有N个物体,M个光源,那么就需要进行N乘以M次光照着色计算。
可是如果深度测试之后?
只需要对每个像素点对应的可见片元进行一次着色计算。
如果我们粗略的比较,在复杂场景中可见的物体一定远小于N,那么计算量也就远远小于N乘以M了。
只是这样一来,在延迟渲染的过程中,就需要一个几何缓冲区_G-Buffer。它主要用于存储每个像素对应的位置/法线/漫反射颜色以及其他有用的材质系数。根据这些信息,我们再深度测试之后,就可以对每个像素进行光照处理了。
这里,我们可以看到正向渲染和延迟渲染的对比,很显然进行了延迟渲染后,这个画面的流畅度高了许多,这正是我们游戏中需要达到的效果。
其实在延迟渲染中,具体又有延迟渲染和延迟光照两种方法。但是在这里,我们就不详细进行介绍了
而在最后,我们不得不提的是LOD,也就是Levels_Of_Detail,意思是多细节层次,他是游戏中十分常见的渲染技术。
LOD技术指的是根据物体模型的节点在显示环境中所处的位置和重要度,动态的选择渲染不同细节的模型,从而来决定物体渲染的资源分配
比如对于这个模型。随着试点逐渐靠近他。我们的面片数可以从200细化到400显然面片数越多,效果就越真实。但同时也需要更大的开销,包括存储和计算资源。因此,这个技术,一般用于解决运行时流畅度的问题。
比如这里的这个超人模型。最左边的模型,有6784个顶点。而最右边的就降低到了1029个顶点。显然,在运行不够流畅的时候,适当的减小点数也是一个有效的方法。
比如在古墓丽影崛起这个游戏的场景中,我们看一下这个背景部分,我们以蓝线为界,他左边的顶点数少,右边的点数多。显然在右边看到的细节就越多。因此,LOD是一种采用空间换时间的方式。
这就是今天我们给大家讲的游戏中的渲染技术。其实游戏中的渲染技术、渲染优化技术还有很多。要想学好渲染技术,学好图形学,我们都还要走一条很长的路。