Homework 3 - Environment Lights

CSIE5098 - Digital Image Synthesis

Shiang-Yun Yang 楊翔雲

Date submitted: 21 Dec 2015

Code emailed: 21 Dec 2015

Description of implementation approach and comments

Median Cut Algorithm

根據論文 P. Debevec, A Median Cut Algorithm for Light Probe Sampling, SIGGRAPH 2006 Sketches and Applications. 中,預期要將 pbrt/lights/infinite.cpp 中的 class InfiniteAreaLight 用數個點光源取代 Infinite Area Light 的寫法,提升均勻取樣的效能,而 Median Cut Algorithm 在預處理非常快,根據用多少量的點光源將影響品質,若在品質不用太好的 rendering 環境下,這是一個不錯的降質提升速度的方案。

在 Median Cut Algorithm 取樣 64 equal-energy region 的速度差異比較

算法的步驟如下:

  1. 將入射光場影像 (light probe image) 切成好幾個矩形區域,每一個區域將取用一個點光源代替。將入射光場影像轉換成灰階亮度 \(Y\),如論文中所提及的方案 \(Y = 0.2125 R + 0.7154 G + 0.0721 B\) 這類型的轉換。
  2. 對於每一個區域將會根據最長維度切割成兩個子區域。切割成兩個子區域的亮度總和越接近越好。
  3. 若切割區域數量不到目標的數量,則重複步驟 2。
  4. 最後將每一個區域算出代表的點光源,並加總區域內的亮度和,隨後取樣根據亮度和作為取樣根據 (在 Spectrum MedianCutEnvironmentLight::Sample_L(const Point&, float, const LightSample&, float, Vector&, float*, VisibilityTester*) 中使用),用每一個區域內部的 pixel 位置和亮度計算重心作為代表的點光源。

算法類似於 k-d Tree,但特別的是每次選擇區域維度最長的那一段進行切割,而不是像 k-d Tree 則是採用輪替維度進行。

Median Cut Algorithm 需要 \(\mathcal{O}(HW)\) 時間 \(\mathcal{O}(HW)\) 空間來預處理亮度資訊。若要切割成 \(N\) 個區域,需要 \(\mathcal{O}(\log N)\) 次迭代,每一次迭代增加兩倍區域數量。將一個區域切割時,針對維度最長的那一軸二分搜尋,二分搜尋計算其中一個區域的亮度和是否是整個區域亮度的一半,由於預處理完成的表格,可以在 \(\mathcal{O}(1)\) 時間內計算任意平行兩軸的矩形內部元素總和。

維護 sumTable[i][j] 計算左上角 \((0, 0)\) 右下角 \((i, j)\) 的亮度和,計算任意平行兩軸矩形內部和只需要 \(\mathcal{O}(1)\) 時間。

float getEnergy(float sumTable[], int width, int height) {
    float e = sumTable[VERT(ru, rv)];
    if (lu) e -= sumTable[VERT(lu-1, rv)];
    if (lv) e -= sumTable[VERT(ru, lv-1)];
    if (lu && lv)   e += sumTable[VERT(lu-1, lv-1)];
    return e;
}

另一種方案,可以從 pbrt 原生的 class MIPMap 取代上述寫法,MIPMap 的寫法採用分層式的架構,每一層將原圖長寬各縮小一半。計算某矩形元素總和時,藉由兩層的總和估計進行內插。理論上,這種寫法雖然不夠精準,但提供很好的快取優勢。

重心計算

Centroid Formula 1

一般重心計算採用以下公式:

\[X_c = \frac{\sum^{}_{(x, y) \in \mathit{region}} L_{(x, y)} \; x}{\sum^{}_{(x, y) \in \mathit{region}} L_{(x, y)}} \\ Y_c = \frac{\sum^{}_{(x, y) \in \mathit{region}} L_{(x, y)} \; y}{\sum^{}_{(x, y) \in \mathit{region}} L_{(x, y)}} \]

經由 Median-Cut Algorithm 在 Texmap 1 運行後,代表的點光源明顯地偏離亮區,因此為了讓代表的點光源更靠近亮區,我們將其重心公式修改成 Centroid Formula 2。

Centroid Formula 1

若以 \(\mathit{Energy} \propto L^2_{(x, y)}\),能量與亮度二次成正比,則計算出的重心會更靠近亮區。

\[X_c = \frac{\sum^{}_{(x, y) \in \mathit{region}} L^2_{(x, y)} \; x}{\sum^{}_{(x, y) \in \mathit{region}} L^2_{(x, y)}} \\ Y_c = \frac{\sum^{}_{(x, y) \in \mathit{region}} L^2_{(x, y)} \; y}{\sum^{}_{(x, y) \in \mathit{region}} L^2_{(x, y)}} \]

