目录

  • Image-Based Lighting (IBL)
  • Shadow from Environment Lighting
    • Frequency and filtering
    • Basis Functions
    • Spherical Harmonics(球谐函数)
    • 球谐函数在环境光中的应用
    • Precomputed Radiance Transfer (PRT)
    • BRDF Diffuse Case
    • BRDF Glossy Case
    • 总结
  • 小结

Image-Based Lighting (IBL)

  • IBL不考虑visibility项,因此其求解的渲染方程如下:
    Lo(p,ω0)=∫Ω+Li(p,ωi)fr(p,ωi,ωo)cosθidωi(1)\tag{1}L_o(p, \omega_0) = \int_{\varOmega^+}L_i(p, \omega_i)f_r(p, \omega_i, \omega_o)cos\theta_i d\omega_i Lo​(p,ω0​)=∫Ω+​Li​(p,ωi​)fr​(p,ωi​,ωo​)cosθi​dωi​(1)
  • 使用蒙特卡罗方法求解渲染方程需要大量的样本(采样),因此计算会非常耗时。(在编写的shader中涉及到采样一般不能应用到实时渲染中,但由于时间空间滤波方法、样本复用技术的出现,可以使采样应用到实时渲染中)
  • 求解IBL的渲染方程时,使用《Shadow Mapping》章节公式(1)进行近似, 将光照从积分中提出(原理略)
    Lo(p,ω0)≈∫ΩfrLi(p,ωi)dωi∫Ωfrdωi⋅∫Ω+fr(p,ωi,ωo)cosθidωi(2)\tag{2}L_o(p, \omega_0) \approx \cfrac{\int_{\varOmega_{f_r}} L_i(p, \omega_i)d\omega_i}{\int_{\varOmega_{f_r}}d\omega_i} \cdot \int_{\varOmega^+} f_r(p, \omega_i, \omega_o)cos\theta_i d\omega_i Lo​(p,ω0​)≈∫Ωfr​​​dωi​∫Ωfr​​​Li​(p,ωi​)dωi​​⋅∫Ω+​fr​(p,ωi​,ωo​)cosθi​dωi​(2)

    • ∫ΩfrLi(p,ωi)dωi∫Ωfrdωi(3)\tag{3} \cfrac{\int_{\varOmega_{f_r}} L_i(p, \omega_i)d\omega_i}{\int_{\varOmega_{f_r}}d\omega_i}∫Ωfr​​​dωi​∫Ωfr​​​Li​(p,ωi​)dωi​​(3)
    • 公式(3)可以表示为:在整个球上,BRDF Lobe所覆盖区域中的光线积分起来再归一化。其实就是将IBL表示的图像进行模糊(后面称天空盒)。(即滤波环境光, 滤波核大小取决于BRDF Lobe的大小)
      • lobe:理解为分布(反射波瓣)
      • 实际应用中,先将使用HDR图获得的Cube Map进行模糊处理(即mipmap)(这一步可以预计算完成)。使用时,根据BRDF Lobe的大小,在mipmap查询(或插值计算)
      • 只需要使用入射光线的镜面反射方向在Cube Map的mipmap中取一次值即可(得到原本光线周围一片光线的值)
      • 通过上述步骤的近似,公式(3)就没有采样了
    • ∫Ω+fr(p,ωi,ωo)cosθidωi(4)\tag{4} \int_{\varOmega^+} f_r(p, \omega_i, \omega_o)cos\theta_i d\omega_i∫Ω+​fr​(p,ωi​,ωo​)cosθi​dωi​(4)
      • 公式(4)的计算思路依然是尽可能的将计算维度降下来。(即,将积分中的变量或常量提出(降维))
      • 公式(4)的预计算
        • BRDF公式如下:
          f(i,o)=F(i,h)G(i,o,h)D(h)4(n,i)(n,o)(5)\tag5 f(i,o) = \frac{F(i,h)G(i,o,h)D(h)}{4(n,i)(n,o)} f(i,o)=4(n,i)(n,o)F(i,h)G(i,o,h)D(h)​(5)
        • 其中菲尼尔项使用Schlick近似
          R(θ)=R0+(1−R0)(1−cosθ)5(6)\tag6 R(\theta) = R_0+(1-R_0)(1-cos\theta)^5 R(θ)=R0​+(1−R0​)(1−cosθ)5(6)
        • 法线分布函数使用Beckmann分布
          D(m)=χ+cosθπαb2(cosθ)4exp⁡((cosθ)2−1αb2(cosθ)2)(7)\tag7 D(m) = \frac{\chi^+cos\theta}{\pi\alpha_b^2(cos\theta)^4}\exp(\frac{(cos\theta)^2-1}{\alpha_b^2(cos\theta)^2}) D(m)=παb2​(cosθ)4χ+cosθ​exp(αb2​(cosθ)2(cosθ)2−1​)(7)
        • 从BRDF公式中可以看出,如果想要求出当前着色点的BRDF,未知数有夹角θ\thetaθ、基础反射率R0R_0R0​、用户输入的Roughness αb\alpha_bαb​。这是一个三维的函数。
        • 降维过程如下:
          ∫Ω+fr(p,ωi,ωo)cosθidωi\int_{\varOmega^+} f_r(p, \omega_i, \omega_o)cos\theta_i d\omega_i ∫Ω+​fr​(p,ωi​,ωo​)cosθi​dωi​
          将菲尼尔项显式写出
          ∫Ω+frR(θ)(R0+(1−R0)(1−cosθ)5)cosθidωi\int_{\varOmega^+} \frac{f_r}{R(\theta)}(R_0+(1-R_0)(1-cos\theta)^5) cos\theta_i d\omega_i ∫Ω+​R(θ)fr​​(R0​+(1−R0​)(1−cosθ)5)cosθi​dωi​
          frR(θ)\frac{f_r}{R(\theta)}R(θ)fr​​为公式(5)去掉菲尼尔项
          ∫Ω+frR(θ)(R0+(1−cosθ)5−R0(1−cosθ)5)cosθidωi\int_{\varOmega^+} \frac{f_r}{R(\theta)}(R_0+(1-cos\theta)^5-R_0(1-cos\theta)^5) cos\theta_i d\omega_i ∫Ω+​R(θ)fr​​(R0​+(1−cosθ)5−R0​(1−cosθ)5)cosθi​dωi​
          整理
          ∫Ω+frR(θ)(R0(1−(1−cosθ)5)+(1−cosθ)5)cosθidωi\int_{\varOmega^+} \frac{f_r}{R(\theta)}(R_0(1-(1-cos\theta)^5)+(1-cos\theta)^5) cos\theta_i d\omega_i ∫Ω+​R(θ)fr​​(R0​(1−(1−cosθ)5)+(1−cosθ)5)cosθi​dωi​
          拆分
          ∫Ω+frR(θ)R0(1−(1−cosθ)5)cosθidωi+∫Ω+frR(θ)(1−cosθ)5cosθidωi\int_{\varOmega^+} \frac{f_r}{R(\theta)}R_0(1-(1-cos\theta)^5) cos\theta_i d\omega_i +\int_{\varOmega^+} \frac{f_r}{R(\theta)}(1-cos\theta)^5 cos\theta_i d\omega_i ∫Ω+​R(θ)fr​​R0​(1−(1−cosθ)5)cosθi​dωi​+∫Ω+​R(θ)fr​​(1−cosθ)5cosθi​dωi​
          将基础反射率R0R_0R0​提出
          R0∫Ω+frR(θ)(1−(1−cosθ)5)cosθidωi+∫Ω+frR(θ)(1−cosθ)5cosθidωiR_0 \int_{\varOmega^+} \frac{f_r}{R(\theta)}(1-(1-cos\theta)^5) cos\theta_i d\omega_i +\int_{\varOmega^+} \frac{f_r}{R(\theta)}(1-cos\theta)^5 cos\theta_i d\omega_i R0​∫Ω+​R(θ)fr​​(1−(1−cosθ)5)cosθi​dωi​+∫Ω+​R(θ)fr​​(1−cosθ)5cosθi​dωi​
          因此最后的近似公式为:
          ∫Ω+fr(p,ωi,ωo)cosθidωi≈R0∫Ω+frR(θ)(1−(1−cosθ)5)cosθidωi+∫Ω+frR(θ)(1−cosθ)5cosθidωi(8)\tag{8} \int_{\varOmega^+} f_r(p, \omega_i, \omega_o)cos\theta_i d\omega_i \ \approx R_0 \int_{\varOmega^+} \frac{f_r}{R(\theta)}(1-(1-cos\theta)^5) cos\theta_i d\omega_i +\int_{\varOmega^+} \frac{f_r}{R(\theta)}(1-cos\theta)^5 cos\theta_i d\omega_i ∫Ω+​fr​(p,ωi​,ωo​)cosθi​dωi​ ≈R0​∫Ω+​R(θ)fr​​(1−(1−cosθ)5)cosθi​dωi​+∫Ω+​R(θ)fr​​(1−cosθ)5cosθi​dωi​(8)
      • 公式(8) 将公式(4) 积分内部分近似降维到只与夹角θ\thetaθ和用户输入的Roughness有关。因为 Roughness是线性值,而夹角的范围也是有限值(0-360)。因此可以通过预计算。求出当前天空盒Roughness与夹角 θ\thetaθ 映射的表格(映射值为公式(8)中积分的结果),即纹理贴图。最后求解渲染方程时查询该纹理求解即可。
      • 上述求解渲染方程的方式为 split sum 方法

