2017-03-03 7 views
0

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()ステートメントを

INRANGE()

に3回の呼び出しで:私たちは、このコードのチャンクを持っていた影

方法は、それを修正

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コンパイラまたはドライバによって決定される一種のルールですか?シェーダ本体の関数実行量に制限はありますか?私は、シェイダーが非常に多くの関数呼び出しを使用していることを完全に認識しています。 (まだ最適化段階には達していませんでした)。しかし、これらのシェーダはすべて、私がテストした他のすべての携帯電話で正常に動作します。だから、本当の問題が私のコードにあるのかどうかわからないのです。

シェーダで見つかったすべてのメソッドをシェーダの「メイン」関数にインライン化して、すべての要素をこのデバイスで正しく動作させる必要がありますか?

それとも、ドライバのバグですか?

答えて

0

はい、まっすぐなドライババグのようです。それは正常に動作するはずです。

これは、このようなコードを書いてはいけないと言っています。シェイダーコアがブランチのボリュームで泣いてしまいます。

理想的には、値を0と1の間にクランプしてシェーダを実行するだけです。アルゴリズムの境界条件を正しく設計すれば、おそらく問題なく見えるでしょうし、シャドーイングコードを実行するだけでは、早期終了より安くなることがよくあります。

if (any(greaterThan(shadowMapCoords, 1.0)) || any(lessThan(shadowMapCoords, 0.0))) { ... } 
:あなたは本当に条件付きコードを使用する必要がある場合

、支援彼らはしばしば、ハードウェアによって支えられて、ベクトル組み込み関数を使用するようにしてください

関連する問題