2015-08-18 37 views
1

我使用Cook-Torrance鏡面BRDF +迪士尼漫反射BRDF光模型,如果單獨應用,它們可以很好地工作。不幸的是,如果我嘗試將它們合併一些奇怪的情況: Specular Intensity + Diffuse Intensity artifacts 漫反射光照看起來是這樣的: enter image description here 鏡面光照(對地形的邊緣通知文物): enter image description hereGLSL PBS實現,奇怪的着色器行爲

得到的光照被計算如下:

float result = Fr + Fd; 

其中Fd是漫射BRDF分量,Fr是鏡面BRDF分量。

爲什麼它會在產生的光照貼圖上產生這樣的僞像?

我想,得到的光強度超過該範圍[0; 1],以檢查我修改代碼,如下所示:

return result <= 1.0 ? result : 1.0; 

所得光照: Modified shaders

,你可以看到,所有的文物現在都有1.0的強度(他們明顯超過[0; 1]範圍),但爲什麼如果鏡面反射地圖包含零,這會繼續發生?

全部着色器代碼:Pastebin

+1

似乎非常難以解釋。只有一次,我看到了來自着色器的怪異結果,它是由一些未定義的數學引起的,這些數學導致了NaN以怪異的方式傳播和破壞東西。 也許看看所有的pow函數,並確保第一個參數不能通過在abs/max /飽和或者所有這些函數中暫時黑客入侵(pow(pow(dotNH,2.0)*( m_alpha - 1.0)+ 1.0,2.0));可能會有負面的例子)。如果這沒有得到它,我會盡量簡化 – Columbo

+0

@Columbo謝謝。 N和L的點積爲0,給出了零誤差的除法。我已經添加了abs函數作爲修補程序。 – romu4

回答

2

如@Columbo提到的,它是爲NaN異常(由零倒掉分裂的原因),這導致奇怪的着色行爲。我修改了代碼略:

float F_Schlick (in float f0, in float f90, in float u) 
{ 
    return f0 + (f90 - f0) * pow(clamp(1.0 - u, 0.0, 1.0), 5.0); //line 34 
} 

點產品應該是大於零:

float dotNV = abs(dot(N, V)); 
float dotNL = abs(dot(N, L)); 

The final shader code