Ray Tracing-The Rest of Your Life(2)

Ray Tracing-The Rest of Your Life

4. Light Scattering

  • 光线散射(反射、折射)

Albedo

  • \(A\):albedo(whiteness 的拉丁语)
    • 物体以概率 \(A\) 散射光线,以概率 \(1-A\) 吸收光线
  • \(A\) 一般被定义为反射率,可以随着颜色、入射角的方向而变化

Scattering

  • 很多基于物理的渲染器会使用一组不同波长的光表示光的颜色
    • 我们之前使用的是 RGB,可以认为是一种对于长、中、短波的光的一种近似
  • 我们实际看到的颜色就是如下的积分式子

\[ Color=\int A\cdot s(dir)\cdot\text{color}(dir) \]

  • 这里的 dir表示的是 ray 的出射方向
    • 因为光路是可逆的,我们使用从相机出发的 ray 效果是一样的
  • \(s(dir)\) 表示朝着方向 dir 出射的概率
    • \(s()\) 描述的就是一个出射方向的 pdf
    • 当然,\(s()\) 可能和入射方向也有关,这样的话可以进一步描述为 \(s(view\_dir,dir)\)
      • \(view\_dir\) 表示入射光的方向,也就是视线的方向
  • \(\mathrm{color}(dir)\) 表示朝着 dir 这个方向的颜色,是递归定义

散射 pdf

  • 利用 MC 框架进行计算

\[ Color=\dfrac{A\cdot s(dir)\cdot\text{color}(dir)}{p(dir)} \]

  • \(p(dir)\) 是我们用于采样的 pdf

Lambertian 材质

\[ s(dir)=k\cos\theta \]

  • \(\theta\) 表示出射方向 dir 和法线的夹角
  • 我们是对立体角进行采样,等价于在球的表面进行采样,需要转化为 \(dS\)
    • 法向半球采样

\[ \int k\cos\theta\;\mathrm{d}S =\int_{0}^{2\pi}\int_{0}^{\pi/2}k\cos\theta\sin\theta\;\mathrm{d}\theta\mathrm{d}\phi =k\pi=1 \]

  • 于是有

\[ s(dir)=\dfrac{\cos\theta}{\pi} \]

  • 我们可以使用和 \(s(dir)\) 相同的采样方式,\(p(dir)=s(dir)\)
    • 这样子方差也不是为 0,方差为 0 的话应该是 \(p(dir)=s(dir)\cdot \mathrm{color}(dir)\)
      • 还得归一化
  • 于是我们得到

\[ Color=A\cdot\text{color}(dir) \]

  • 这和我们之前得到的形式是一致的,但是我们需要泛化他,这样才能够结合新的采样方式
    • 不一定是均匀采样,可能是对高贡献的方向多采样(例如导向光源)
  • 文献中更多使用 BRDF 来描述
    • Bidirectional Reflectance Distribution Function
  • BRDF 定义如下

\[ BRDF=\dfrac{A\cdot s(dir)}{\cos\theta} \]

  • 朗伯材质的表面散射的 BRDF 如下

\[ BRDF=\dfrac{A}{\pi} \]

  • 也就是说

\[ Color=\dfrac{BRDF\cdot\cos\theta}{p(dir)}\cdot\text{color}(dir) \]

  • 对于参与介质而言,通常称 albedo 为 scattering albedo,城 scattering pdf 为 phase function
    • participation media (volumes)

5. Importance Sampling Material

  • 我们可以使用任意的 pdf 进行采样,任意的 pdf 都会让结果是无偏的,只是会影响收敛速度
  • 我们期望我们结果的图片不要有太多噪点,希望采样到更多更亮的点
    • 更多的向光源采样
  • 我们记之前和 \(s()\) 相关的 pdf 为 \(\text{pSurface}(dir)\),和光源相关的 pdf 为 \(\text{pLight}(dir)\)
  • 我们可以对这两种方式进行一个组合
  • 如下是一个例子

\[ p(dir) = \frac{1}{2}\cdot \text{Light}(dir) + \frac{1}{2}\cdot \text{pSurface}(dir) \]

  • 事实上,任意 \(0\le\alpha\le1\) 都是一个 pdf

\[ p(dir) = \alpha\cdot \text{Light}(dir) + (1-\alpha)\cdot \text{pSurface}(dir) \]

  • 我们选择 pdf 的参考就是让 pdf 尽可能接近于 \(s(dir)\cdot\text{color}(dir)\)
    • 简单地说,\(s(dir)\cdot\text{color}(dir)\) 越大的地方,我们期望 pdf 值越大
  • 对于朗伯材质而言,一个猜测是,\(\text{color}(dir)\) 越大,pdf 越大
  • 镜面材质,special case,出射方向比较小

Cornell Box(1000spp)

  • 以这个为例,开始降噪
    • 166s

  • 更新材质类,提供 pdf 功能
  • Lambertian 余弦采样
  • 171s

  • 修改 pdf,法向半球采样
    • 感觉噪点变重了,但是确实也是无偏的

6. 如何采样分布

  • 简单化
    • \(z\) 轴作为法向量方向
    • 只处理关于 \(z\) 轴旋转对称的情况
  • 我们记 \(dir\) 和法向的夹角为 \(\theta\),此时有

\[ p(dir)=f(\theta) \]

  • 我们指定一个分布 \(p(dir)=f(\theta)\)
  • 我们都是认为在球面上采样

\[ \int f(\theta)\;\mathrm{d}S=1 \]

  • 转化为 \(\theta,\phi\) 如下

