真实感光照的Spherical Harmonics实现方法
游戏中材质质感表现主要是通过对光照传播过程的模拟来实现的。最常见的就是Diffuse的Lambert和Specular的Phong/Blinn反射光照模拟。
Lambert Material Blinn Material
类似以上的一些材质光照模型,实现简单,计算快速,在游戏场景中得到了广泛的应用。
然而这些材质质感不强,渲染效果不真实。原因主要是光照模型过于简化,其中图形学关于反射的两个基本原则都不能成立:
1) 光线传播的能量守恒定律。
2) 光线可逆定律。
追求真实的材质光照表现,并且在游戏中得以应用,成为各个游戏引擎研发的重要目标和衡量性能的重要标准之一。下图为Unity 5发布的Physically Based Shading效果。
如何才能达成以上的渲染效果?以下以Spherical Harmonics(球谐函数)光照计算模型作为入门介绍,供有兴趣的开发同事参考。
Spherical Harmonics是泛函分析中最基本和常用的工具之一,在图形图像专业的应用随处可见,游戏中的相关使用也很普及。(Nvidia的GPU Gems中的Demo有很多篇幅是关于Spherical Harmonics应用的解释。Unity中lightmap的烘焙也是采用Spherical Harmonics 计算light probe。)只要是真实材质光照的渲染技术,或多或少都会Spherical Harmonics的出现,可以说是图形专业的基础技术之一。
引出Spherical Harmonics要解决的问题,首先要回顾一下光照反射的建模。
最简单的光照反射模型是高光镜面反射: 光线相对法线做对称反射。其次是漫反射,入射光线在模型表面的入射点做均匀的散射, 即下图所示的Lambert Model。
而接近真实光照反射的模型是这样的:一束光线沿入射方向在模型表面向法线方向的半球做反射强度分布不均匀的散射,这就是BRDF反射模型。而更为复杂的情况,入射光线会进入模型内部,进行多次无规则散射,从不同于入射点的其他位置以随机的方向出射。(这种模拟大理石或者皮肤质感的基础模型,即次表面散射BSSRDF。篇幅有限,这部分内容暂且省略)
如果只考虑光线在模型表面的反射,那么只要模拟BRDF的反射模型,就可以模拟出真实的反射材质质感。
问题是: 如果用平行视角的矢量去计算入射到眼睛的光线,根据光线传播的路径,那么每个像素位置都要在法线朝向的半球上对入射光线强度做一次Monte Carlo球面角积分。这个积分的采样率一般会达到百万级别才能消除视觉上的瑕疵。不言而喻,这样直接计算光照反射强度的办法,计算量是非常巨大的。
如何解决这个问题,让复杂积分的计算降级成为一个简单算数问题?事实上,类似的问题在数学领域是一个很老的课题,很早就得到了解决。最早Spherical Harmonics引入到图形学专业,也是数学工具推广的产物。
进入正题,Spherical Harmonics可以模拟BRDF反射模型,简化计算量,是因为其自身独特的特性所决定的。主要可以总结为以下几个方面:
1)Spherical Harmonics为正交函数集合。也就是说函数集合中的任意两个不同的函数乘积在值域上的积分为0。只有函数本身的平方在值域上的积分为1。而且基函数的计算相对简单, 只涉及正余弦和多项式的乘法,而且有迭代的特性。
2)Spherical Harmonics顾名思义是分布在球面上的函数, 而且是低频光滑的。
3)可以通过矩阵对Spherical Harmonics进行旋转计算。
4)最后一个,也是被称为Killer One的属性--任意两个函数在球面上的乘积的积分,等于它们在基函数上投影系数的无穷矢量的点乘。即能量在不同的两个域可以通过不同的计算方式做到守恒。这个性质是使用SH计算光照的关键。
我们要求解的反射光光照信息,即在法线朝向的半球上对每个入射方向的BRDF信息进行采样积分计算(如下图)
积分在图形学上的标准表达式为
这个公式各项分析为
1)等式右边第一项是自发光,可以省略。
2)积分项又可以分解为两项的乘积的积分,第一项为BRDF函数fr和几何关系表达式G以及可见性函数V的积分,第二项是入射光线分布函数L。
分解问题以后,这个表达式的求解方法正好和Spherical Harmonics的固有特性相吻合,自然形成以下的求解思路:
1)积分是在球面上进行的。
2)积分函数可以投影到Spherical Harmonics的基函数集合上。即原函数等于不同频率的基函数乘以系数的相加之和。(可以回顾一下高等数学里面傅里叶变换的内容)
3)当做了频域的转换之后,积分的值在频域里面就等于基函数强度的点乘。而根据光照在频域分布的属性,可以选取N维向量来估算积分值。
以上的三个步骤,在信号处理的领域,1)2)是数据压缩步骤,把三维空间的信息向频域转换,3)是信号重构,把频域的信息向三维空间还原。
在图形渲染应用时,步骤1)2)是预计算阶段,可以在编辑器使用射线物理模拟光的反射过程,或者直接使用开源的BRDF数据做采样计算。经过前两步得到分解的两个N维向量,这个时候就可以做最后一步重构了。问题是,N的值取多少?
经历的前期大量的预计算,要换取的是快速的实时渲染。光照信号的重构一般是在显卡的像素着色器Fragment Shader里做。那么这个N就不能取太大的值,也没有必要。因为我们需要的只是在游戏场景中还原大部分的真实物理现象,而不是百分之百。经过数据分析和理论验证,针对大部分以漫反射为主的反射模型,N取5*5已经可以达到95%以上的还原度。游戏渲染要求的精度,N取到4*4已经足够了。
因此,如果通过预处理,把Spherical Harmonics投影系数存在顶点或者纹理中,在实时渲染的时候,只需要在Shader中求2个16维向量的点乘,即4次Vector4.DotProduct调用,三次相加运算!
这种转移运算量的方法,已经越来越多的用到对实时模拟Global Illumination的尝试。下面两张图是使用Spherical Harmonics对Sibenik Cathedral和Sponza两个benchmark模型的GI渲染计算效果。
以上是对真实感光照的Spherical Harmonics实现方法的抛砖引玉的概述。当然,Spherical Harmonics这个工具在应用时也有一定的局限性和可扩充性。
SH的主要问题是,Spherical Harmonics的特性决定了它只能对低频光照的精确估算,如果是高频的光照反射,比如下图金属质感的模
拟,SH就需要用极大的N值才能收敛。这种情况下,SH的优势已经没有了。对于新出现的问题,伴随的是更多的解决办法(比如换用小波Wavelet作为正交基函数集合来计算高频的反射模型),不一一列举,thx。