2011-09-02 3 views
2

この問題の記述方法は実際にはわかりませんので、コードで説明しようとします。私は、視差マッピングとライティング計算を行うフラグメントシェーダを持っています。私は、このコードは他のシェーダで働いていOpenGL ES 2.0。 GLSL - フラグメントシェーダで同時に2つのサンプリングされた色を使用することはできません

// sample maps 
vec3 albedo = texture2D(u_albedo_texture_1, p_texc).rgb; 
vec3 ao = texture2D(u_ambientocclusion_texture, v_texcoord).rgb - 0.5; // ambient occlusion 
vec3 normalT = texture2D(u_normalmap_texture, p_texc).rgb * 2.0 - 1.0; // tangent space normal 

vec4 normalW = vec4(normalize(TBN * normalT).xyz, 1.0); // world space normal 

vec3 color = vec3(0.0); 
vec3 ambient = textureCube(u_cubemap_texture, -normalW.xyz).rgb; // get ambient lighting from cubemap 
color += ambient * ao; 

float d = length(light_vector); 
float atten = 1.0/dot(light_attenuation, vec3(1.0, d, d * d)); // compute attenuation of point light 

// diffuse term 
float ndotl = max(dot(normalW.xyz, light_vector), 0.0); 
color += atten * ndotl * light_diffuse.rgb * albedo; 

// specular term 
float hdotn = max(0.0, dot(half_vector, normalW.xyz)); 
color += atten * ((shininess + 8.0)/8.0 * 3.1416) * light_specular.rgb * p_ks * pow(hdotn, shininess); 

gl_FragColor = vec4(color.rgb, 1.0); 

が、ここに:私は短いそれを維持するために、私はコードのみを投稿しますので、テクスチャおよび/または照明計算のサンプリングに問題を追跡するために管理してきました視差マッピングシェーダではピクセルを破棄してしまい、その理由を理解できません。したがって、オブジェクトを表示する代わりに、ピクセルを破棄してオブジェクトがまったく表示されません。間違った色や汚れた色はありません。

私はこの問題をアルベドと周囲のサンプリングされた色に追跡することができました。両方とも正しくサンプリングされています。私は

gl_FragColor = vec4(ambient.rgb, 1.0); 

または

gl_FragColor = vec4(albedo.rgb, 1.0); 

をプリントアウトする場合、それらの両方が正しく表示されますが、私は両方の色で何かをしようとした場合、ピクセルが破棄されます。

gl_FragColor = vec4(ambient + albedo, 1.0); 
gl_FragColor = vec4(ambient * albedo, 1.0); 
gl_FragColor = vec4(ambient.r, albedo.g, ambient.b, 1.0); 

アンビエントは、2Dテクスチャからキューブマップとアルベドからサンプリングされます。私はアンビエントオクルージョンとノーマルマッピングのための他のサンプラーを用意していますし、アンビエントORアルベドと組み合わせて使用​​しています。 ambient + aoが動作し、albedo + aoが動作します。

これは私の問題であり、原因を突き止めることができません。私が言ったように、私は同じコードを別のシェーダに持っていて、それが動作します。

と言いますと、これは、OpenGL ES 2.0のPowerVRエミュレータで動作します。 GPUはnVidia GT220です。 また、私のコードでは、効率の悪いもののような他の間違いを指摘することもできます。必要に応じて、完全なフラグメントシェーダコードを投稿します。長い記事のため申し訳ありません:P

うわー、原因はとても愚かだったと思いますが、私は完全にそれを逃したことはできません

を解決しました。基本的には、その特定のモデルのキューブマップをロードするのを忘れてしまい、シェーダーに送信されませんでした。それでも、どうしたら最初に何かを試してみましたか?つまり、それは別々に動作していたので、テクスチャユニットは何をサンプルしましたか?以前の処理からキャッシュに残ったキューブマップ?

+0

私はあなたがシェーダで、あなたが他の一つは離れて最適化します周囲*または*アルベド(両方ではない)のいずれかを使用している場合にはテクスチャの数にいくつかの実装の制限に達している予感を持っています問題ではありません。 – Flexo

答えて

0

それでも、どのように地獄は、それが最初の場所で何かをサンプリングしたのですか?私のシェーダは、希望の結果が得られませんが、うるさく「正常」を探している通常

シェーダのコンパイルが(私はどこかにエラーをした)、それを破棄し、代わりに「固定パイプライン」シェーダを使用することにしましたので、それがあります...

関連する問題