渲染与挑战
渲染方程
渲染最初的理论:James Kajiya提出的SIGGRAPH 1986,理论方程。

如何一个x点,w0观察角。x点自我发光,射出的光会被看到。这个点如果被周边其他的光源照上去时,他再反射会是什么结果。
挑战
辐射度,辐射出去的能量、光照在物体上,物体反射出去的能量叫做Radiance ,入射的能量叫做Irradiance。
挑战1:Visibility to Lights 光的可见性(阴影)和Light Source Complexity 光源复杂度
挑战2:如何在硬件上积分(如何做shadering)

- 在球面函数上把光和材质之间的积分(卷积)
挑战3:所有的物体都是光源
康奈尔box
基础光照解决方案
模拟一个均匀的光场,进而继续研究:

- simple Light: 简单的主导光
- ambient light :把场景中所有的光(环境光)用一个光来表示。
- Environment Map Reflection: 环境贴图
Blinn-Phong 材质模型

光可叠加,经验派们认为光照方面的组成:
- 环境光(ambient)+物体的漫反射(diffuse)+物体的镜面反射(specular)
- 以此为基础,就是Blinn-Phong模型思想。
存在问题:
问题1:能量不保守(出去的能量有可能大于射入的能量)

问题2:只能做简单的物体,复杂的物体看上去会像塑料。

Shadow Map
预处理出一个shadow map表示阴影部分。

- 找到光源对物体的zbuffer,对比视角的zbuffer。不一致就是阴影
存在问题:
采样率不一样。采样精度不够。

光源越贴近地板,阴影拉的越长,越难做。
方案总结
simple light + Ambient表示基本材质。
environment map去hack一下快速的反射,然后把光的部分hack掉。
用Blinn-Phong把卷积的问题给简化了。
加上一个shadow map简单在光源空间采样,hack出来这部分光是否可见。
上个时代的解决方案
预计算的全局照明
3A游戏的第一次入侵,这里是上一个时代(5-10年前的3A的游戏)的技术。
主要采取空间换时间的思路。
全局光照=直接+间接+间间接+间间间接+…

Indirect Light表示方案
Indirect Light 间接光
使用多项式计算与材质BRDF卷积可以计算间接光照,这其中有以下两个可优化的方向:
- 良好的压缩率: radiance probes 探针存储间接光照信息,信息压缩率越高越能减少内存占用。
- 易于与材质函数集成: 间接光照需要与材质函数集成计算,尽量减少计算消耗。
卷积定理
空间域—->频域(GAME101 callback)

卷积定理的应用能够提高压缩率,减少内存占用。
Spherical Harmonics
Spherical Harmonics SH 球面调和函数
0阶:加权平均
1阶:在不同方向
2阶:…
球谐函数展开,只取前几阶作近似,这样能减少计算的难度。
eg:只取到1阶的参数

对于不同阶的压缩方式不一样,效率了很多。
- 低阶时参数少了探针信息就少了,存储空间减少
- 计算难度降低
Light Map
Light Map 光照贴图
最早的light map不是做全局光照的,后来才被用来计算全局光照。
步骤一:制作atlas
atlas(航海图,地图):很多的几何拍到一张图上去。

- 三维空间复杂的几何投影到二维的空间。
- 把三维的空间变成几何,再几何简化,再分配。
- 尽可能把每个几何在texture的精度平均分配。

步骤二:lighting
light farm:很多台电脑做成的集群
光源设置好、参数设置好,直接开始烘培。

