路徑追蹤中菲涅爾反射錯誤的問題?

目前找到部分原因,首先是Mitsuba使用的IBL是HDR圖(也就是未經截斷),而我使用的是png做IBL,更換為png後Mitsuba稍顯黯淡,但相較於我的結果仍然明亮。

---------------------------------------------------------------------------------------------------------------------

在重現Glass的材質的時候 遇到了材質球反射一直不正確的問題

以下是我將材質的Transmission部分設為0後的結果。如圖所示,可以看到和Mitsuba的比對發現,反射部分根本就是錯的(折射率為1.5)。

根據菲涅爾的公式來看的話,在入射角度較小的地方(如底座部分),反射的概率不應該有那麼高才對(明亮)。

為什麼Mitsuba的結果會如此「通透」「明亮」。期間我嘗試過修改菲涅爾公式為Schlick的近似,結果仍然一致。以下為偽代碼實現, 是模仿pbrt實現的。

float fresnel(cosi, cost, etai, etat)

float Rparl = ((etat * cosi) - (etai * cost)) /
((etat * cosi) + (etai * cost));
float Rperp = ((etai * cosi) - (etat * cost)) /
((etai * cosi) + (etat * cost));

return (Rparl*Rparl + Rperp*Rperp) / 2.f;

float etai = 1.0f, etat = 1.5f;

bsdf::sample(p, wi, wo)

float eta = etat / etai;

float Fr = fresnel(cosi, cost, etai, etat)

if Random &> Fr
// 折射方向向量
wo = refract();
// Transmission
// 來源: PBRT P443推導
result = specularTransmission * eta * eta / costheta;
else
// 反射方向向量
wo = reflect();
// Reflectance(暫時省略全反射)
// 來源: PBRT P440推導
result = specularReflectance / costheta;
end

上述代碼中specularTransmission設為了0,因此折射部分相當於被關閉了。specularReflectance為1。

反射與折射向量的推導來源於 http://graphics.stanford.edu/courses/cs148-10-summer/docs/2006--degreve--reflection_refraction.pdf

但不像pbrt那樣在返回的brdf上乘以菲涅爾項,而是使用隨機數來判斷究竟是發生折射還是反射

以下為渲染器渲染的菲涅爾貼圖以及入射光與表面發現夾角的cos的絕對值(請忽略圖中正中央的黑線……歷史遺留BUG)似乎並沒有太大的問題

可以看到紅圈標註的位置很明顯非邊緣處,自行算出來其菲涅爾值不過15%,但圖上的RGB可以達到驚人的240~255,非常的令人難以理解。

問題如下:

1.是什麼原因導致了畫面中反射的部分亮度有如此大的差別?

2.應當如何針對這樣的問題進行調試呢?

最後上一張自己的和Mitsuba最終的對比,很明顯看到Mitsuba的更接近現實正確的材質


公式感覺不對 然後是這個計算最後的brdf的方法 我不知道你現在實現的是標準的pt么 為什麼要除以cosineterm?還是你寫的偽代碼表達不是很準確。


肉眼上認為,50%就應該是下面這一幅圖,你看你的背景這麼亮,然後你第一幅圖邊緣基本也是黑的,哪裡有50%?


specularTranmission 和 specularReflectance 在你渲染器中含義是什麼?如果specularTranmission 為0,specularReflectance 就變為1的話, 我理解這兩個變數是折射和反射的概率。。。

而似乎樓主的意思,這兩個變數並不是用於 採樣 折射 or 反射的概率, 而想表達菲涅爾的反射係數和折射係數。(不知道我理解的是否正確)。

如果我理解正確,

那麼,反射係數和折射係數是不可以設定為0或者1的啊,是菲涅爾公式算出來的啊。

其次,關閉採樣折射,個人覺得應該在 if 隨機數這裡動手, 這麼寫:

if randomNumber &<= 1

do reflection

else

do refraction


大部分材質的R_F(90^circ) approx 1


紅圈那兒想想都會有產生反射的呀,你那個圖沒有反射反而很奇怪。感覺是你採樣wi有問題。


推薦閱讀:

在c++中,靜態的對象的析構順序似乎是不可控的。?
一道阿里實習生筆試題的疑惑?
學數據結構用C還是C++?

TAG:C | 計算機圖形學 | 遊戲編程 |