mh取樣演算法推導 重要性取樣小結

2021-10-14 10:58:14 字數 1812 閱讀 4849

最近在看一篇講ssr的ppt,裡面提到了根據ggx分布做重要性取樣,其實之前或多或少的了解過重要性取樣演算法,不過當時沒有認真的總結過這個問題,也沒有想過要認真的推導相關的公式。這篇給文章的主要目的就是給看過的一些文章做個總結,推導一下相關的公式,以免自己會忘記。接下來會分幾個步驟介紹一下與重要性取樣相關的內容。

一、ndf表示的是什麼?

ndf從字面意思來看表示的是法線分布函式(normal distribution function),但是具體表示的是什麼?單位是什麼呢?細心的同學可能會發現,如果直接對ndf進行積分,得到的結果很可能不為1,出現這個結果的原因是ndf表示的並不是法線的概率密度函式。

從how is the ndf really defined? 這篇文章裡面可以看到ndf表示的是當前點的微表面(microfacet)的面積除以巨集表面(macrofacet)的面積,然後再除以立體角。所以ndf的單位是立體角分之一。

上圖中h表示的微表面的法線,n表示巨集表面的法線。在ggx的那篇**中ndf遵循如下公式:

二、 blinn重要性取樣演算法

blinn的ndf定義如下:

根據式(2)可知

由於這個概率密度函式有2個引數,我們需要分別計算邊緣概率密度函式。

根據公式(5),計算關於

計算 根據公式(7)得到關於

根據公式(6)和(8)得到的累計概率函式,假設由0-1均勻取樣得到的變數為

根據公式(9)可以得到取樣結果為:

至此我們得到了關於blinn的重要性取樣結果。

三、ggx重要性取樣

由於在上一節中加了過多的說明性的文字,這一節和上一節基本相差不大,所以只列出公式,不在寫過多的文字說明。

ggx的ndf為:

將其轉換到球面上的概率密度函式表示為:

分別求邊緣概率密度,得到:

解公式

貼一下ue4中ggx重要性取樣的**,可以看到和我們推導的結果是一樣的:

上面的**中計算出來的pdf是d * costheta,d * costheta也就是 d* noh,這個是沒有問題的,但是很多時候我們會看到下面的**,下面的**中使用的pdf與我們推導的不太一樣,這個的主要原因就是我們使用ggx重要性取樣得到的是h向量,pdf表示的也是h向量的分布,但是下面的圖中需要取樣的是l向量的,所以這個pdf就需要根據雅可比行列式進行轉換,將h的分布概率轉換為l的概率分布,更加具體的推導可以參考[5]。

為了方便回顧這些內容,就把**中的一部分內容貼到下面吧。

到這裡,基本上就已經知道如何根據ndf得到相應的重要性取樣方法。

公式編輯還是挺好用的。

[1][2]

[3][4]

[5]

重要性取樣

from scipy import stats from scipy.stats import norm import numpy as np import matplotlib.pyplot as plt def f x return np.sin x x def intf x1,x2 retur...

強化學習中的重要性取樣

在之前內容的整理中涉及了一些重要性取樣的內容,在介紹蒙特卡羅離線策略 時有所提及。其中詳細介紹了到底什麼是重要性取樣。這篇博文主要想更加深刻得思考為什麼用的是重要性取樣方法?參考鏈結中一句話說的很好 重要性取樣出現的原因是因為原始分布難以直接取樣,故需要借助乙個簡單 可取樣的分布來計算期望。但強化學...

隨機森林計算特徵重要性推導

呼叫了sklearn函式包中randomforestregressor.feature importances 函式計算特徵重要性。隨機森林 randomforest 是由一棵棵決策樹 decision tree 組成,因此為了求得每個特徵的重要性,首先需要知道每個特徵在每一棵決策樹上所做的貢獻量,...