2017-04-21 6 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

フラグメントシェーダで何が変更されたとしても、球体は完全に消えません。これはおそらく、フラグメントシェーダのコンパイルが失敗し、エンジンがそれらをレンダリングしないことを意味するため、ログでシェーダのコンパイルエラーを確認する必要があります。 頂点シェーダが変更されたり、フラグメントシェーダ(球体がブレンドを使用する場合)または破棄のアルファ設定が0になることがあります。フラグメントシェーダでの操作 使用している頂点シェーダとフラグメントシェーダを完全に表示できますか? –

答えて

2

albedoが定義されていない、タイプが間違っているなどの理由でシェーダのコンパイルに失敗する可能性があります。uniform vec3 albedo;またはそれに相当するものがシェーダで定義されていますか?

あなたが示した例から、irradianceではなく、確かにalbedoの問題があるように見えます。

関連する問題