使用Compute Shader计算球谐全局光照
为什么要用球谐函数来计算全局光照 在物体的渲染中,除了计算直接光照的BRDF之外,也要计算间接光照对物体的影响。在引擎中获取间接光照信息的方法通常是在场景中布置一个反射探针,离线渲染一个360度的场景贴图。这样在计算间接光照的高光部分的时候,可以使用视线在物体上的反射方向reflect(-viewDirection, normal),对渲染好的贴图进行采样,再进行brdf的计算,因此这张贴图也会被称作是specular map;然而在计算间接光照的漫反射部分时,因为目标点会受到来自各个方向上的光线带来的漫反射,不能再简单的使用视线的反射来采样这张帖图。这时有两种解决办法,一种是采样这张贴图的mipmap,在一定程度上模糊的mipmap可以认为是综合了各个方向的光照的信息,另一种则是Ravi Ramamoorthi和Pat Hanrahan2001年在An Efficient Representation for Irradiance Environment Maps中提出的,通过球谐函数重新构建低频光照信息的方式,将其作为简介光漫反射部分的贴图。 如何使用球谐函数重新构建光照信息 在Ravi Ramamoorthi的论文中他给出了球谐参数的计算公式和重构光照信息的公式: $$ \tag*{球谐参数} L_{lm} = \int_{\theta = 0}^\pi\int_{\theta = 0}^{2\pi}L(\theta)Y_{lm}(\theta, \phi)sin\theta d\theta d\phi $$ $$ \begin{align*}其中(x, y, z) &= (sin\theta cos\phi, sin\theta sin\phi, cos\theta) \cr Y_{00}(\theta, \phi) &= 0.282095 \cr (Y_{11};Y_{10};Y_{1-1})(\theta, \phi) &= 0.488603(x;z;y) \cr (Y_{21};Y_{2-1};Y_{2-2})(\theta, \phi) &= 1.092548(xz;yz;xy) \cr Y_{20}(\theta, \phi) &= 0.315392(3z^2 - 1) \cr Y_{22}(\theta, \phi) &= 0.546274(x^2 - y^2) \end{align*} $$ $$ \tag*{重构光照} \begin{equation}\begin{split} E(n) =&\ c_1L_{22}(x^2 - y^2) + c_3L_{20}z^2 + c_4L_{00} - c_5L_{20} \cr +&\ 2c_1(L_{2-2}xy + L_{21}xz + L_{2-1}yz) \cr +&\ 2c_2(L_{11}x + L_{1-1}y + L_{10}z)\end{split}\end{equation} $$ $$ 其中c1 = 0....