SRBF的全称是Spherical Radial Basis Function,笔者擅自翻译为球面放射基底函数。因为SRBF并不怎么出名,相对来说,SH(Spherical Harmonic)球谐函数更为出名(出现的也更早),而且网上关于SRBF的资料也很少,这里写关于SRBF的文章,主要是针对对SRBF有兴趣的同学,一起探讨一下SRBF在渲染上的应用。在网上找到的唯一比较详尽的资料是在这个网页上(http://www.cse.cuhk.edu.hk/~ttwong/papers/srbf/srbf.html)。里面可以下到一个PPT,关于SRBF的理论在这个PPT里写的比较明白,比较遗憾的是Demo代码原来是可以下载的,(网页上面写着2007年5月是开放下载的)但是现在已经下载不了。
因为SRBF和SH的理念很相似,看过SH后,笔者琢磨着模仿SH的实现,SRBF的实现应该也可以写的出来,事实确实如此,SRBF里除了基函数那部分,其他的都可以借用SH的源代码。所以说学过SH再去看SRBF应该会比较容易理解。推荐一篇CSDN上介绍SH的质量比较好的中文文章:http://blog.csdn.net/BugRunner/article/details/6994379。英文的推荐这篇:Spherical Harmonic Lighting: The Gritty Details.另外SH的源代码网上也有不少可以下载。
这篇文章会浅浅的介绍一下SRBF的理论,探讨下实现细节,还会把个人实现的代码公布一下,希望会对读者有帮助。
SRBF和SH都属于PRT(Precompute Radiance Transfer)的手法。和SH类似,SRBF光照处理过程如下所述:
连续的光照方程 -> 离散的光照方程 -> 分解后的光照方程 -> 投影到SRBF变换得到SRBF系数 -> 利用SRBF系数还原光照方程
这里把The Gritty Details 中介绍SH概念的图拿出来说明SRBF的处理过程,实质上两者在处理流程方面是一样的。流程总体上说分两步,即预处理和绘制。
1) 预处理:连续的光照方程离散采样投影到SRBF,得到SRBF系数。
这一步是在预处理时进行的,Ri是第i个SRBF函数,E(L)是一个环境光的采样,L是采样方向。考虑一下常用的skybox,可以把它理解为一个环境光照方程,由代表采样方向的变量L,可以得到一个颜色值(即一个像素)。则上面公式可以理解为,系数Ci是所有环境光的采样值和Ri的乘积的累加。环境光的采样数量可以自定义,一般采取几百上千个,个人取4096个。
上图是天空盒环境光投影在两个SRBF上的示意图。
Ri即是SRBF基函数,可以采用一个中心对称的频率函数,文献里列举了Gaussian和Poisson两种,个人比较熟悉Gaussian函数,下面即是用Gaussian函数实现SRBF时的定义:
L为之前介绍的环境光照的采样方向,qi是SRBF的中心朝向(Center)。希腊字母delta(三角?)是SRBF的范围(coverage)。Exp是以自然对数e为底指数函数。
参数delta(三角?)的意义--控制单个SRBF影响区间。
所有的SRBF都有着相同的形状,不同的是朝向(Center)
如何理解SRBF--SRBF就像一个势力分布,在球面上每个点都受到某个SRBF或轻或重的影响。越靠近SRBF中心的点受影响最重(因为L和qi的夹角最小)。
2)绘制:利用SRBF系数还原光照方程
在预处理时,一般针对每个顶点(Vertex)计算环境光照,得到了n个系数,实时绘制时,即把系数取出,再次与基函数相乘,得到的是近似的环境光照函数。
相对SH,SRBF有以下优势:
理论就讨论到此为止,实际编写代码(C++)时,需要做以下工作
最后使用20个SRBF绘制得到的效果图(此Demo公开代码)
另外SRBF也可以被用作为一个很好的光滑采样的技术,所以SRBF也可以用于环境光下头发的绘制。这里是笔者实现的绘制效果。
笔者SRBF软阴影网格绘制的代码可以在以下地址下载,欢迎阅读和交流。
http://dl.vmall.com/c0axu6r8ag
原文地址:http://blog.csdn.net/zhuo_peng_zhang/article/details/38374059