2017-05-02 20 views
0

更新済み OpenGL ES3でテクスチャを描画しようとしていて、描画アプリケーションでインスタンス化された描画を使用しています。これは私の頂点シェーダ呼び出し後glLinkProgramアプリケーションがフリーズする

#version 300 es 
precision highp float; 

uniform mat3 u_Matrix; 

in vec2 Position; 
in vec2 TexPosition; 

struct Data { 
    vec2 pos; 
    vec2 scale; 
    uint color; 
    float rotation; 
}; 

layout(std140) uniform InstanceData { 
    Data data[256]; 
}; 

out vec4 v_Color; 
out vec2 v_TexPosition; 

void main() { 
vec2 endPos = Position * data[gl_InstanceID].scale; 
if (data[gl_InstanceID].rotation != 0.0) { 
    float cos = cos(data[gl_InstanceID].rotation); 
    float sin = sin(data[gl_InstanceID].rotation); 


    endPos = vec2(endPos.x * cos - endPos.y * sin, endPos.x * sin + 

    endPos.y * cos) + data[gl_InstanceID].pos; 
    } else { 
     endPos = endPos + data[gl_InstanceID].pos; 
    } 

    uint fColor = data[gl_InstanceID].color; 
    v_Color.r = float((fColor & 0x00FF0000U) >> 16)/255.0; 
    v_Color.g = float((fColor & 0x0000FF00U) >> 8)/255.0; 
    v_Color.b = float(fColor & 0x000000FFU)/255.0; 
    v_Color.a = float((fColor & 0xFF000000U) >> 24)/255.0; 

    v_TexPosition = TexPosition; 
    gl_Position = vec4(u_Matrix * vec3(endPos, 1.0), 1.0); 
} 

であると私はプログラム、付属のシェーダを作成し、プログラムにリンクしようとすると、これは私のfragment_shader

#version 300 es 
precision highp float; 

in vec2 v_TexPosition; 
in vec4 v_Color; 

uniform sampler2D u_Texture2D; 

out vec4 fragColor; 

void main() { 
    vec4 color = texture(u_Texture2D, v_TexPosition); 
    fragColor = vec4(v_Color.rgb, color.a * v_Color.a); 
} 

で、アプリがラインglLinkProgramにフリーズです。シェイダーとプログラムは通常のIDを持ちます。

一部のデバイス(sony xperia Z -android 5.0、smasung s7 edge android 7、nexus 5x - android 7、nexus 6p - android 7)では正常ですが、これはデバイスの他の部分(motX- android 5.1、smasung s5 android 6.0)。すべてのデバイスはアンドロイドバージョンが5.0以上で、コードではopengl ES3がサポートされているかどうかを確認しました。

これには何らかの理由がありますか?それはデバイスからですか(それを確認する方法)?または私は間違った何かをしましたか? 私はこの方法でinstanceBufferにデータを渡されています。structデータはvec4サイズ(16バイト)を持つ要素を読んでいるので8つのオフセットを使用

instanceBuffer.putFloat(posX); 
instanceBuffer.putFloat(posY); 
instanceBuffer.putFloat(scaleX); 
instanceBuffer.putFloat(scaleY); 
instanceBuffer.putInt(colorARGB); 
instanceBuffer.putFloat((float) Math.toRadians(rotate)); 
instanceBuffer.position(instanceBuffer.position() + 8); 

私は一つだけvec4と私の構造体を作成した場合:

struct Data { 
    vec4 posAndScale; 
}; 

とデータを渡す:

instanceBuffer.putFloat(posX); 
instanceBuffer.putFloat(posY); 
instanceBuffer.putFloat(scaleX); 
instanceBuffer.putFloat(scaleY); 

これは、すべてのデバイス上で動作し、 しかし、私は1つ以上vec4追加する場合:

struct Data { 
    vec4 posAndScale; 
    vec4 color; 
}; 

と渡すデータ

instanceBuffer.putFloat(posX); 
instanceBuffer.putFloat(posY); 
instanceBuffer.putFloat(scaleX); 
instanceBuffer.putFloat(scaleY); 
instanceBuffer.putFloat(color.r); 
instanceBuffer.putFloat(color.g); 
instanceBuffer.putFloat(color.b); 
instanceBuffer.putFloat(color.a); 

アプリではないフリーズするが、私は描画しようとすると、何も起こりませんでした。それはいくつかのデバイスのようですstd140別の方法で動作するようなデータまたはシェーダに2 vec4-sとstructを書いたときに渡されないようなデータ

+0

#versionの前に空白がありますか?一部のデバイスでエラーが発生する可能性があります... – andras

+0

いいえ、どこかに余分なスペースがありません –

+0

実際に何が掛かっていますか?あなたはglLinkProgramとかinstanceBuffer.putFloatの両方に言及していますが、プログラムがリンクに失敗した場合でも、instanceBuffer.putFloatまでは到達しないはずです... – solidpixel

答えて

0

私はいくつかの解決策を見つけました。この作業は通常、バージョン3.1以降のopenglです。私は3.0バージョンはfloatまたはint要素を含む構造体データをサポートしていないと思います。

+0

リンクフリーズは、正常に作成されなかった、または_invalid_状態にあるOpenGLオブジェクトの使用を示します。あなたが作成したすべてのオブジェクトのコンパイルやその他のエラーをチェックしましたか? –

+0

はい私はチェックしましたが、エラーはありません。glLinkProgram行は正常ですが、エラーはありません。 –

0

同じ問題が発生しました。 gllinkprogram()を呼び出すと、Nexus 7(2013)がフリーズしていました。私は、これが私のシェイダーに「if文」があったときにのみ起こったことがわかりました。私は「if文」と「条件付き演算子」の両方を変更することができました。

など。 (cond)? cond1:cond2

関連する問題