简介
之前在一篇实时深度图优化的论文中看到球谐光照(Spherical Harmonics Lighting)的应用,在查阅了许许多多资料之后还是无法完全理解,我个人觉得如果之前对实时渲染技术不是很了解的话,球谐光照还是有一定难度的。大多数的资料都是从原理上描述球谐函数及其光照过程,而没有对具体的应用做解释,我直到真正动手实现了一遍球谐光照之后,才完全理解球谐光照具体的过程以及作用。
球谐光照实际上是一种对光照的简化,对于空间上的一点,受到的光照在各个方向上是不同的,也即各向异性,所以空间上一点如果要完全还原光照情况,那就需要记录周围球面上所有方向的光照。注意这里考虑的周围环境往往是复杂的情况,而不是几个简单的光源,如果是那样的话,直接用光源的光照模型求和就可以了。
如果环境光照可以用简单函数表示,那自然直接求点周围球面上的积分就可以了。但是通常光照不会那么简单,并且用函数表示光照也不方便,所以经常用的方法是使用环境光贴图,比如像这样的:
上面的图是立方体展开得到的,这种贴图也就是cubemap,需要注意的是一般的cubemap是从里往外看的。
考虑一个简单场景中有个点,他周围的各个方向上的环境光照就是上面的cubemap呈现的,假如我想知道这个点各个方向的光照情况,那么就必须在cubemap对应的各个方向进行采样。对于一个大的场景来说,每个位置点的环境光都有可能不同,如果把每个点的环境光贴图储存起来,并且每次获取光照都从相应的贴图里面采样,可想而知这样的方法是非常昂贵的。
利用球谐函数就可以很好的解决这个问题,球谐函数的主要作用就是用简单的系数表示复杂的球面函数。关于球谐函数的理论推导与解释可以参考wiki(https://en.wikipedia.org/wiki/Spherical_harmonics)。如果只是要应用和实现球谐光照,不会涉及到推导过程,不过球谐基函数却是关键的内容,球谐基函数已经有人在wiki上列好了表格,参考(https://en.wikipedia.org/wiki/Table_of_spherical_harmonics),前3阶的球谐基函数如下:
这里值得注意的是很多资料用这张图来描述球谐基函数:
我刚开始看到这张图的时候简直觉得莫名其妙,实际上这里面每个曲面都是用球坐标系表示的,球谐基都是定义在球坐标系上的函数,r(也就是离中心的距离)表示的就是这个球谐基在这个方向分量的重要程度。我是用类比傅里叶变换的方法来理解的,其实球谐函数本身就是拉普拉斯变换在球坐标系下的表示,这里的每个球谐基可以类比成傅里叶变换中频域的各个离散的频率,各个球谐基乘以对应的系数就可以还原出原来的球面函数。一个复杂的波形可以用简单的谐波和相应系数表示,同样的,一个复杂的球面上的函数也可以用简单的球谐基和相应的系数表示。
由于球谐基函数阶数是无限的,所以只能取前面几组基来近似,一般在光照中大都取3阶,也即9个球谐系数。
实验
我们先考虑简单的情况,比如说定义一个光照函数:
在球坐标系下,将该函数的值当做光照强度值,可以画出光照在球面上的分布情况:
延伸阅读
- ssh框架 2016-09-30
- 阿里移动安全 [无线安全]玩转无线电——不安全的蓝牙锁 2017-07-26
- 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 论文笔记【图片目标分割】 2017-07-26
- 词向量-LRWE模型-更好地识别反义词同义词 2017-07-26
- 从栈不平衡问题 理解 calling convention 2017-07-26
- php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明 2017-07-26
- Swift实现JSON转Model - HandyJSON使用讲解 2017-07-26
- 阿里移动安全 Android端恶意锁屏勒索应用分析 2017-07-26
- 集合结合数据结构来看看(二) 2017-07-26