2017-04-21 31 views
0

我已經根據learnopengl.com 部分編寫了一個程序。GLSL - PBR着色器 - 漫反射IBL組件無法呈現

當使用輻射圖計算環境組件時,失敗的部分位於PBR着色器的片段着色器中。我已經驗證地圖正在正確發送到着色器,以及所有其他地圖。

當不IBL運行的場景是這樣的:

但與IBL運行它看起來是這樣的:

正如你所看到的,球體與PBR着色器消失。

這導致的問題是如下所述的部分:

vec3 kS = fresnelSchlick(max(dot(N, V), 0.0), F0); 
vec3 kD = 1.0 - kS; 
kD *= 1.0 - metallic;  
vec3 irradiance = texture(irradianceMap, N).rgb; 
vec3 diffuse = irradiance * albedo; 
vec3 ambient = kD * vec3(diffuse) * ao; 

colour = ambient +Lo; 

具體地,問題在於與輻照度的變量,其中,當我對其執行正常操作,但是,如果我由0.01乘以它工作得很好,例如如預期的那樣,它會變暗。但是,當我添加或乘以例如輻照度的反照率變量時,它會失敗,並且不輸出任何內容。我嘗試了1000種不同的組合和變量,我簡直不明白爲什麼它不允許這個變量與其他變量相結合。我不明白爲什麼用albedo.r乘以輻照度。即使兩者都是0,結果也是黑色的,而不是球體完全消失。

例如,這工作:

vec3 irradiance = texture(irradianceMap, N).rgb; 

colour = irradiance; 

除了這一點:

vec3 irradiance = texture(irradianceMap, N).rgb; 

colour = irradiance*0.01; 

但這種失敗:

vec3 irradiance = texture(irradianceMap, N).rgb; 

colour = irradiance*albedo; 

除了這一點:

vec3 irradiance = texture(irradianceMap, N).rgb; 

colour = vec3(irradiance.r,albedo.g,albedo.b); 

或者你可以夢想的任何上述組合。 它周圍的所有其他變量都能正常工作和輸出。只有在使用特定變量執行操作時纔會出錯。我幾乎無法理解爲什麼不能,並且在網上找到了很少的答案。

+0

無論在片段着色器中如何更改,球體都不能完全消失......所以這可能意味着片段着色器編譯失敗,並且引擎甚至無法渲染它們,因此應該檢查日誌中的着色器編譯錯誤。 可能導致球體消失的唯一其他事情是頂點着色器的變化或在片段着色器中將alpha設置爲0(如果球體使用混合)或丟棄;在片段着色器中進行操作。 您能否顯示您正在使用的完整頂點和片段着色器? –

回答

2

由於albedo未定義,類型錯誤等原因,最有可能着色器編譯失敗。您有uniform vec3 albedo;或在着色器中定義的等效項?

從你展示的例子看,它肯定是albedo而不是irradiance的問題。