忙里偷闲,看了几篇关于SH Lighting的论文和source。看过Demo的同志一定会被那么好的效果吸引住的,至少是一瞬间。SoftShadow,interreflection,最BT的是,一切都是REALTIME……

[贴图回家加]

跑过Demo的同志也一定会对运行前超恐怖的precompute印象深刻,这简直是电影级别的运算嘛,那么,为什么可以把大量的计算放到precompute中,而在realtime的时候效率这么高呢?

首先不得不提的是,关于信号处理的一些知识,只是很肤浅的。在信号处理的过程中,我们常常用一系列的基函数对原信号作处理,所有信号对应一个函数算出一个系数值,n个函数最后得到n个值,这n个值(n远远小于信号数目)可以粗略地把原信号还原回去,n越大,还原得越精确。

真实的光照需要把一个顶点所有方向的光都考虑在内,这里边就包括了self shadow,interreflection等等的所有情况,不过对于realtime这显然不可能,但我们可以用之前说的信号处理,把所有方向的情况变换成仅仅n个系数,这n个系数粗略地表达了所有方向的信息,可以用来做realtime,那个时候每个顶点只需要做少量的乘法和加法。

计算那n个系数是件麻烦事,对于每个顶点,要计算所有方向的情况。那么什么是所有方向?我们可以随机找m个采样点,假设10000个点,这10000个点随机分布在单位球面上,所以他们就可以代表所有方向。对于每个方向,我们计算顶点在这个方向的情况,首先用这个方向的射线与整个mesh求交,如果被挡住,这个方向的光源就照不到这个顶点了,但是相交的平面可以和它做interreflection(稍后讨论),所以这一轮对所有系数,这个方向没有贡献。第一个pass结束后,我们再计算interreflection,要多少pass可以自己定,每轮的衰减可以根据顶点属性,每个pass都是对前一pass做衰减。对于每个方向,找到最近相交的三角形,插值得到焦点前一pass的系数,做衰减,然后加到这一轮的系数中,这就是interreflection。

光源:光源也是n个系数,realtime的时候与顶点的系数对应相乘再相加,光源的系数可以做各种变换,之后变换到object space,打算用diffuse cube map试试,可惜下载的source还没编译成功,万恶的c++ template……

PRT应该跟这个大同小异,它们的致命弱点是。。。所有物体跟环境mesh连在一起,不能移动,DAO的Demo看得大家流口水阿,有空看看,不知道是哪年了……