Shadow from Environment Lighting

  • 环境光可以理解为从四面八方入射过来的光照。由于每个方向的光照都不同,因此环境光求阴影理论上是做不到的。但可以将环境光描述为many-light问题。也可描述为采样问题。来近似计算阴影。

    • many-light

      • 以many-light问题计算阴影,需要为每一个光源计算shadow map。这样很不现实。因此现有的解决方案是,在这些光源中取少数具有代表性的光源(keylight),如太阳。再计算阴影。
    • 采样
      • 由于不确定当前着色点的visibility项,即当前着色点的遮挡情况,因此很难精准计算阴影。
  • 环境光阴影相关论文
    • Imperfect shadow maps
    • Light cuts
      • 离线,光源做归类
    • RTRT (real-time ray tracing)
      • 可能为最优解决方案
    • Precomputed radiance transfer
      • 很准确

Frequency and filtering

  • 该部分的理论(略)
  • 傅里叶级数展开
    • 将函数表示为正弦和余弦的加权和
  • 滤波:去掉频率一些内容
    • 低通滤波器
  • 卷积理论
    • 频域和实域对应关系

      • 实域中做卷积等于频域上做乘积
  • 两个函数乘积再积分可以理解为卷积操作,即滤波操作
    • 积分里面的两个函数可以认为是频域函数
    • 一个函数为低频,乘积得到的函数也是低频
    • 两个频率函数相乘在积分就是卷积 即滤波操作
    • 低频函数定义
      • smooth function
      • slow changes

