路徑追蹤中菲涅爾反射錯誤的問題?
目前找到部分原因,首先是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 reflectionelse do refraction大部分材質的。
紅圈那兒想想都會有產生反射的呀,你那個圖沒有反射反而很奇怪。感覺是你採樣wi有問題。
推薦閱讀: