通過 concentric 映射在單位圓盤上生成具有良好分佈的樣本

1. 通過直接映射, 在單位圓盤上生成樣本

我們假設 p 和 q 是隨機生成的兩個一維均勻分佈, 那麼很容易能夠想到利用極座標的形式就可以將他們映射到單位圓盤上.
但是如果我們用 r = p 和 θ = 2πq 來表示一個點相對於圓心的位置, 實際上, 這樣映射之後的樣本並非均勻分佈, 而是會明顯聚集在圓心處.
非均勻分佈
如果直接使用 p 和 q 作爲點的橫縱座標, 那麼生成的點會均勻的分佈在單位正方形中. 我們以 p = 0.5 爲例, 對於所有的 q 而言, 這時包圍的面積是 0.5, 這將佔據近似一半的點. 而將其映射到圓形區域時, r = p = 0.5, 這個圓盤的面積是 0.25π, 只佔據整個圓盤面積的四分之一. 也就是說有一半的點會聚集在四分之一的面積上, 這就造成了圓心處的聚集.

2. 生成均勻分佈的樣本

爲了產生正確的均勻分佈, 通過一些計算轉換可以得出, 我們需要用 r = sqrt( p ) 和 θ = 2πq 來生成採樣點.
如下圖所示, 這樣樣本會均勻分佈在單位圓上
均勻分佈
但是這種映射方式有也有問題, 用這種方式將 2D 的隨機樣本映射到圓盤上會產生嚴重的扭曲區域. 因爲 r 和 p 的座標系關係以及引入了平方根(凸函數), 原本均勻的 p 被映射到圓的半徑時會產生如下圖所示的扭曲. 這並不是我們想要的結果, 我們希望的是 (p, q) 附近的點被映射到圓盤上之後依然在相近的位置上.
發生扭曲

3. concentric 映射

concentric 映射可以很大程度上解決上面提到的問題.
concentric 映射將正方形的楔形子塊映射成圓盤上的一個切片, 其中 1/8 的映射如下, 其餘類似.
我們要把垂直方向上的線段映射成一段圓弧, 注意這是一個等腰直角三角形且弧長與圓心角成正比, 所以我們要保證的比例就是 y/x = θ / PiOver4. 所以這部分我們可以設置映射: r = x, θ = PiOver4 * (y/x)
concentric mapping
concentric 映射的實現分爲以下三步:

  1. 將隨機值映射到 [-1, 1]^2
  2. 處理原點的特殊情況(0不能做分母, 原點直接映射爲(0, 0)即可)
  3. 應用 concentric 映射 (根據 x 和 y 絕對值的大小分爲兩種情況)

下圖依次展示了: 直接映射, 均勻映射, 同心映射, 原始樣本
策略對比

4. Cosine-Weighted Hemisphere Sampling

因爲光照的散射方程式用一個餘弦項來作爲 BSDF 和入射輻射度的乘積的權重值, 所以一個能生成, 相較於半球底部(餘弦值更小), 更可能接近半球的頂部(餘弦值更大)方向的方法是更有用的.
想象我們的光照, 環境中照亮 p 點的光線, 更多的來自於半球的頂部方向, 越靠近半球底面, 其對 p 點亮度的貢獻就越小, 這也是我們在生成方向時更傾向於讓方向靠近半球頂部的原因.
光照示意圖
Malley’s method 可以生成這種方向, 該方法首先在圓盤上生成均勻的樣本(使用 concentric 映射), 然後將這些樣本垂直映射到半球面上, 這樣得到的方向便具有餘弦分佈.
Malley's method
我們做一個截面就很好理解了, 如下所示, 用底面上均勻的樣本生成的方向, 非常明顯的聚集在半球頂部.
形象解釋
數學上的推導可以參考 pbrt 的 13.6 2D Sampling with Multidimensional Transformations

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章