Basis Functions

  • 本人研究方向之一是拉普拉斯矩阵应用,因此忽略重构相关概念
  • 定义
    • 一个函数可以描述为很多其他函数线性组合
      f(x)=∑ici⋅Bi(x)(9)\tag{9} f(x) = \sum_i c_i \cdot B_i(x) f(x)=i∑​ci​⋅Bi​(x)(9)
    • Bi(x)B_i(x)Bi​(x)即为一个基函数

Spherical Harmonics(球谐函数)

  • 定义:

    • 在球面上的一系列二维基函数
    • 理解为一维上的傅里叶级数
  • 性质:
    • 第nnn阶有2n+12n+12n+1个基函数

      • 编号从−n...n-n ...n−n...n
    • 前nnn阶有n2n^2n2个基函数
  • SH的基函数的定义
    • 每一个基函数都使用勒让德(Legendre)多项式去定义
  • SH系数定义
    ci=∫Ωf(ω)Bi(ω)dω(10)\tag{10} c_i= \int_{\Omega} f(\omega)B_i(\omega)d\omega ci​=∫Ω​f(ω)Bi​(ω)dω(10)

    • 给定二维球面的函数,将其展开成使用SH的线性组合来描述。对于任何一个SH函数,其前面的系数是两个函数相乘再积分(就是谱系数的求解过程)
  • 给定任意一个函数,用基函数描述时,求基函数系数的过程叫投影
  • 任何一个函数都可以求出其再任何一个基函数上的投影
  • 根据基函数重构,使用前4阶(与拉普拉斯特征重构相同)

球谐函数在环境光中的应用

  • 在环境光照下,SH可以应用在diffuse物体着色, (这里使用天空盒描述环境光数据结构)

    • split sum 方法解释:

      • 如果有一个环境光照,入射(是反射到屏幕的光线,用入射便于理解)到当前着色点的光线沿着镜面反射方向,在天空盒查询某个值,其实渲染后,着色物体感觉像似一个镜子(查询一次,获得从天空盒采样的数值)。
      • 如果把环境光做预处理,进行滤波(prefilter),即对天空盒进行模糊,再从着色点沿着镜面反射方向,在模糊的天空盒,查询某个值。(其实是查询一个区域的值做平均)使用这种方式进行着色结果更像diffuse。即,一个prefilter过的天空盒,加上一次查询。就好像不做filter,入射到当前着色点的光线沿着任何一个方向,查询天空盒上的值做平均。因此做滤波与不做滤波进行查询计算光照时,这两个操作近似等价。而split sum 方法规避了采样的过程。
    • SH 方法
      • 结论:对于任何的光照条件,只要材质是diffuse的,都可以使用前三阶的SH描述光照

        • 由于BRDF是低频的(diffuse材质),光照与BRDF的点乘,也是低频的,因此光照也不需要超过三阶的SH描述。

          • 两个函数做点乘时,结果的频率由最低频率函数决定
        • diffuse BRDF使用SH进行简化
          • 由于diffuse BRDF是平滑的(smooth)。在渲染方程中(环境光照渲染方程(公式1)),计算光照时使用光照乘以BRDF(cos项再解释中忽略)。即,环境光,是一个定义在球面上的函数。BRDF定义在半球上的光滑函数,他们逐点相乘再积分,即点乘操作。
          • 光照可以是高频或低频
          • BRDF是diffuse的,其可以看做是一个低通滤波器。
            • 因此可以用少量的SH描述BRDF项(三阶即可描述)
        • 根据上述内容可得:环境光可以使用球谐函数进行计算,并且使用三阶即可近似描述光照。

Precomputed Radiance Transfer (PRT)

  • 利用球谐函数计算环境光照
    Lo(p,ω0)=∫Ω+Li(p,ωi)V(p,ωi)fr(p,ωi,ωo)max(0,n⋅ωi)dωi(11)\tag{11} L_o(p, \omega_0) = \int_{\varOmega^+}L_i(p, \omega_i)V(p,\omega_i)f_r(p, \omega_i, \omega_o)max(0, n\cdot \omega_i) d\omega_i Lo​(p,ω0​)=∫Ω+​Li​(p,ωi​)V(p,ωi​)fr​(p,ωi​,ωo​)max(0,n⋅ωi​)dωi​(11)
    其中,

    • Li(p,ωi)L_i(p, \omega_i)Li​(p,ωi​)为入射光线
    • V(p,ωi)V(p,\omega_i)V(p,ωi​)为遮挡项
    • fr(p,ωi,ωo)max(0,n⋅ωi)合并称为f_r(p, \omega_i, \omega_o)max(0, n\cdot \omega_i)合并称为fr​(p,ωi​,ωo​)max(0,n⋅ωi​)合并称为BRDF项
  • 从公式(11)可以看出,只要将入射光线、遮挡项与BRDF项相乘再积分,即可求出当前着色点对应的光照值。
  • 公式(11)中的三项都可以进行预计算
    • Li(p,ωi)L_i(p, \omega_i)Li​(p,ωi​)

      • 给定出射光线(屏幕接受的光线,也称观察方向),入射光线为当前着色点所有方向上的光线。即可以使用球面函数描述(该着色为中心的天空盒,即天空盒,因为天空盒是无限远的,在任意位置着色点的光照近似相等)
    • V(p,ωi)V(p,\omega_i)V(p,ωi​)
      • 为当前着色点在所有方向上的遮挡情况(遮挡0,不遮挡1),也可用球面函数描述。一般下半球都是遮挡的。毕竟光照只考虑上半球。
    • fr(p,ωi,ωo)max(0,n⋅ωi)f_r(p, \omega_i, \omega_o)max(0, n\cdot \omega_i)fr​(p,ωi​,ωo​)max(0,n⋅ωi​)
      • 当前着色点在各个出射方向上的BRDF也可以使用球面函数描述
  • 公式(11)中的三项可以预计算生成天空盒,计算最终的光照只需将三项的天空盒对应的像素相乘,再积分。
  • 使用预计算生产天空盒计算光照非常耗时。
    • 因为如果计算当前着色点的光照情况,需要计算当前着色点预计算三个天空盒每一个像素相乘的结果再积分。如天空盒分辨率为64∗6464*6464∗64,则一共需要计算 6∗64∗64∗36*64*64*36∗64∗64∗3次。
  • 论文《Precomputed Radiance Transfer for Real-Time Rendering in Dynamic, Low-Frequency Lighting Environments 》
  • 为了降低着色计算成本,引入PRT
  • PRT思想
    • 首先规定,除光照以外,其他物体不会发生变化。即场景物体不能发生变化。因此,BRDF和visibility都不会变。
    • 将公式(11)看作两个部分
      • lighting项: Li(p,ωi)L_i(p, \omega_i)Li​(p,ωi​)
      • light transport项: V(p,ωi)fr(p,ωi,ωo)max(0,n⋅ωi)V(p,\omega_i)f_r(p, \omega_i, \omega_o)max(0, n\cdot \omega_i)V(p,ωi​)fr​(p,ωi​,ωo​)max(0,n⋅ωi​)
        • light transport 对于任意着色点值是固定值

          • 因此在渲染前可以先计算好,也是球面函数。因此也可以用基函数表示。

