視差マッピングと照明計算を行うフラグメント シェーダーがあります。問題をテクスチャのサンプリングおよび/またはライティング計算にたどることができたので、簡潔にするためにそのためのコードのみを投稿します。
// 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 アルベドと連携して機能します。したがって、アンビエント + ao が機能し、アルベド + ao が機能します。
だから、これは私の問題であり、何が原因なのかわかりません。私が言ったように、別のシェーダーに同じコードがあり、それが機能します。
これは、OpenGL ES 2.0 用の PowerVR エミュレーターで実行されます。GPU は nVidia GT220 です。また、非効率的なものなど、私のコードの他の間違いも遠慮なく指摘してください。必要に応じて、完全なフラグメント シェーダー コードを投稿します。長文すみません:P
解決した
うわー、原因がそんなにばかげていたとは信じられませんが、私はそれを完全に見逃していました. 基本的に、その特定のモデルのキューブマップをロードするのを忘れていたため、シェーダーに送信されませんでした。それでも、そもそもどうやって何かをサンプリングしたのでしょうか? つまり、それは別々に機能していたので、テクスチャ ユニットは何をサンプリングしたのでしょうか? 前の処理でキャッシュに残ったキューブマップ?