\[ \int_{0}^{2\pi}\int_{0}^{\pi} f(\theta)\sin\theta\;\mathrm{d}\theta\mathrm{d}\phi=1 \]

  • 我们能够得到边缘分布如下

\[ \begin{aligned} a(\phi) &=\int_{0}^{\pi} f(\theta)\sin\theta\;\mathrm{d}\theta\\ &=\dfrac{1}{2\pi}\int_{0}^{2\pi}\int_{0}^{\pi} f(\theta)\sin\theta\;\mathrm{d}\theta\mathrm{d}x\\ &=\dfrac{1}{2\pi}\\ \end{aligned} \]

\[ b(\theta)=\int_{0}^{2\pi}f(\theta)\sin\theta\;\mathrm{d}\phi=2\pi f(\theta)\sin\theta \]

  • 我们指定 \(r_1,r_2\) 为满足 \([0,1]\) 均匀分布的随机变量,如何产生 \(\theta,\phi\) 呢?

球面均匀采样

\[ f(\theta)=\dfrac{1}{4\pi} \]

  • 利用 cdf 相同,可以求得

\[ \phi=2\pi r_1 \]

\[ \begin{aligned} &\Pr(R_2\le r_2)=\Pr(\Theta\le\theta)\\ \Longrightarrow&\;r_2=\int_{0}^{\theta} 2\pi f(t)\sin t\;\mathrm{d}t=\dfrac{1-\cos\theta}{2}\\ \Longrightarrow&\;\cos\theta=1-2r_2\\ \end{aligned} \]

  • 根据 \(x,y,z\) 变换

\[ \begin{array}{c} x = \cos(\phi) \cdot \sin(\theta)\\ y = \sin(\phi) \cdot \sin(\theta)\\ z = \cos(\theta)\\ \end{array} \]

  • 得到

\[ \begin{array}{c} x = \cos(2\pi r_1) \cdot 2 \sqrt{r_2(1 - r_2)}\\ y = \sin(2\pi r_1) \cdot 2 \sqrt{r_2(1 - r_2)}\\ z = 1-2r_2\\ \end{array} \]

  • 如此,我们得到了一个球面上的均匀采样

半球均匀采样

半球均匀采样

\[ f(\theta)=\dfrac{1}{2\pi} \]

  • 类似的我们可以得到

\[ \phi=2\pi r_1,\cos\theta=1-r_2 \]

  • 于是

\[ \begin{array}{c} x = \cos(2\pi r_1) \cdot \sqrt{r_2(2 - r_2)}\\ y = \sin(2\pi r_1) \cdot \sqrt{r_2(2 - r_2)}\\ z = 1-r_2\\ \end{array} \]

例子

  • 一个半球采样的例子如下(朗伯反射)

\[ p(dir)=\dfrac{\cos\theta}{\pi} \]

  • 计算

\[ r_2=\int_{0}^{\theta} 2\pi\dfrac{\cos t}{\pi}\sin t\;\mathrm{d}t=1-\cos^2\theta \]

\[ \phi=2\pi r_1 \]

  • 变换
    • 因为是半球,因此 \(z\ge0\)

\[ \begin{array}{c} x = \cos(2\pi r_1) \cdot \sqrt{r_2}\\ y = \sin(2\pi r_1) \cdot \sqrt{r_2}\\ z = \sqrt{1-r_2}\\ \end{array} \]

7. 正交基

  • 正交基:orthonormal basis (ONB)
    • 3 个正交向量
  • 上面我们讨论了如何生成关于 \(z\) 轴旋转对称的分布,如何将其变换到关于法向对称分布?
    • 坐标变换
  • 我们使用的是简化版的坐标变换,只需要将 \(z\) 轴(局部坐标系)变换到法向(全局坐标系)即可

构建局部坐标系

  • \(\mathbf{n}\)(法线)
  • 生成一个与 \(\mathbf{n}\) 不平行的方向 \(\mathbf{a}\)
    • 判断 \(\mathbf{n}\) 是否为特定轴,如果不是则选取 \(\mathbf{a}\) 为某个轴即可
1
2
3
4
if(n.x > 0.9):
a = (0, 1, 0)
else:
a = (1, 0, 1)

\[ \begin{array}{c} \mathbf{t}=\text{unit_vector}(\mathbf{a}\times \mathbf{n})\\ \mathbf{s}=\mathbf{t}\times \mathbf{n}\\ \end{array} \]

  • 现在得到了标准正交基 \(\mathbf{s},\mathbf{t},\mathbf{n}\)

变换

  • 标准正交基 \(\mathbf{s},\mathbf{t},\mathbf{n}\) 中方向坐标为 \((x,y,z)\)
  • 全局坐标系中的方向为 \((x',y',z')\)

\[ \begin{pmatrix} \mathbf{s}^t\\\mathbf{t}^t\\\mathbf{n}^t\end{pmatrix} \begin{pmatrix} x'\\y'\\z' \end{pmatrix} = \begin{pmatrix} x\\y\\z \end{pmatrix} \]

  • 于是

\[ \begin{pmatrix} x'\\y'\\z' \end{pmatrix} = \begin{pmatrix} \mathbf{s}^t\\\mathbf{t}^t\\\mathbf{n}^t\end{pmatrix}^t \begin{pmatrix} x\\y\\z \end{pmatrix} = \begin{pmatrix} \mathbf{s}&\mathbf{t}&\mathbf{n}\end{pmatrix} \begin{pmatrix} x\\y\\z \end{pmatrix} =x\mathbf{s}+y\mathbf{t}+z\mathbf{n} \]

  • 此时利用上面说的方式采样,结果图如下

\[ p(dir)=\dfrac{\cos\theta}{\pi} \]

  • 说实话看不出来很大区别