最近在看一篇講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 組成,因此為了求得每個特徵的重要性,首先需要知道每個特徵在每一棵決策樹上所做的貢獻量,...