2017-05-02 2 views
0

MIS À JOUR J'essaye de dessiner la texture avec OpenGL ES3 et a utilisé le dessin instancié pour mon application de dessin. Ceci est mon vertex shaderAprès l'appel glLinkProgram l'application se bloque

#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); 
} 

et voici mon 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); 
} 

Lorsque j'ai créé le programme, attaché shaders et essayer de créer un lien vers le programme, l'application est en ligne se fige glLinkProgram. Les shaders et le programme ont un identifiant normal.

Ce travail normal sur certains appareils (sony xperia Z -android 5.0, smasung s7 bord android 7, Nexus 5x - android 7, Nexus 6p - android 7) mais cela ne fonctionne pas sur d'autres parties de dispositifs (motX- android 5.1, smasung s5 android 6.0). Tous les appareils ont une version Android supérieure à 5.0, et dans le code j'ai vérifié pour opengl ES3 supportant.

Y a-t-il une raison à cela? Est-ce de l'appareil (comment le vérifier)? ou ai-je fait quelque chose de mal? Je suis passé des données à instanceBuffer avec cette façon:

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); 

utilisé +8 décalages parce que les données struct lu des éléments avec la taille de vec4 (de 16 octets)

Quand j'écris mon struct avec un seul vec4:

struct Data { 
    vec4 posAndScale; 
}; 

et transmettre des données:

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

Cela fonctionne sur tous les appareils, Mais quand j'ai ajouté un plus vec4:

struct Data { 
    vec4 posAndScale; 
    vec4 color; 
}; 

et transmettre des données

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); 

app pas le gel, mais rien ne se passe lorsque je tente de dessiner. Il semble que sur certains appareils, std140 fonctionne différemment ou que les données ne soient pas transmises au shader quand on écrit struct avec 2 vec4-s

+0

Y at-il un espace avant #version? Cela peut causer des erreurs sur certains appareils ... – andras

+0

Non, il n'y a pas d'espaces redondants quelque part –

+0

Qu'est-ce qui est réellement suspendu? Vous mentionnez à la fois glLinkProgram, mais aussi instanceBuffer.putFloat, mais probablement votre application ne devrait même pas aller aussi loin que l'instanceBuffer.putFloat si le programme n'a pas réussi à lier ... – solidpixel

Répondre

0

Ok, j'ai trouvé une solution. Ce travail normalement depuis opengl es versionl 3.1. Je pense que la version 3.0 ne supporte pas les données struct qui contiennent un élément float ou int.

+0

Un lien freez sur le lien indique l'utilisation d'un objet opengl qui n'a pas été créé avec succès ou est dans un état _invalid_. Avez-vous vérifié la compilation et d'autres erreurs pour tous les objets que vous avez créés? –

+0

Oui j'ai vérifié, il n'y a pas d'erreurs, son get à glLinkProgram ligne normale et aucune erreur. –

0

J'ai rencontré le même problème. Le Nexus 7 (2013) gelait quand j'ai appelé gllinkprogram(). J'ai trouvé que cela n'arrivait que lorsque j'avais des 'déclarations' dans mon shader. J'ai été capable de changer mes deux «if statements» en «opérateurs conditionnels» et cela a fonctionné.

E.g. (cond)? cond1: cond2