Samsung Galaxy Note 4デバイスでGLSL(300 es)シェーダプログラムを実行すると、非常に奇妙な視覚的なバグが発生しています。それはGLES2.0とGLES3.0をサポートするQuallcom Adreno(TM)420gpuを持っています。私たちはBRDF、シャドウマップなどのようなエフェクトをレンダリングするために使用する非常に複雑なシェーダプログラムを持っています。GLSLプログラムが正しく実行されない
上記のデバイスは、シャドウをまったく表示しません)。シェーディングの振る舞いも間違っています。 PC(のPowerVR GLESエミュレータ)、iOSの(6-7)、サムスンギャラクシーA7、サムスンギャラクシーS6、MeizuのM5、小米科技4A、モトローラネクサス6
の場合: 同じプログラムでは、以下のハードウェア上で正常に動作します
bool InRange(float val)
{
return val >= 0.0 && val <= 1.0;
}
float shadowFunc (sampler2D shadowMap, vec4 lightClipPosition, float bias)
{
vec3 shadowMapCoords = lightClipPosition.xyz/lightClipPosition.w;
shadowMapCoords = (shadowMapCoords + 1.0)/2.0;
//...some more code
if (!InRange (shadowMapCoords.z)
|| !InRange (shadowMapCoords.x)
|| !InRange (shadowMapCoords.y))
return 1.0;
//...some more code
}
IF()ステートメントを
に3回の呼び出しで:私たちは、このコードのチャンクを持っていた影INRANGE()
方法は、それを修正
if ((shadowMapCoords.x < 0.0 || shadowMapCoords.x > 1.0 || shadowMapCoords.y < 0.0 || shadowMapCoords.y > 1.0 || shadowMapCoords.z < 0.0 || shadowMapCoords.z > 1.0))
{
return 1.0;
}
にall.Changingで表示しないように影を引き起こしていました。
シェーダのコンパイル時または実行時にエラーは発生しません。
これは、GLSLコンパイラまたはドライバによって決定される一種のルールですか?シェーダ本体の関数実行量に制限はありますか?私は、シェイダーが非常に多くの関数呼び出しを使用していることを完全に認識しています。 (まだ最適化段階には達していませんでした)。しかし、これらのシェーダはすべて、私がテストした他のすべての携帯電話で正常に動作します。だから、本当の問題が私のコードにあるのかどうかわからないのです。
シェーダで見つかったすべてのメソッドをシェーダの「メイン」関数にインライン化して、すべての要素をこのデバイスで正しく動作させる必要がありますか?
それとも、ドライバのバグですか?