
光、材质与着色器
这节课会有很多繁杂的数学公式,但不必深究,可以当作一个故事来听。
让我们从简开始
体现了光可叠加原理,无论光来自于哪里,都可以线性叠加起来。
Blinn-Phong模型的问题:光的能量是不守恒的,光线的出射能量可能超过1.
左图这个圆球,如果有光漏进去之后,里面不停的反弹会让内部变亮。
Blinn-Phong很简单,但是和真实世界的关系没有那么大,当想表达真实世界中各种各样的问题的时候无论怎么调看上去都很塑料。PBR材质就可以把各种金属、非金属、塑料……材质表达到位。
ShadowMap:从光的视角渲染一个场景,不需要任何数据,只需要告诉我深度,深度表示光到某点的距离。从投影区域计算反射到物体上的距离,如果这段距离大于光源到遮挡物的距离的话,那就在Shadow中了。
基于预计算的全局光照(GI)
场景中百分之九十的物件都是不动的,那么我们就可以通过预计算来提前计算好各种光照。
空间换时间
但是全局光照所需要的数据量特别大,如果屏幕上看到的每个像素都要去做这个运算那就会疯掉。
解决办法:傅里叶变换,能够把一个信号,分解成几个不同信号频率的累加。
一张照片,可以变成傅里叶变换的频率谱,从空间域变成频域,如果只截取频域中的一小段,实际就已经完成了对信号的一个粗糙的表达。
这些所有的无限维的函数,都是正交的。
二阶或三阶的球面调和函数都可以转换成简单的向量运算
存一个在点上的光场,通过这种压缩,在计算机上只需要32bit就能够表达一个色彩信息(RGBA)。并且每一层信息的权重是不同的
第一种算法:空间换时间,预计算全局光
优点:实时计算很快;烘培了很多优秀的环境光照细节
缺点:预计算时间很长;只能处理静态物体和静态光;需要大量GPU存储成本(空间换时间,几十Mb到上百Mb)
第二种算法:游戏空间中的探针
游戏场景中都Scatter无数个Probe,物体到其中一个Probe位置时,采样周围的Probe做插值来计算光照。(空间体素化)
摆放Probe是一个非常麻烦的事,曾经需要手动点,现如今可以通过算法程序化的方法自动摆放。
游戏中的反射捕获大多数是非常低频的,可以运用之前的压缩算法压倒四个值,但是游戏中会有少部分环境需要非常高亮得反射,反射对高频很敏感,所以需要很高的精度。
优点:实时运算快;能同时结合静态和动态物体;同时处理漫反射和镜面反射。
缺点:因为能对动的物体处理,所以不能实现高质量的预计算光照阴影,比如那种柔和的阴影边缘;光照探针也需要预计算。
基于物理的材质Physical-Based Material
用一套假设解决了一系列光学现象:认为一个表面就是无数的反射,金属表面粗糙和光滑与否决定于法向都集中一个方向就很光滑,像镜子;如果分散的开,就看上去就比较糊。
D 法线分布函数 normal distribution function
GGX模型函数图像(左下角绿色)高频很尖锐,低频缓和(举例:音响高音脆,低音沉就是个好音响)。表达高光足够尖锐,想要低频表达时也不会彻底消失(Phong模型Power的高光数值很高时就很生硬)。
Roughness在其中表达了法相分布的随机度,Roughness越高随机性越强。
G 几何自衰减(自阴影)shadowing-masking function
每个表面凹凸不平,光可能会被自身挡住。基于GGX理论,先算一遍模型和视线的阻挡关系,再算一遍模型和入射光的阻挡关系
F 菲涅尔现象
当视线角度越靠近物体切线方向的时候,反射系数就会急剧增加,就会产生更强的倒影效果。
大神们推导出的0~5次方
通过不同的光线和摄像机角度测量BRDF。
迪斯尼BRDF信条
引擎不是一个自然界模拟器,而是工具,把快乐留给设计师。
PBR Specular Glossiness模型
几乎没有参数,所有参数都用图形表达。
优点:不需要数值控制,设计师可以绘图进行精准的像素级控制。
缺点:过于灵活,特别是Specalur的RBG通道,设计师一旦设置不好,菲涅尔那一项就容易炸掉。
PBR Metallic Roughness模型
只允许设计师设置一个叫Metallic(金属度)的值。
如果金属度低,就是非金属,所以不能进入菲涅尔那一项去计算;如果是金属,就会大量参与菲涅尔计算。
因为SG模型灵活度太高,参数过多,所以MR模型就是在SG模型外面包了一层,防止设计师用错(小白用户指南)。
虽然艺术家灵活度下降了,但不容易出问题。
MR模型仔细观看有一个白边,难以消除。设计师更喜欢MR模型,更符合直觉。