天天看点

通过 concentric 映射在单位圆盘上生成具有良好分布的样本

1. 通过直接映射, 在单位圆盘上生成样本

我们假设 p 和 q 是随机生成的两个一维均匀分布, 那么很容易能够想到利用极坐标的形式就可以将他们映射到单位圆盘上.

但是如果我们用 r = p 和 θ = 2πq 来表示一个点相对于圆心的位置, 实际上, 这样映射之后的样本并非均匀分布, 而是会明显聚集在圆心处.

通过 concentric 映射在单位圆盘上生成具有良好分布的样本

如果直接使用 p 和 q 作为点的横纵坐标, 那么生成的点会均匀的分布在单位正方形中. 我们以 p = 0.5 为例, 对于所有的 q 而言, 这时包围的面积是 0.5, 这将占据近似一半的点. 而将其映射到圆形区域时, r = p = 0.5, 这个圆盘的面积是 0.25π, 只占据整个圆盘面积的四分之一. 也就是说有一半的点会聚集在四分之一的面积上, 这就造成了圆心处的聚集.

2. 生成均匀分布的样本

为了产生正确的均匀分布, 通过一些计算转换可以得出, 我们需要用 r = sqrt( p ) 和 θ = 2πq 来生成采样点.

如下图所示, 这样样本会均匀分布在单位圆上

通过 concentric 映射在单位圆盘上生成具有良好分布的样本

但是这种映射方式有也有问题, 用这种方式将 2D 的随机样本映射到圆盘上会产生严重的扭曲区域. 因为 r 和 p 的坐标系关系以及引入了平方根(凸函数), 原本均匀的 p 被映射到圆的半径时会产生如下图所示的扭曲. 这并不是我们想要的结果, 我们希望的是 (p, q) 附近的点被映射到圆盘上之后依然在相近的位置上.

通过 concentric 映射在单位圆盘上生成具有良好分布的样本

3. concentric 映射

concentric 映射可以很大程度上解决上面提到的问题.

concentric 映射将正方形的楔形子块映射成圆盘上的一个切片, 其中 1/8 的映射如下, 其余类似.

我们要把垂直方向上的线段映射成一段圆弧, 注意这是一个等腰直角三角形, 又因为弧长与圆心角成正比, 所以我们要保证的比例就是 y/x = θ / PiOver4. 所以这部分我们可以设置映射: r = x, θ = PiOver4 * (y/x)

通过 concentric 映射在单位圆盘上生成具有良好分布的样本

concentric 映射的实现分为以下三步:

  1. 将随机值映射到 [-1, 1]^2
  2. 处理原点的特殊情况(0不能做分母, 原点直接映射为(0, 0)即可)
  3. 应用 concentric 映射 (根据 x 和 y 绝对值的大小分为两种情况)

下图依次展示了: 直接映射, 均匀映射, 同心映射, 原始样本

通过 concentric 映射在单位圆盘上生成具有良好分布的样本

4. Cosine-Weighted Hemisphere Sampling

因为光照的散射方程式用一个余弦项来作为 BSDF 和入射辐射度的乘积的权重值, 所以一个能生成, 相较于半球底部(余弦值更小), 更可能接近半球的顶部(余弦值更大)方向的方法是更有用的.

想象我们的光照, 环境中照亮 p 点的光线, 更多的来自于半球的顶部方向, 越靠近半球底面, 其对 p 点亮度的贡献就越小, 这也是我们在生成方向时更倾向于让方向靠近半球顶部的原因.

通过 concentric 映射在单位圆盘上生成具有良好分布的样本

Malley’s method 可以生成这种方向, 该方法首先在圆盘上生成均匀的样本(使用 concentric 映射), 然后将这些样本垂直映射到半球面上, 这样得到的方向便具有余弦分布.

通过 concentric 映射在单位圆盘上生成具有良好分布的样本

我们做一个截面就很好理解了, 如下所示, 用底面上均匀的样本生成的方向, 非常明显的聚集在半球顶部.

通过 concentric 映射在单位圆盘上生成具有良好分布的样本

数学上的推导可以参考 pbrt 的 13.6 2D Sampling with Multidimensional Transformations