IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

GL_INVALID_OPERATION en utilisant pow [GLSL]


Sujet :

OpenGL

  1. #1
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut GL_INVALID_OPERATION en utilisant pow
    Bonjour,

    Ça fait maintenant plusieurs jours que je m'arrache les cheveux sur un message d'erreur que je reçois provenant de mon fragment Shader supposé prendre en charge une lumière.

    Voici mon fragment shader complet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #version 330 core
     
    struct LightSource
    {
    	unsigned int mode;
    	vec3 position;
    	vec3 ambient;
    	vec3 diffuse;
    	vec3 specular;
    };
     
    struct Material
    {
    	float ambient;
    	float diffuse;
    	float specular;
    	float shininess;
    };
     
    uniform sampler2D tex; // Sampler2D pour l'affichage de la texture
    uniform LightSource lightSource; // Une lumiere
    uniform vec3 cameraPosition;
     
    // Valeurs interpolées à partir du vertex shader
    in vec2 UV; 
     
    layout(location = 0) out vec3 color;
     
    in vec3 vertexPositionWorldspace;
    in vec3 vertexNormalWorldspace;
     
    void main()
    {
    	// Pour l'instant mes matériaux refettent la lumière au max
    	Material material;
    	material.ambient = 1.;
    	material.diffuse =  1.;
    	material.specular = 1.;
    	material.shininess = 30.;
     
    	// Calcul de la composante ambient de la lumière
    	vec3 ambient = material.ambient * lightSource.ambient;
     
    	vec3 L = normalize(lightSource.position - vertexPositionWorldspace); // Light direction
    	vec3 V = normalize(cameraPosition - vertexPositionWorldspace);       // View direction
     
    	float LdotN =  max(0, dot(L,vertexNormalWorldspace));
     
    	// Calcul de la composante diffuse de la lumière
    	float diffuse = material.diffuse * LdotN;
     
    	float specular = 0;
    	if(LdotN > 0.0)
    	{
    		vec3 H = normalize(L + V); //Halfway
    		specular = material.specular * pow(max(0, dot(H, vertexNormalWorldspace)), material.shininess);
    	}
     
    	float lightIntensity = ambient + diffuse + specular;
     
    	color = texture2D(tex, UV.st).rgb * lightIntensity;
    }
    Et voici précisément le bout de code qui pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pow(max(0, dot(H, vertexNormalWorldspace)), material.shininess)
    Des que ce bout de code est activé je reçoit un message me disant que :
    An internal opengl call failed in Shader.cpp (494) : GL_INVALID_OPERATION, the specified operation is not allowed in the current state

    Et là je boque... j'ai beau lire relire et re relire, je ne voit pas ce qui cloche. La compilation se passe tres bien, c'est des que l'objet s'affiche que je me fait insulter.

    Quelqu'un a une idée ?

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 145
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    L'erreur n'est pas liée au shader, mais aux commandes OpenGL que vous faites, dans votre programme C/C++ ou autre.
    Les erreurs de GLSL (de shader), sont rapporté avec glGetShader() et c'est à vous de les afficher vous même. Ici, c'est l'erreur provenant d'un glGetError() indiquant qu'une des commandes OpenGL précédente est invalide.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    OK, donc si je comprend bien le shader fait un test avec glGetError() et me retourne le résultat. Chose que je peux faire moi même dans la boucle principale mais après tout... si le shader le fait ...

    Par contre je ne comprend pas pourquoi en commentant cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pow(max(0, dot(H, vertexNormalWorldspace)), material.shininess)
    d'un coup mes commandes openGL ne posent pas de problème.

    Ce qui me perturbe c'est qu'avec glGetError(), on a pas beaucoup d'infos et apparemment il n'y a pas moyen d 'avoir de messages plus précis et qu'une "commande openGL invalide" c'est super vague.

    Je vais tout de même voir du coté de glGetShaderiv() voir si j'ai quelque chose qui ressort... on ne sait jamais.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 145
    Billets dans le blog
    150
    Par défaut
    Non, OpenGL ne fait pas d'appel implicite à glGetError().
    Il faut appeler glGetError() en théorie, après chaque commande OpenGL, permettant ainsi de savoir laquelle a fait une erreur.
    Sinon, la méthode moderne, c'est d'utiliser l'extension KHR_debug.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Ah bah déjà j'ai bien avancer grâce a ton lien car il m'a rappeler que je faisait appel à la SFML pour certaines choses et du coup c'est la bibliothèque qui à tester glGetError(). Ça résout déjà la question sur la provenance du message.

    Du coup je sait a quelle ligne cette erreur à été détectée. Ça vas bien m'aider.

    Mais je vais tout de même voir pour créer un contexte de déboguage car mon programme risque de devenir assez conséquent et ça sera surement très utile.

    J'ai de nouvelles pistes... je vous tiens au courant dès que je trouve l'erreur.

  6. #6
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Bug trouvé... en fait c'était une variable uniform cameraPosition que je passait en tant que vec4 depuis le c++ alors qu'il était annoncé en tant que vec3 dans le shader.

    Alors maintenant... pourquoi cette erreur n’apparaissait que quand j’exécutais la fonction pow... Mystère

    En tout cas merci pour ton aide. J'aurais au moins un peu appris à deboguer l'openGL

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 145
    Billets dans le blog
    150
    Par défaut
    La variable n'étant pas utilisé, certaine compilateur de shader (suivant le pilote graphique) tende à simplement supprimer la variable qui n'est absolument pas utilisée.
    J'en avais fait une entrée dans la FAQ, tellement ce souci m'épuise .
    Du coup, l'erreur ne se produit pas, car simplement vous tombez dans un autre cas (celui de l'uniform non trouvé). Mais, lorsque vous réactivez le pow() vous tombez sur le cas de non concordance des types, qui est une erreur bien différente.

    Bien joué pour avoir trouvé le soucis.
    Bonne continuation
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Le pire c'est que j'avais lu ce comportement sur certains forums mais j'avais immédiatement ranger cette info dans les "ca n'arrive qu'aux autres".

    Déjà que déboguer du GLSL c'est pas simple mais la ça arrange pas les choses.

    En tout cas merci pour ton aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OpenGL/GLSL] Utilisation Normal Map
    Par AuraHxC dans le forum OpenGL
    Réponses: 3
    Dernier message: 31/01/2010, 11h45
  2. Réponses: 4
    Dernier message: 02/08/2009, 15h42
  3. [GLSL]utiliser des textures dans un vertex shader
    Par delfare dans le forum OpenGL
    Réponses: 14
    Dernier message: 04/10/2007, 10h31
  4. utilisation GLSL -- HeLP!
    Par filoo dans le forum OpenGL
    Réponses: 27
    Dernier message: 05/07/2007, 18h12
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo