Advanced Light Transport
🔍

Advanced Light Transport

Tags
GAMES101
Published
May 11, 2022
Author

Biased vs. Unbiased Monte Carlo Estimators

💡
积分的近似可能是有偏的,也可能是无偏的。反映到渲染上,会在光子映射的部分涉及到。
  • An unbiased Monte Carlo technique does not have any systematic error
    • The expected value of an unbiased estimator will always be the correct value, no matter how many samples are used
    • 路径追踪用蒙特卡洛解积分,解不同的积分可以用不同数量的样本,但不管用多少样本,最后的期望、估计值都是定积分的值,一个无偏的估计。
  • Otherwise, biased
    • 如果估计出来的值、期望和最后要的值不一样,就是有偏的。
    • One special case, the expected value converges to the correct value as infinite #samples are used — consistent
      • 特殊情况:虽然取多少样本最后得到的结果都是有偏的,但极限的定义下,如果样本足够多,那么得出来的期望值会收敛到正确值。还是有偏的,但可以成为 consistent 一致的。
  • We’ll look again at this page after introducing Photon Mapping

Bidirectional Path Tracing (BDPT) 双向路径追踪

之前的路径追踪,是根据光路可逆性,从相机开始路径追踪,产生路径连接相机和光源。
  • Recall: a path connects the camera and the light
  • BDPT 是单向路径追踪的拓展
    • Traces sub-paths from both the camera and the light
      • 会生成两个不同的半路径、子路径
    • Connects the end points from both sub-paths
      • 从光源打出 light sub-paths,从摄像机再生产一系列半路径。BDPT 将半路径的端点连起来,形成整个路径。
      • 思想简单,但实现非常难,也比较慢。
notion image
在某些情况效果非常好。下图两种方法都用一个像素 32 个样本来产生。
  • Suitable if the light transport is complex on the light’s side
  • Difficult to implement & quite slow
notion image
光线追踪中,如果想要找到一条带有大量能量的路径,对于上图场景不太容易。因为光源往上面角落打,整个场景被间接光照亮。因为路径追踪第一个 bounce 是 diffuse,导致摄像机的光很难打到能量集中的区域去(左上角白色区域)。也就是说,当光线传播在光源这边容易算的时候,双向路径追踪效果才会好。
notion image

Metropolis Light Transport (MLT)

  • A Markov Chain Monte Carlo (MCMC) application
    • Jumping from the current sample to the next with some PDF
  • Very good at locally exploring difficult light paths
  • Key idea
    • Locally perturb an existing path to get a new path
用统计学中采样的工具——马尔科夫链。
马尔科夫链可以根据一个样本,生成一个跟它靠近的下一个样本。在用这些样本来估计函数的值。
如果给定足够的时间,马尔科夫链的蒙特卡洛方法,可以生成一系列以任意函数为 PDF 生成的样本。
💡
蒙特卡洛方法可以用任意 PDF 来采样一个函数是最合适的? 当采样的 PDF 和要积分的函数(f{x} p{x})形状一致的时候,这时候得到的 variant 是最小的。马尔科夫链的方法就是,任何一个未知的函数都可以通过马尔科夫链的方法生成一系列样本,使得样本的分布与被积函数形状一致。
如果已经有一个路径,就可以产生周围更多相似的路径。这是局部的方法。
notion image
很多情况下效果不错,特别适合做复杂、困难的光路的传播,因为只要找到一条作为种子,就可以找到更多。

好处

  • Works great with difficult light paths
  • Also unbiased
notion image
左图场景中门半开,所有光都从门进来,只有一小部分是直接被照亮的,其他都是间接被照亮的。越难的场景 MLT 做得越好。
右图水底有波纹情况(Caustics),这种是光线聚焦打到游泳池的底部。光线要穿过水表面,有些光会聚焦到一部分,水面又能将其聚焦到一条线上,这种情况渲染起来很困难。因为游泳池底假设是 diffuse 的,光线就要先经过 specular 的水面,游泳池底能被看见,说明光线也要经过水面,再到 diffuse 水底,再到 specular 水面,最后到光源。这种路径叫 Specular-Diffuse-Specular (SDS) 。这样路径打到 diffuse 水底的时候不知道往哪去,只有很少一部分才能过水面和光源连线。这样很难,但只要找到一条光路,MLT 就能找到更多。

坏处

  • Difficult to estimate the convergence rate
    • 很难在理论分析最后收敛的速度,给了一幅图,那么要多少时间才能收敛呢?
  • Does not guarantee equal convergence rate per pixel
  • So, usually produces “dirty” results
    • 所有像素都是局部的,都是自己做自己的,都没有关系,所以有些像素收敛得快,有些收敛得慢,因此图像看上去都比较脏,例如水盆里面的点和墙缝。
  • Therefore, usually not used to render animations
    • 上一帧和这一帧,两个地方各自有地方收敛或没收敛,看上去图片会抖得很厉害。
notion image

Photon Mapping 光子映射