比較結果如下:

Texmap 1

拖曳圖片下方的白色鍵頭,左圖為 Centroid Formula 1 / 右圖為 Centroid Formula 2 (建議使用 Firefox)

Texmap 2

拖曳圖片下方的白色鍵頭,左圖為 Centroid Formula 1 / 右圖為 Centroid Formula 2,由於圖片尺寸稍大需要放大觀看。

測試比對展示櫃

相較於原生寫 Infinite Area Light,用 64 個點光源明顯地造成在車頂過亮

Reference / Median Cut Algorithm (envlight 256 samples, Centroid Formula 1)

Reference / Median Cut Algorithm (envlight 256 samples, Centroid Formula 2)

利用 Photomatrix 進行 tone mapped 後,從地板影子看出 Centroid Formula 1 相較於 Centroid Formula 2 所選的點光源比較不集中,相當零散。

Reference / Median Cut Algorithm (envlight 256 samples, Centroid Formula 1, tone mapping)

Reference / Median Cut Algorithm (envlight 256 samples, Centroid Formula 2, tone mapping)

Centroid Formula 1 和 Centroid Formula 2 最大的差異在於車尾燈的光影,Centroid Formula 2 算出來較接近原圖。

Reference / Median Cut Algorithm (envlight-new 256 samples, Centroid Formula 1)

Reference / Median Cut Algorithm (envlight-new 256 samples, cCentroid Formula 2)

測試結果

在 Median Cut Algorithm 取樣 64 equal-energy region 的速度差異比較

Envlight 4 samples

Infinite Area Light

  • Processing Time: 7.044 seconds

My Implementation 1

  • Processing Time: 5.970 seconds

My Implementation 2

  • Processing Time: 5.995 seconds

Envlight 16 samples

Infinite Area Light

  • Processing Time: 11.570 seconds

My Implementation 1

  • Processing Time: 6.847 seconds

My Implementation 2

  • Processing Time: 10.487 seconds

Envlight 64 samples

Infinite Area Light

  • Processing Time: 30.650 seconds

My Implementation 1

  • Processing Time: 10.487 seconds

My Implementation 2

  • Processing Time: 10.496 seconds

Envlight 256 samples

Infinite Area Light

  • Processing Time: 106.768 seconds

My Implementation 1

  • Processing Time: 25.756 seconds

My Implementation 2

  • Processing Time: 27.283 seconds

Envlight New 4 samples

Infinite Area Light

  • Processing Time: 9.343 seconds

My Implementation 1

  • Processing Time: 11.415 seconds

My Implementation 2

  • Processing Time: 11.390 seconds

Envlight New 16 samples

Infinite Area Light

  • Processing Time: 14.695 seconds

My Implementation 1

  • Processing Time: 12.682 seconds

My Implementation 2

  • Processing Time: 12.640 seconds

Envlight New 64 samples

Infinite Area Light

  • Processing Time: 35.954 seconds

My Implementation 1

  • Processing Time: 17.984 seconds

My Implementation 2

  • Processing Time: 17.944 seconds

Envlight New 256 samples

Infinite Area Light

  • Processing Time: 121.204 seconds

My Implementation 1

  • Processing Time: 39.614 seconds

My Implementation 2

  • Processing Time: 39.573 seconds

增加 equal-energy region 測試結果

Envlight 256 samples (My Implementation 1)

Envlight 256 samples (My Implementation 2)

Envlight New 256 samples (My Implementation 1)

Envlight New 256 samples (My Implementation 2)

Equal-Energy Region

Envlight 256 samples (My Implementation 1)

My Implementation 1, 4 equal-energy region

My Implementation 1, 16 equal-energy region

My Implementation 1, 64 equal-energy region

My Implementation 1, 256 equal-energy region

Envlight-new 256 samples (My Implementation 1)

My Implementation 1, 4 equal-energy region

My Implementation 1, 16 equal-energy region

My Implementation 1, 64 equal-energy region

My Implementation 1, 256 equal-energy region

Envlight 256 samples (My Implementation 2)

My Implementation 2, 4 equal-energy region

My Implementation 2, 16 equal-energy region

My Implementation 2, 64 equal-energy region

My Implementation 2, 256 equal-energy region

Envlight-new 256 samples

My Implementation 1, 4 equal-energy region

My Implementation 1, 16 equal-energy region

My Implementation 1, 64 equal-energy region

My Implementation 1, 256 equal-energy region