进阶光照与材质之模拟真实世界的光照

发表于2017-11-17
评论0 3.9k浏览

读书笔记第二章讲的也是基础知识,介绍了四中类型光的光照模型,点光源,面光源,方向光,聚光灯,和他们的光照模型,还简单介绍了下GI。


这章的几个topics:
1.理想的点光源
2.几何衰减
3.光照通过物质的衰减
4.方向光
5.面积光
6.聚光灯
7.本地和全局光照模型
8.环境光
作者首先介绍了真实世界中一些光的例子,有各种各样的形状颜色和大小。实时渲染需要每帧都来计算所以需要注意权衡消耗,离线渲染就可以慢慢渲染计算复杂的高品质GI。
光照之所以显得真实是光衰减的体现,所以计算光衰减就是计算光照的一大目的。


理想的点光源

在虚拟世界中我们只能模拟理想情况下的点光源,点光源也是所有种类光源的原型,它的特性适用于所有种类光源,嗯,点光源是老祖宗,所有光源都是由点光源变种而来。
点光源就是在一点发射以某个半径长度范围内的球型的能量,但是在真实世界中的点光源是没有范围界限的,但是我们为了节约计算,为它定制范围,以免去那些小的可以忽略不计的光强。
 
这里出现了一条定义:球是按立体角来划分的,球面度是立体角的单位,4π球面度就是整个球。
 
点光源是以流明lumen为单位的光通量luminous flux来测量辐射功率。每段时间的能量被称为flux通量,然后这个光能使它luminou发光。很方便的称luminous intensity光强作为每单位立体角发射的能量。对于可见光,每单位测量的光强称为坎德拉candela(以它为单位)。
power功率是每单位时间测量出的energy能量。光强由功率得出。能量和功率这两个单位是不可互换的。一些光照单位比如:candela,lumen,candlepower,nit等等它们之间的转换需要单位变换。


接着说到了几何衰减,光强有对距离的平方反比性,就是对到被照明物体表面的距离的平方成反比,衰减就与这个距离的平方成正比。


衰减的产生是由于距离和光穿过材质带来的能量转移而产生的,这个能量转移与光穿过雾和浑浊水被其中的分子小颗粒大颗粒吸收、散射的情况不同,也就是说fog等的吸收、散射效果与光衰减无关,衰减是不变的。另外注意光怎么衰减都不会减到0,因为就算你除以无穷大的距离平方他也只是趋近于0但并不为0,这就是之前所说真实世界的点光源是没有范围的的原因。
 


自然界是没有完美点光源的,但是接下来要讲的面光源更接近与真实世界的光源
点光源的光照公式如下图,基本上是由于衰减而产生的变化。
 

方向光

最常见的方向光是太阳光。刚才讲点光源的时候说过了,所有类型的光源都是由点光源的变形,那么方向光是点光源怎么变得呢?
情况1:方向光就是无限远的点光源,角度相差过小可以忽略不计
情况2:点光源的大小大于或等于被照明物体
一张图示全部解释
 
还是举太阳的例子,太阳离地球比十万八千里还远,好吧,其实是150000000km,
太阳与地球两端的角度小于0.005度,当然可以忽略不计啦。又有人说了,衰减怎么办呢?等到能够计算衰减的时候地球的另一半都是黑天了,根本没有光照。。。这是一点,另外更重要的了一点,对于遥远的光照距离,地球直径这个小小的厚度所产生的衰减差也是小到可以忽略不计。
 

这也就是为什么在unity中对光照的齐次向量_WorldSpaceLightPos0,的xyz分量对于点光源是表示位置的,对于方向光是表示方向的,而z就是齐次部分,我们知道,对于其次部分一般情况是为1,如果为0,就代表无穷大也就是表示方向,这也就是为什么对于方向光的z部分为0,点光源的z部分为1。

方向光的公式的计算量很小基本就是一个常量,如下图
 

面光源

面光源是最复杂计算量最大的光照模型,在unity中使用的话需要提前烘焙不能实时计算,以它为基础可以引申出spotlight聚光灯
那么面光源又是由点光源怎么变来的呢?面光源可以理解为一个矩阵的点光源集合,如下图
每个点光源都计算一遍衰减,当然消耗得多,但这也是面光源看起来非常真实的原因。
 
可以用soft shadow和softer attenuation技术来模拟面光源的效果。
到达照明物体的能量与其与面光源的距离和他们之间的角度有关
面光源的衰减的计算也与点光源不同,不只是简单的距离平方反比,
不同大小和形状的面光源计算衰减的复杂性也不同,普遍的计算方式如下:
 
A为光衰减受距离平方影响的速率,B决定衰减的线性行为,C为偏差系数
 

spotlight聚光灯

聚光灯是面光源的延伸,聚光灯既有方向光的性质又有面积光的性质,它通过阴影的本影umbra和半影penumbra来表现柔和的光照(阴影)
 
可以把聚光灯想象为一个圆筒照在点光源上,阻塞部分光照,根据圆筒开口范围不同阻塞范围不同露出光大小也不同。
 
本影和半影与圆筒的关系与圆筒开口范围与点光源在圆筒内的位置决定,圆通开口大小并不能改变半影范围大小,因为点光源本质不变,半影大小与光源在圆筒内的位置和光源大小有关
 

想要定义聚光灯模型,我们需要几个参数,聚光灯的方向,本影方向,半影方向,
 
 

当点在本影范围内时,光照强度为1,如果在半影范围之外光照强度为0。如果在本影到半影角度之间则按下面的公式计算,F为衰减因子,各种余弦,,计算是不是也挺复杂的,挺消耗的。
 

全局光照和局部光照和环境光
这里简单介绍了一下为后面的光线追踪做铺垫。
在真实世界中物体受到的光照不止来自于光源,也来自于其他物体的反射。局部光照就显得效果非常虚假,甚至没有阴影。
但是我们如果计算每个物体的反射光作为光源的话(比如光线追踪)有很消耗并且很慢,不适宜用在实时渲染,所以我们用环境光来做近似,以使得没有光照的地方不至于没有一点亮度。
环境光消耗很少。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引