有偏的估计
  • A biased approach & A two-stage method
  • Very good at handling Specular-Diffuse-Specular (SDS) paths and generating caustics
    • 非常适合来渲染 Caustics,一系列的光聚焦后打到复杂物体上,出来后聚焦在一条线上。
notion image
光子映射实现方法有很多,下面提供其中一种。
 
  • Stage 1 — photon tracing
    • Emitting photons from the light source, bouncing them around, then recording photons on diffuse surfaces
      • 从光源出发,光源无时无刻不在往外辐射光子,光子往各个地方打,一样反射和折射,但遇到 diffuse 物体就停下来。把所有光子整理起来
notion image
  • Stage 2 — photon collection (final gathering)
    • Shoot sub-paths from the camera, bouncing them around, until they hit diffuse surfaces
      • 真正从眼睛(摄像机)出发,往各个地方打路径。这些路径也反射和折射,直到打到 diffuse 物体上。现在可以把两步结合起来做一个计算
  • Calculation — local density estimation 计算局部的密度估计
    • Idea: areas with more photons should be brighter
      • 两步都打了光子,光子分布越集中越亮
    • For each shading point, find the nearest N photons. Take the surface area they over
      • 任何一个着色点,取周围最近的 n 个光子(位置我们都知道),nearest neighbor 问题。把所有光子组织成自上而下的加速结构模式,这样可以迅速定位一个点周围的光子。找到之后,算出 N 个光子占的面的面积,再算出光子密度。
      notion image
      notion image
      这样就可以用某一个 N 来考虑应该看到什么。但这就涉及到光子数量 N 取多少的问题。如果取少了,就会是很有噪声的图。取多了结果会糊。为什么?为什么光子映射是有偏的方法?因为在密度估计的时候,应该是算当前一个点密度是多少。在点旁边取微小面积来算多少个光子。但我们是靠周围光子来得到面积,正常来说两者相似,有限的数量和有限的面积,但只有在 dA 无限小才是正确的估计。
      另外的问题是,当覆盖面积足够小就接近对,但什么时候 △A 很小?本来我打出一亿个光子,现在打出一千亿个光子,更多的光子辐射出去。在任何一个着色点周围找临近的一百个光子,那肯定很集中,这一百个光子就会覆盖更小的区域。
      足够多的光子,最后能得出正确的结果,这也是为什么说是 consistent 的算法,但只要光子不是无限多,那么结果一定不是正确的,有点糊,因此是有偏的算法。
    • An easier understanding bias in rendering
      • Biased == blurry
      • Consistent == not blurry with infinite #samples
    • Why not do a “const range” search for density estimation? 能不能着色点周围取面积,数多少个光子。
      • 但这样得到的结果永远是不有偏的,也是不一致的。因为不管用多少亿个光子,只要确认了一个大小的范围,dA 永远不与 △A 相同,因为我们规定了面积,△A 不会自己变小。

      Vertex Connection and Merging(VCM)

    • A combination of BDPT and Photon Mapping 把 BDPT 和光子映射结合起来
    • Key idea
      • Let’s not waste the sub-paths in BDPT if their end points cannot be connected but can be merged
      • Use photon mapping to handle the merging of nearby “photons”
      notion image
      BDPT 把路径分成两步,那么如果我们两个路径的端点最后非常接近(上图下方),在同一面上,那么 X2 不可能再弹到 X2*,这种路径不要浪费,认为其中一半过来的就是光子,用光子映射把另外一部分 Sub-path 路径给结合起来,就能得出更好的结果。
      💡
      应用广泛,很多电影在用。

      Instant Radiosity (IR) 实时辐射度算法

      💡
      也被称为 many light 算法,很多光源的算法。
    • Sometimes also called many-light approaches
    • Key idea
      • Lit surfaces can be treated as light sources
    • Approach
      • Shoot light sub-paths and assume the end point of each sub-path is a Virtual Point Light (VPL)
      • Render the scene as usual using these VPLs
      notion image
      分析光线传播的时候,提到我们不太区分光线是反射来的、还是自己发出来的,它们都是光线都是 radiance。这样可以把已经被照亮的面(地方)认为是光源,并用来照亮别人。
      例如上图,左1是光源,那么打到的地方也都可以认为是新的光源(左2)。那么当摄像机看到一个点的时候,就用所有光源来照亮这个着色点(左3),这样就是考虑了光线弹射,其他光源对其都是直接光照,用直接光照来得到间接光照的结果。
    • Pros: fast and usually gives good results on diffuse scenes
    • Cons
      • Spikes will emerge when VPLs are close to shading points
      • Cannot handle glossy materials
      notion image
      缝隙会发光,是因为距离平方项的关系。之前在推 Light sampling 的时候,把对立体角的采样改成了对面积的采样,面积乘以cos除以两点距离,当距离很接近的时候,就是除以了一个极接近零的数,结果会非常大。
      ⚠️
      不能做 Glossy 的物体,有一点镜面的做不了。