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 :

Problème plantage avec GLBlendEquation


Sujet :

OpenGL

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Par défaut Problème plantage avec GLBlendEquation
    Salut à toutes les bonnes âmes qui voudront bien nous aider dans notre galère !

    Nous sommes en train de créer un programme qui dans l'ensemble fonctionne bien (nous utilisons glut.h, glew.h et wglew.h, notre carte est une NVIDIA GeForce 6800). Notre but étant de créer la différence de deux images (pixel à pixel) dans le but de calculer un écart, nous avons pensé les appliquer en tant que textures et utiliser les fonctions glBlendFunc et glBlendEquation pour calculer la différence ; mais voilà, lors de l'introduction de cette dernière notre programme plante (il compile normalement, sous Visual C++) avec un message d'erreur dépourvu de toute explication (généré par Windows). Cette fonction est bien présente dans glew.h, dont nous avons les dll.
    De plus le plantage a lieu que ce soit avec l'argument GL_FUNC_SUBTRACT ou tout autre (GL_FUNC_ADD).
    Nous avons activé le glEnable(GL_BLEND); comme il se doit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glBlendFunc(GL_SRC_COLOR,GL_ONE_MINUS_DST_COLOR);
    glBlendEquation(GL_FUNC_SUBTRACT);  //PROBLEME ICI
    Si quelqu'un a ne serait-ce qu'une toute petite idée de l'origine de cet estropiant problème, il obtiendra le salut de notre part...

    Si quelqu'un avait également une solution alternative pour réaliser la différence de deux images en OpenGL, il recevrait aussi notre bénédiction !

    Merci d'avance !

  2. #2
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour.
    Votre problème vient peut être du fait que:
    - soit votre GPU/Pilote ne supporte pas l'extension GL_ARB_imaging nécessaire pour glBlendEquation.
    - soit votre librairie d'extensions ne charge pas correctement glBlendEquation (qui est = NULL)

    Pour commencer, vérifier si la nVidia 6800 supporte GL_ARB_imaging, mettez vos pilotes à jour, et si ça marche pas, alors tant pis ! Il y'a un autre moyen (y'a aussi les shaders) qui consiste à utiliser le multi-texturing :
    configurez vos unités de texturing de sorte que le 3ième étage retourne (étage1-étage2).

    Bonne chance.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il est probable que tu aies à exécuter glBlendEquation en tant qu'extension (par contre je ne sais pas à partir de quelle version d'OpenGL il a été introduit en tant que fonctionnalité de base).

    Donc essaye plutôt ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // On commence par vérifier le support de l'extension
    bool Supported = glewIsSupported("GL_ARB_imaging");
     
    // On appelle la fonction, avec le préfixe EXT puisqu'il s'agit de l'extension
    if (Supported)
        glBlendEquationEXT(GL_FUNC_SUBTRACT);

  4. #4
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Par défaut
    Nous avons testé la carte : effectivement, elle ne supporte pas gl_ARB_imagin... donc on va essayer de mettre à jour les pilotes... en tous cas merci d'avoir répondu aussi vite ! et on va aussi se renseigner sur le multi-texturing, domaine assez obscur pour nous jusque là. On vous tient au courant !

  5. #5
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Par défaut
    Euh... en fait on a OpenGL 2 ; ce n'est pas incompatible avec l'extension ARB ??

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Nous avons testé la carte : effectivement, elle ne supporte pas gl_ARB_imagin...
    OpenGL extension viewer indique que cette extension est en fait supportée depuis les TNT, difficile de croire que ta GeForce 6800 ne la supporte pas. Tu ne t'es pas trompé dans la syntaxe (c'est "GL_ARB_imaging") ?

    Sinon la mise à jour des pilotes règlera peut-être le problème, si vous aviez des pilotes préhistoriques

  7. #7
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Par défaut
    Bonjour,

    Le problème n'est toujours pas réglé...!
    Quelques nouvelles néanmoins :

    En essayant le code proposé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // On commence par vérifier le support de l'extension
    bool Supported = glewIsSupported("GL_ARB_imaging");
     
    // On appelle la fonction, avec le préfixe EXT puisqu'il s'agit de l'extension
    if (Supported)
        glBlendEquationEXT(GL_FUNC_SUBTRACT);
    la condition est fausse (glBlendEquationEXT() n'est pas exécutée).
    Ce qui nous a amené à penser que la carte ne supporte pas l'extension...

    Et pourtant, en se débrouillant autrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf((char*)glGetString(GL_EXTENSIONS));
    l'extention GL_ARB_imaging apparait dans la liste d'extension, ce qui supposerait alors que notre carte supporte l'extension en fait... à ne rien y comprendre !

    A quel test faut-il se fier? Si l'extension est supportée, d'où provient l'erreur obtenue avec la fonction glBlendEquation()?
    Si c'est, comme cela a été proposé, la librairie d'extensions qui ne la charge pas correctement, il y a-t-il une solution pour y remédier?

    Sinon, on a essayé une autre piste : les multitextures avec les shaders (GLSL... encore tout un monde !).
    Là encore, on patauge (enfin, on apprend quoi !). Une petite question au passage : on a dans notre programme principal une texture (disons nomée : GLuint text
    On veut alors l'utiliser en "uniform variable" dans un fragment shader.
    Comment utiliser les fonctions glGetUniformLocation() et glUniform()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            // Programme principal
            GLuint text;
            ... // texture chargée
    	loc = glGetUniformLocation(p,??); // p = glCreateProgram();
    	glUniform??(text, ?????);
    dans le programme principal pour récupérer correctement la texture dans le shader?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // fragment shader
    uniform sampler2D text;
    void main()
    {...}
    Merci !

    Aymeric et Pierre, qui gardent le moral malgré tout !

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si glewIsSupported ne marche pas comme il faut, peut-être que glew est mal initialisé ? Parce que ça se saurait s'il était buggé

    Pour le code du shader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Programme principal
    GLuint text;
    ... // texture chargée
     
    loc = glGetUniformLocation(p, "text"); // p = glCreateProgram();
    glUniform1i(loc, 0);
    Le 0 envoyé au shader est en fait l'indice de l'unité de texture sur laquelle se trouve la texture à utiliser.

  9. #9
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Par défaut
    Bonjour,

    Le problème initial est résolu : on avait très bêtement oublié un petit glewInit(), c'est ballot !
    En fait, l'extention est bien supportée et la fonction glBlend Equation() marche ! En tous cas merci Laurent pour ton dévouement.
    Subsiste un problème avec cette fonction : lorsque l'on fait la différence (GL_FUNC_SUBTRACT), les résultats négatifs sont saturés à zéro... ce que l'on ne souhaite pas ! Comment contourner cela?

    Mais à priori on peut s'en sortir avec... les shaders !

    Bon, on rame encore mais continuons de chercher !
    Si les problèmes persistent, nous referons appel à l'aide de ce grandiose forum !
    Merci encore... et un petit "résolu" !

    Aymeric et Pierre, OpenGL addicts (not yet actually)

  10. #10
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 573
    Par défaut
    Citation Envoyé par Lhudel
    Subsiste un problème avec cette fonction : lorsque l'on fait la différence (GL_FUNC_SUBTRACT), les résultats négatifs sont saturés à zéro... ce que l'on ne souhaite pas ! Comment contourner cela?
    à priori je ne vois pas comment faie autrement que
    avec... les shaders !
    puisque logiquement les informations des pixels sont stockées sur l'intervale [0,1] pour chaque composante
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Que tu utilises un shader ou pas, de toute façon tes pixels en sortie ne pourront jamais avoir de composantes négatives. Il faudrait plutôt décaler toutes les valeurs de sorte qu'après soustraction le résultat soit toujours positif.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Par défaut
    Bonjour,
    j'ai exactement le même problème (même carte, même erreur sous glBendEquation).
    Ce post m'a permis de comprendre qu'il fallait que j'installe glew, ceci fait je teste le code suivant avec -lopengl32 -lgew32 -lglut32:

    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
     
    #include <windows.h>
    #include <stdio.h>
    #include <gl/glew.h>
    #include <gl/glut.h>
     
    int main(int argc, char **argv)
    {
    	glutInit(&argc, argv);
    	glutCreateWindow("GLEW Test");
     
    	GLenum err = glewInit();
    	if (GLEW_OK != err)
    	{
    	  fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
    	}
    	fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
     
    	if (glewIsSupported("GL_ARB_imaging"))
    		printf("Supporté\n");
    	else
    		printf("Non supporté\n");
     
     
    	glEnable(GL_BLEND);
    	glBlendFunc(GL_ONE, GL_ONE);
    	glBlendEquation(GL_MAX);
     
    	return 0;
    }
    Et je reçois comme erreur:
    undefined reference to `_imp____glewBlendEquation'

    A savoir que sans glBendEquation le résultat est:
    Status: Using GLEW 1.5.0
    Supporté


    Oh et j'ai mis mes drivers à jours.

    Voilà donc si vous avez la moindre idée je suis preneur !
    En vous remerciant d'avance

    PS: Pourquoi avoir besoin de glew si glext l'intègre ?
    j'utilise Eclipse à l'édition et je ne comprend pas pourquoi dans tout les cas il ne me marque pas la fonction en gras (comme présente).


    EDIT:
    Bon je viens de penser que la solution précédente étant Résolue, ce n'était peut être pas la meilleur idée de continué dessus.

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

Discussions similaires

  1. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20
  2. problèmes bizarres avec jdbc
    Par jaimepasteevy dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 12/12/2003, 12h00
  3. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02
  4. Pb de configuration postgre -> plantage avec DB error
    Par liv dans le forum Installation
    Réponses: 6
    Dernier message: 05/11/2003, 18h07
  5. problème JSP avec JBuilder et Weblogic 7
    Par viny dans le forum JBuilder
    Réponses: 2
    Dernier message: 24/04/2003, 08h07

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