01 - IBL
我们即将开始实时环境光照之旅。本文先复习GAMES101学到的环境光照;然后介绍基于图像的光照(Image Based Lighting,IBL),包括它的split sum
方法。
复习环境光照
就是用一张图片记录,在场景中往任意方向看到的光照(光照距离无限远)。
可以用 球面贴图(Spherical map) 或 立方体贴图(Cube map)来存储环境光照:
环境光照着色问题
接下来康康环境光照是如何着色的,先不讨论阴影问题。解决渲染问题就要解渲染方程,这里给出RTR的渲染方程(排除阴影):
通解——蒙特卡洛积分
使用蒙特卡洛积分可以得到数值解,但它需要朝上半球表面的所有方向进行大量采样,很慢。
优化——IBL
避免大量采样
如何避免对所有方向的大量采样?看看渲染方程的BRDF项:
左图中,物体光滑,它的BRDF是glossy
的,积分范围小。
右图中,物体粗糙,它的BRDF是diffuse
的,积分值很光滑。
那么就能用之前的约等式将环境光项Li
和BRDF项fr
分开:
接下来就该分开对两项求解了。
求解环境光项
首先,要对环境光照进行 “预过滤(Pre-filtering)”。根据不同的滤波核,对环境光贴图进行预过滤。接下来查询的时候,如有必要可以在不同滤波核尺寸的成图间进行插值,然后查询。
然后,在着色点的 镜面反射方向 对预过滤环境光照的查询。
如图,当我们在获取着色点BRDF的反射波瓣(积分区域)时,需要对波瓣周围进行采样(左图)。而这种操作和刚刚说到的在镜面反射方向查询预过滤结果(右图)很相似,于是可以通过这个操作来避免采样。
现在环境光可以避免采样了,接下来看看如何让BRDF项避免采样。
求解BRDF项
BRDF项也是一个积分,我们可以通过 预计算 的方式来计算BRDF,但如果直接预计算,耗费的时间和空间很大。因为要预计算粗糙度,菲涅尔项等的所有可能组合。有没有办法减少预计算的复杂度呢。
在BRDF项中,重要的两项为 菲涅尔项(Fresnel term) 和 法线分布函数(Normal Distribution Function)(忽略阴影)。
其中,菲涅尔项可由
Schlick
近似 来简化:从
Schlick
近似得出, 基础反射率/颜色和 入射角 可以近似定义微表面材质的颜色。PS:RTR中,入射角、出射角和入/出射光线与半程向量的角近似相等。 而法线分布函数可由
Beckmann
分布近似:其中,
决定分布的 roughness
,即反射波瓣的胖瘦/材质是diffuse
的还是glossy
的;是半程向量和入射光线的夹角。 综上,微表面BRDF可由3个项
近似决定。
我们将渲染方程中BRDF项的菲涅尔项用Schlick
近似显式地写出来,将
可以发现,整个计算过程中的变量就只剩下
接下来,通过预计算算出
需要的时候查表就行。
最终,解渲染方程就不需要进行蒙特卡洛采样了,而且效果也不错:
分割和(split sum)思想
为了求解渲染方程,将积分中的环境光项和BRDF项分开求积分,这种算法被称为 分割和思想。为什么不是分割积分法?
在工业界中,人们通常把积分式写为求和式,因此是分割和思想。这个分割和思想是高级PBR渲染的基础。
环境光照阴影问题
实际上,在RTR领域中,环境光照的阴影很难做。因为:
- 对于四面八方的光源,都要生成SM;
- 采样困难,算不出该着色点的可见性;
工业界解决方法
在工业界中,人们只是从最亮的光源处(如太阳等)生成一个/两三个阴影。
学术界解决方法
在学术界中,相关研究有【详细内容待补充】:
- 不完美阴影贴图(Imperfect Shadow Maps)
- Light Cuts
- RTRT(可能是最终解决方案)
- 下篇文章将要介绍的 PRT(Precomputed Radiance Transfer)
参考资料
- GAMES202: 高质量实时渲染 (ucsb.edu)