环境光照用一张图定义了场景中任意一点在不同方向上接受到的来自无穷远处的光照强度,它的强度与位置无关。我们首先要研究的问题是:给出一个环境光照,我们如何去计算不考虑遮挡或阴影下的Shading结果。这种操作在工业界被称为 IBL(Image-Based Lighting)
环境贴图就是在场景中任意一点往四周看去可看到的光照,将其记录在一张图上这就是环境光照,或者也可以叫做IBL(image-based lighing)。通常我们用spherical map或cube map来存储环境光照。
渲染方程
IBL不考虑遮挡,所以Visibility项可以舍去:
渲染方程中使用了蒙特卡洛方法将积分分解成采样大量随机样本可以得到一个近似解:
但是在实时渲染中,使用蒙特卡洛算法采样的开销太大,达不到实时渲染的要求。
近似公式
需要注意,f(x)的积分范围从Ω变成了ΩG,只需要积有值的范围即可。
这个约等式成立有两个条件,满足两个条件之一,渲染领域就认为他们相似相等:
- 积分域Ω足够小
- g(x)足够smooth
example:
以渲染方程中的Visibilty项为例(为了方便不考虑自发光)
使用约等式把渲染方程的VV项拿到积分外:
此约等式成立的条件:
- g(x)g(x)的积分域很小:点光源(一个位置)或方向光源(一个方向)
- g(x)g(x)足够smooth:Diffuse的BRDF 且 面光源的Radiance是均匀分布的
这也是Shadow Map的一个解释。
拆分渲染方程
首先BRDF有两种情况:
- brdf为glossy时,覆盖在球面上的范围很小,也就是small support(积分域)
- brdf为diffuse时,它会覆盖整个半球的区域,但是是smooth的,也就是值的变化不大,就算加上cos也是相对平滑的
满足近似公式成立条件,可以得到不考虑遮挡项的渲染方程的近似:
处理L项的积分
L项的积分范围,是和BRDF范围相关的:
为了只采样一次入射光,需要对环境贴图进行模糊。不同的BRDF有不同的滤波核大小。
L值在BRDF相邻两个Level采样结果之间差值:
这样对于一个着色点,L的值只需要两次采样并差值就可以得到。
处理BRDF项的积分
仍然可以用预计算来解决后半部分积分采样的问题,但是预计算的话我们需要将参数的所有可能性均考虑进去,维度太高,存储空间太大,需要降低维度。
假设我们使用Microfacet BRDF模型:
- F是菲涅尔项,主要参数有三通道的初始反射率R0R0,以及观察方向ωoωo
- G是几何项,主要表示微表面之间的遮挡关系,主要参数有法线nn,观察方向 ωoωo
- D是法线分布函数(NDF),主要参数有观察方向 ωoωo,粗糙度αα等(半程向量hh可以借由 ωoωo ωiωi计算得到)
microfacet brdf中,考虑的是菲涅尔项、遮挡项以及法线分布项,由于此时暂时不考虑阴影,此处需要关注的是F和D。其中R0,ωo,n均为三维向量,再加上α,存储容量爆炸。
5.1 菲涅尔项:将R0拆除积分
首先,我们使用菲涅尔项的Schlick's approximation来替代BRDF中的F(o,h),Schlick's approximation可以表示为:
其中ωo是观察方向,n1、n2是两种介质的折射率
带入BRDF:
我们按顺序做了如下的变形:
1、在BRDF项中显式考虑菲涅尔项,并做了一个恒等
2、变形用Schlick's approximation替换其中一个菲涅尔项
3、将替换后的积分式拆开,将R0单独提取出来
5.2 法线分布项:使用夹角θ代替ωo、n
假设此处的BRDF我们使用各项同性的法线分布函数,比如Beckmann分布:
将半程向量h拆开可得:
菲涅尔项中的h⋅ωo也可以拆开:
其中带i下标的是积分变量。可以看出其实我们并不太关注 ωo和n的具体值,我们只关心它们的夹角θo。也就是说,不论ωo的方向如何变化,只要夹角θo不变,积分A和B的值就不会发生变化。
5.3 预计算的二维纹理
经过上述的近似拆分过程,我们将原BRDF积分项拆成了两个积分并将积分所依赖的参数降到了2个,θoθ和粗糙度 α。可以选取不同的θo和粗糙度α,分别计算两个积分,保存到一张2D纹理的两个通道:
当使用时输入θo和 α ,在纹理上查询出两个积分的值,再结合初始反射率 R0 ,就可以计算出原BRDF的积分结果。
6. 总结
首先不考虑遮挡把V项干掉;用近似公式将L和BRDF拆开;通过对Cube Map生成Mipmap采样差值取LL;将BRDF预计算为一张二维纹理,运行时采样成反射率可得到。