优缺点
- 好处:效率高、可以产生很多很细节的效果(因为是离线baking)
- 缺点:非常长的预计算时间、只能处理静态的光和物体、占存储空间(100m左右)
light map基本现在被淘汰了
核心思想
空间换时间。
游戏场景参数化到二维的texture(那也可以考虑变成三维的xxx?)
Light Probe+Reflection Probe
light probe 光探针:
- 捕捉周围环境的光照
- 可为动态物体提供间接光照效果
Reflection Probe 反射探针:
- 用于捕获周围环境并生成一个立方体贴图
- 可以用来模拟物体的反射效果。
优缺点
好处:runtime快,处理静态动态物体,可以runtime更新
缺点:比不上light map的细节效果(采样相对少)
物理材质解决方案
微平面理论
Microfacet Theory 微平面理论
表面有许多的反射,看起来粗糙还是光滑和其表面法向的聚集度有关。
法向比较聚集就光滑。
BRDF
BRDF 双向反射分布函数
- 描述物体表面将光能从任何一个入射方向反射到任何一个视点方向的反射特性的函数
- 定义为出射方向Radiance与入射方向Irradiance的比值
GGX模型
特定的BRDF模型,基于微平面理论。
光打到物体表面,要么被反射,要么被吸收。
被反射的光
反射多少取决于法向分布,分布散乱,高光就很发散。
被反射的光:cookTorrance模型
roughness的参数α+Fresnel的参数,就能符合物理基础假设的去推理材质。
DFG
Normal Distribution Function(法向分布方程)。会习惯用GGX这个光照模型。

引入方向分布的随机度 roughness。

- GGX和其他光照模型对比。
- (音响比方:高音要脆,低音要沉)
Geometric attenuation term(微表面几何内部的遮挡)

Fresnel Equation (菲涅尔现象)
五次方程
被吸收的光
金属的电子捕获光子(specular 镜面反射)
非金属无法捕获就继续随机的反射出去(diffuse 漫反射)
Disney的BRDF信条(规则)
- 每一个参数都要符合艺术家的直觉。
- 要用尽可能少的参数。
- 所有参数值的范围最好是0-1。
- 参数怎么调,他们的组合都是要有意义的。
PBR
一种基于物理的渲染技术
使用基于物理的BRDF模型来模拟光线与物体表面的相互作用。
SG模型

用图来调节,能够非常精准的进行调节。
MR模型

在SG模型外包了一层,把SG能够精准调节的参数做限制,将灵活度下降,把可控性提高。
缺点:非金属和金属过度时,可能会有一个小小的白边(目前无特别好的解决方案)
IBL 光照
Image-Based Light IBL 光照
一种先进的光照技术。用一个cube展开,表达一个四周的情况。
对真实的光照提前进行一些预处理,这样就可以对整个环境的光照和卷积进行处理。

总结
BRDF材质模型:Diffuse 部分+specular部分
Diffuse部分
Diffuse Irradiance Map:知道环境光的Diffuse部分,得到整个光场卷积的结果,存起来(空间换时间)
Specular部分
specular解决方案就是在取近似,做了大量的假设。
优良:在环境光照中看得到一些高光部分
roughness部分:不同roughness(粗糙度不同,结果也不同)的结果存到硬件中的mmap中(q map的功能)。相当于可以在三维空间去查结果。每一层当单独算。
BRDF、PBR和IBL
PBR是一种渲染框架,依赖于BRDF模型来计算物体表面的光照效果
IBL提供了环境光照数据,这些数据被PBR和BRDF模型用来模拟更加真实和复杂的光照效果。
Shadow的解决方案
Cascade Shadow
最经典的解决方法。

- 世界越开阔,从光视角采集的shadow map精度不够。不同物体的shadow所需的精度不一样。
- 这时把shadow分成几层,根据视锥的举例,采集不同距离下的shadow map。
不同层级之间要做插值处理。
问题:存储空间大、成本大(远处shadow相当于要绘制整个空间)
软阴影算法
做软阴影的算法:PCF、PCSS、Variance Soft Shadow Map
总结
光:Light map+light probe
材质:PBR模型(SG、MR模型)+IBL(对环境光、背光面的表达)
阴影:Cascade shadow + VSSM等
新时代下的渲染
Light map、light probe等这些在突破的边缘。
Real-Time Ray-Tracing 实时光追:现代游戏比较多都用来做反射。将会改变实时全局光照。