BRDF Diffuse Case

  • 由于diffuse材质的BRDF是常量,因此公式(11)的 fr(p,ωi,ωof_r(p, \omega_i, \omega_ofr​(p,ωi​,ωo​可以从积分中提出。
    Lo(p,ω0)=fr(p,ωi,ωo)∫Ω+Li(p,ωi)V(p,ωi)max(0,n⋅ωi)dωi(12)\tag{12} L_o(p, \omega_0) = f_r(p, \omega_i, \omega_o) \int_{\varOmega^+}L_i(p, \omega_i)V(p,\omega_i)max(0, n\cdot \omega_i) d\omega_i Lo​(p,ω0​)=fr​(p,ωi​,ωo​)∫Ω+​Li​(p,ωi​)V(p,ωi​)max(0,n⋅ωi​)dωi​(12)

    • 光照也可用基函数表示
      L(p,ωi)≈∑lnBn(ωi)(13)\tag{13} L(p, \omega_i) \approx \sum l_{n}B_n(\omega_i) L(p,ωi​)≈∑ln​Bn​(ωi​)(13)
      其中:

      • nnn为第nnn个基函数
      • lnl_{n}ln​ 为光照系数
      • Bn(ωi)B_n(\omega_i)Bn​(ωi​)为基函数
    • 将公式(13)代入公式(12)
      Lo(p,ω0)≈fr(p,ωi,ωo)∫Ω+∑lnBn(ωi)V(p,ωi)max(0,n⋅ωi)dωi(14)\tag{14} L_o(p, \omega_0) \approx f_r(p, \omega_i, \omega_o) \int_{\varOmega^+} \sum l_{n}B_n(\omega_i)V(p,\omega_i)max(0, n\cdot \omega_i) d\omega_i Lo​(p,ω0​)≈fr​(p,ωi​,ωo​)∫Ω+​∑ln​Bn​(ωi​)V(p,ωi​)max(0,n⋅ωi​)dωi​(14)
    • 积分符号和求和符号在BRDF下,满足可交换符号的性质。
      Lo(p,ω0)≈fr(p,ωi,ωo)∑ln∫Ω+Bn(ωi)V(p,ωi)max(0,n⋅ωi)dωi(15)\tag{15} L_o(p, \omega_0) \approx f_r(p, \omega_i, \omega_o) \sum l_{n} \int_{\varOmega^+} B_n(\omega_i)V(p,\omega_i)max(0, n\cdot \omega_i) d\omega_i Lo​(p,ω0​)≈fr​(p,ωi​,ωo​)∑ln​∫Ω+​Bn​(ωi​)V(p,ωi​)max(0,n⋅ωi​)dωi​(15)
    • 公式(15)积分中的内容可以看作两部分
      • Bn(ωi)B_n(\omega_i)Bn​(ωi​)为基函数
      • V(p,ωi)max(0,n⋅ωi)V(p,\omega_i)max(0, n\cdot \omega_i)V(p,ωi​)max(0,n⋅ωi​)为球面函数,
      • 因此式(15)积分中的内容可以用公式(10)表示为一组系数
      • 由于任何一个light transport 都可以投影到任何一个基函数上,因此可以预计算
    • 因此最终着色值只需要计算点乘即可
    • 求diffuse材质的光照值公式为:
      Lo(p,ω0)≈fr(p,ωi,ωo)∑lnTn(16)\tag{16} L_o(p, \omega_0) \approx f_r(p, \omega_i, \omega_o) \sum l_{n} T_{n} Lo​(p,ω0​)≈fr​(p,ωi​,ωo​)∑ln​Tn​(16)
      其中

      • TnT_{n}Tn​为公式(15)积分部分的预计算结果。(对应拉普拉斯矩阵的谱系数)
    • 代价
      • 场景不能动,不能移动移除物体。
      • 天空盒旋转,即光照旋转可以处理
        • 旋转任何一个基函数,都可以用同阶的基函数线性组合来描述
    • 基函数性质
      • 正交性:投影自己为1,其他都是0
      • 任何函数都可以与基函数进行投影,并且可用基函数重构原函数(与调和基性质一样)
      • 支持选转
        • 旋转任何一个基函数,都可以用同阶的基函数线性组合来描述
      • 卷积与频谱性质,低频可描述原函数特征。
  • diffuse 材质的环境光照还可以用另一种方式进行推导
    • 依旧将公式(11)看作两个部分。lighting项和light transport项
    • 将lighting项用基函数近似
      L(p,ωi)≈∑ncnBn(ωi)(17)\tag{17} L(p, \omega_i) \approx \sum_n c_{n}B_n(\omega_i) L(p,ωi​)≈n∑​cn​Bn​(ωi​)(17)
      其中

      • cnc_ncn​ 为lighting项系数、Bn(ωi)B_n(\omega_i)Bn​(ωi​)为基函数
    • 将light transport项用基函数近似
      T(p,ωi)≈∑mcmBm(ωi)(18)\tag{18} T(p, \omega_i) \approx \sum_m c_{m}B_m(\omega_i) T(p,ωi​)≈m∑​cm​Bm​(ωi​)(18)
      其中

      • cmc_mcm​ 为lighting项系数、Bm(ωi)B_m(\omega_i)Bm​(ωi​)为基函数
    • 将公式(17)和公式(18)代入到公式(11)中
      Lo(p,ω0)=fr(p,ωi,ωo)∫Ω+∑ncnBn(ωi)∑mcmBm(ωi)dωi(19)\tag{19} L_o(p, \omega_0) = f_r(p, \omega_i, \omega_o) \int_{\varOmega^+} \sum_n c_{n}B_n(\omega_i)\sum_m c_{m}B_m(\omega_i)d\omega_i Lo​(p,ω0​)=fr​(p,ωi​,ωo​)∫Ω+​n∑​cn​Bn​(ωi​)m∑​cm​Bm​(ωi​)dωi​(19)
    • 交换积分和求和符号
      Lo(p,ω0)=fr(p,ωi,ωo)∑n∑m∫Ω+cnBn(ωi)cmBm(ωi)dωi(20)\tag{20} L_o(p, \omega_0) = f_r(p, \omega_i, \omega_o) \sum_n \sum_m \int_{\varOmega^+} c_{n}B_n(\omega_i)c_{m}B_m(\omega_i)d\omega_i Lo​(p,ω0​)=fr​(p,ωi​,ωo​)n∑​m∑​∫Ω+​cn​Bn​(ωi​)cm​Bm​(ωi​)dωi​(20)
    • 系数为常量可以从积分中提出
      Lo(p,ω0)=fr(p,ωi,ωo)∑n∑mcncm∫Ω+Bn(ωi)Bm(ωi)dωi(21)\tag{21} L_o(p, \omega_0) = f_r(p, \omega_i, \omega_o) \sum_n \sum_m c_{n}c_{m} \int_{\varOmega^+} B_n(\omega_i)B_m(\omega_i)d\omega_i Lo​(p,ω0​)=fr​(p,ωi​,ωo​)n∑​m∑​cn​cm​∫Ω+​Bn​(ωi​)Bm​(ωi​)dωi​(21)
  • 公式(21)可以看出,其为双重求和问题,是系数cnc_ncn​、系数cmc_mcm​和一个积分相乘再求和
  • 利用公式(16)计算光照的时间复杂度为O(n)O(n)O(n), 然而公式(21)的时间复杂度为O(n2)O(n^2)O(n2)。
    • 但是由于SH的正交性,公式(21)中的积分,只有在Bn(ωi)=Bm(ωi)B_n(\omega_i)=B_m(\omega_i)Bn​(ωi​)=Bm​(ωi​)是才有值,其他都为0. (可以理解为矩阵中只有对角线有值)。
    • 因此公式(21)实际上的时间复杂的也是O(n)O(n)O(n)

BRDF Glossy Case

  • Glossy BRDF与Diffuse BRDF的区别

    • Diffuse BRDF 是常数,即着色点在任何出射方向的BRDF都一样,与视角无关
    • Glossy BRDF,着色点在每个出射方向上有不同的BRDF,与视角相关
  • BRDF Diffuse Case中我们可以将BRDF提出(因为是常量),而BRDF Glossy Case不能这样做。但是求解过程大致相同。
  • BRDF Glossy Case 环境光照计算推导
    • 依旧将公式(11)分为lighting项 和 light transport项
    • lighting项
      Li(p,ωi)(22)\tag{22} L_i(p, \omega_i) Li​(p,ωi​)(22)
    • light transport项
      V(p,ωi)fr(p,ωi,ωo)max(0,n⋅ωi)(23)\tag{23} V(p,\omega_i)f_r(p, \omega_i, \omega_o)max(0, n\cdot \omega_i) V(p,ωi​)fr​(p,ωi​,ωo​)max(0,n⋅ωi​)(23)
    • lighting项用公式(17)近似
    • light transport项由于包含BRDF项,因此近似相对复杂。
      • BRDF Diffuse Case 的light transport项是一个二维函数,只跟入射光线相关。而BRDF Glossy Case的light transport项是一个四维函数,跟入射光线和出射光线相关。

        • 二维理解:入射光线与light transport项结果形成的矩阵
        • 四维理解:入射光线在每个出射光线上light transport项结果形成的体
      • 解决方式:

        • 先使用SH将light transport近似成关于ωo\omega_oωo​的函数,即首先带入入射光线ωi\omega_iωi​求出该方向上所有出射方向的BRDF值(是一个向量)
          Ti(p,ωo)≈∑mcmBm(ωo)(24)\tag{24} T_i(p, \omega_o) \approx \sum_m c_{m}B_m(\omega_o) Ti​(p,ωo​)≈m∑​cm​Bm​(ωo​)(24)
        • 再将公式(24)使用SH近似成 light transport项,

        T(p,ωi,ωo)≈∑ncmnBn(ωi)(25)\tag{25} T(p, \omega_i,\omega_o) \approx \sum_n c_{mn}B_n(\omega_i) T(p,ωi​,ωo​)≈n∑​cmn​Bn​(ωi​)(25)

        • 解释:使用公式(24)求入射光线ωi\omega_iωi​的所有出射光线上的light transport是一个向量,看作一个函数。再用基函数近似,求出一个系数。而对于每个入射光线ωi\omega_iωi​的每个出射方向ωo\omega_oωo​都会有一个系数。因此会形成一个系数矩阵,即公式(25)的cmnc_{mn}cmn​
        • 每次计算时只使用cmnc_{mn}cmn​中第nnn列的系数向量做计算,即求ωo\omega_oωo​方向上的BRDF
    • 因此 BRDF Glossy Case 环境光照公式为
      Lo(p,ωi,ω0)≈∫Ω+∑kckBk(ωi)∑ncmnBn(ωi)(26)\tag{26} L_o(p, \omega_i, \omega_0) \approx \int_{\varOmega^+}\sum_k c_{k}B_k(\omega_i) \sum_n c_{mn}B_n(\omega_i) Lo​(p,ωi​,ω0​)≈∫Ω+​k∑​ck​Bk​(ωi​)n∑​cmn​Bn​(ωi​)(26)
      交换积分和求和符号
      Lo(p,ωi,ω0)≈∑k∑nckcmn∫Ω+Bk(ωi)Bn(ωi)(27)\tag{27} L_o(p,\omega_i, \omega_0) \approx \sum_k\sum_n c_{k}c_{mn}\int_{\varOmega^+}B_k(\omega_i) B_n(\omega_i) Lo​(p,ωi​,ω0​)≈k∑​n∑​ck​cmn​∫Ω+​Bk​(ωi​)Bn​(ωi​)(27)
      其中

      • ∑kckBk(ωi)\sum_k c_{k}B_k(\omega_i)∑k​ck​Bk​(ωi​)为光源项
  • 代价
    • 任何一个着色点都要存系数矩阵(cmnc_{mn}cmn​)

      • 例如用5阶SH,要存25*25的系数矩阵
    • 渲染时需要向量与矩阵相乘。计算开销大(diffuse 为点乘计算)

总结

  • SH 基函数通常使用 3、4、5阶。即9、16、25个基函数

    • glossy 需要更多,计算慢,现在的GPU能达到100帧
  • 接近镜面反射,SH无法实现
  • inter reflection
    • PRT可以表示多次bounce的BRDF
  • 只适合描述低频
  • Follow up works
    • 使用其他基函数尽量描述中高频信息
    • 预计算更多项
    • 动态场景
    • 动态材质
    • 在半透明合毛发上的应用
    • 使用解析解(我感情兴趣的点)
  • More basis functions
    • Wavelet
    • Zonal Harmonics
    • Spherical Gaussian (SG)
    • Piecewise Constant
  • Wavelet
    • 二维小波,2D Haar Wavelet

      • 定义在一个图形块上
      • 不同小波定义域不同
      • 定义任意函数,同样可以投影到各种不同小波的基函数上
        • 与SH不同

          • SH之所以可以紧凑(压缩)的描述一些函数,因为可以截断选择前nnn阶的SH,就可以恢复出若干频率的原函数
          • 小波则是:给定任意二维函数,都必须投影到小波的所有基函数上,但是原函数大多数投影到基函数的系数(值)接近0。因此,取对应系数前 nnn 大的系数,重构原函数。即 a non-linear approximation (非线性近似)
      • 支持全频率的表示,既可以表示低频,也可以表示高频
      • 因为小波定义在图形块上。因此,可以使用CubeMap表示
    • 代价
      • 不支持快速旋转
      • 旋转光照需重新计算系数

小结

   本节主要讲,如何使用基函数计算IBL。几乎都是跟频率相关。基函数的具体定义(略)。毕竟相近研究方向出身。

渲染算法学习(四)-- Environment Lighting相关推荐

  1. 算法学习四:算法性能分析理论基础——函数增长与渐进分析

    算法学习四:算法性能分析理论基础--函数增长与渐进分析 在算法性能分析过程中,特别是在算法运行效率分析中,我们经常使用渐渐分析法,它使我们在分析算法性能时不必纠结于不同硬件平台的差异性,着重考虑算法的 ...

  2. 渲染算法学习(六)-- Real-Time Physically-Based Materials

    目录 PBR and PBR Materials Physically-Based Rendering (PBR) PBR materials in RTR PBR materials Microfa ...

  3. 渲染算法学习(一)-- Shadow Mapping

    目录 Introduction Shadow Mapping 2-Pass Algorithm Shadow Mapping Approximation In Shadow Mapping Perce ...

  4. 渲染算法学习(七)-- Real-Time Ray Tracing

    目录 Real-Time Ray Tracing(RTRT) Implementation of Filtering Bilateral Filtering Joint Bilateral Filte ...

  5. C++ 算法学习四(直线、抛物线拟合)

    好久没写博客了,忘了怎么开场,哈哈,小编在从事车道线检测,以及机器学习算法线性回归时都用到了线性拟合与多项式拟合,其实可以直接通过opencv的API接口也可实现,具体可见 polynomial_cu ...

  6. 渲染算法学习(三)-- Materials

    目录 Materials Diffuse / Lambertian Material (漫反射BRDF) Ideal Reflective / Refractive Material (反射/折射BS ...

  7. 1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》

    文章目录 0.前言 1.功能 2.示例 有两个名单tinyW.txt和tinyT.txt,将tinyT.txt名单中不在tinyW.txt的数据打印出来 ① 实现原理 ② 实现代码 ③ 性能分析 0. ...

  8. 国科大学习资料--人工智能原理与算法-第四次作业解析(学长整理)

    国科大学习资料–人工智能原理与算法-第四次作业解析(张文生老师主讲)(4.4.4.12) 4.4 生成大量的八数码问题和八皇后问题并用以下算法分别求解(如果可能的话):爬山法(最陡上升和首选爬山法), ...

  9. 【算法学习】四 二分法查找(折半法或者折半查找)

    前言 社长,一个爱学习,爱分享的程序猿,始终相信,付出总会有回报的.知识改变命运,学习成就未来.爱拼才会赢! 程序猿学社的GitHub,已整理成相关技术专刊,欢迎Star:. https://gith ...

最新文章

  1. 云服务器dns配置文件,linux服务器dns配置文件
  2. ABAP-AVL-OO方法中的ALV的如何自己添加按钮及其响应
  3. Swift iOS : WebView缓存图片的方法
  4. R7-1 正整数A+B (15 分)
  5. PLSQL连接Oracle报错 ORA-12154 标识符
  6. 关于Linux MongoDB的安装
  7. C++ 字符串复制函数substr
  8. 对蚊子个人博客进行了彻底的改造
  9. PAT (Basic Level) Practice1016 部分A+B
  10. Java开发中,接口参数校验
  11. Rust : AES算法加密、解密
  12. 社会工程学之ip获取和定位
  13. 【雷达】一维和二维自适应波束形成(DBF))DBF附matlab代码
  14. 【通信仿真】基于matlab STAP全自由度空时自适应处理【含Matlab源码 1956期】
  15. Android平台WIFI启动流程之二
  16. shell检测连接数最多的IP
  17. Android 一定要培训吗,安卓开发需要学什么2
  18. 自动识别Windows Office 产品GVLK
  19. Pdp11 simh 虚拟机 运行 unix V6
  20. Java 适配器模式详解

热门文章

  1. 破解人脸识别被判七年!打击黑产,鼓励人脸识别技术健康发展
  2. 2022全年度平板电视十大热门品牌销量榜单
  3. Linux中常用的文件目录,Linux学习笔记2——Linux中常用文件目录操作命令
  4. 星巴克季节限定星怡杯樱花味拿铁升级回归
  5. ,到底是买新房好还是二手房好?看完你就明白了!
  6. 自动客服功能的微信小程序
  7. 国产linux操作系统深度系统20.3发布(推荐)
  8. 一种简单的将图一-1变成图1-1的方式
  9. android 仿微信聊天气泡显示图片,仿微信聊天气泡 图片尖角 按下变暗
  10. C语言之算法的概念和特点