2011-10-02 4 views
3

J'essaie d'implémenter des shaders à partir de tutoriels en ligne (lighthouse3d.com) dans mon moteur OpenGL ES 2.0.GLSL ES variables locales crash?

Le problème est que, pour une raison quelconque, toutes les variables déclarées dans la portée de main() provoquent l'échec du shader entier. par exemple, cela ne fonctionne pas:

void main(){ 
    vec4 color;  
    gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0); 
} 

mais cela fonctionne parfaitement:

void main(){ 
    //vec4 color;  
    gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0); 
} 

Même chose avec mes vertex shaders. (EDIT: NVM, ne semble se produire avec Shaders fragment) La seule façon d'utiliser tout type de valeur non constante est d'utiliser des attributs, varyings, uniformes, etc., par exemple, cela fonctionne comme on peut s'y attendre:

uniform sampler2D texture; 
varying lowp vec4 fragcol; 
varying lowp vec2 texco; 

void main(){ 
    gl_FragColor = fragcol * texture2D(texture, texco); 
} 

en outre, J'ai beaucoup de mal à essayer de trouver de la documentation ou des ressources spécifiquement sur GLSL ES (ou quelle que soit l'appellation de cette version). Tout ce que j'ai pu trouver est la suivante: http://old.siggraph.org/publications/2006cn/course16/KhronosSpecs/ESLanguageSpec1.10.11.pdf

C'est tout ce que je pouvais trouver en rapport avec des déclarations de variables:

[snip]There are no default types. All variable and function declarations must have a declared type, and optionally qualifiers. A variable is declared by specifying its type followed by one or more names separated by commas.[snip]

Et c'est exactement ce que je faisais:

type déclaré: vec4

suivi d'un ou de plusieurs noms: couleur;

vec4 color 

Je suis désemparés

EDIT: GLES20.glGetError() donne l'erreur 1282

+1

Quel compilateur/implémentation utilisez-vous? –

+0

oups! Je savais que j'avais oublié quelque chose. Je développe sur Android en utilisant le kit de développement android .. Je devrais mettre à jour mon poste – AlexRamallo

Répondre

9

GLSL ES diffère de GLSL traditionnelle en ce qu'elle exige des modificateurs de précision afin de spécifier un complet type. Avez-vous essayé, par exemple .:

void main(){ 
    lowp vec4 color;  
    gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0); 
} 

Vous pouvez également jeter quelque chose comme ça dans le haut d'un fichier source:

precision highp float; 

Pour définir la précision par défaut, de sorte que vous pouvez omettre plus tard. Pour obtenir des informations détaillées sur une erreur de compilation de GLSL, vous pouvez utiliser glGetProgramInfoLog (avec l'assistance de glGetProgramiv). La plupart des implémentations de GL renvoient une erreur significative et un numéro de ligne. Je suis malheureusement en retard avec Java, mais en C vous pourriez faire:

glCompileShader(shader); 

    // check whether compilation was successful; if not 
    // then dump the log to the console 
    GLint status; 
    glGetShaderiv(shader, GL_COMPILE_STATUS, &status); 
    if(!status) 
    { 
     GLint logLength; 
     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength); 
     if (logLength > 0) 
     { 
      GLchar *log = (GLchar *)malloc(logLength); 
      glGetShaderInfoLog(shader, logLength, &logLength, log); 
      printf("Shader compile log:\n%s", log); 
      free(log); 
     } 
    } 
+0

"[Shader Error] Erreur de lien: Fragment shader n'a pas été compilé avec succès." > _> pas très utile ** EDIT: ** Les logs étaient un échec donc j'ai essayé d'ajouter le modificateur de précision et ça a marché! Je pense que cette information aurait dû être plus facile à trouver.Merci pour l'aide – AlexRamallo

+0

@AlexRamallo Il est plus facile à trouver si vous apprenez à partir des ressources OpenGL ES et ne pas essayer de copier les exemples de bureau GL 1-par-1, car cela ne fonctionne évidemment pas toujours. –