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 :

[JOGL] Problème de multi-thread avec les VBO


Sujet :

OpenGL

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Par défaut [JOGL] Problème de multi-thread avec les VBO
    Bonjour,
    J'utilise JOGL (java se7)
    J'arrive à charger correctement un objet à partir d'un .obj et de l'afficher avec les VBO. Tout marche bien jusque là avec un affichage à l'aide de fragment et vertex shader.
    Maintenant, je cherche à charger plusieurs objets en même temps, l'ennui, c'est que j'ai besoin du contexte OpenGL. Lorsque j'utilise du multi-thread pour charger mes fichiers .obj, je vérifie qu'il soient correctement chargés avec une variable qui passe à true à la fin de la méthode d'importation.

    Le problème apparait uniquement lorsque je veux dessiner mon objet, sur ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gl.getGLx().glEnableVertexAttribArray(indexNormal);
    gl.getGLx().glVertexAttribPointer(indexNormal, 3, GL.GL_FLOAT, false, strideVertexNormal, 0);
    il me met
    javax.media.opengl.GLException: array vertex_buffer_object must be enabled to call this method
    Je précise que c'est juste le lancement dans un autre thread qui déclenche cette erreur, car si je lance l'importation dans un autre thread et que j'attend que cette importation soit finie, j'ai la même erreur.

    Voilà les deux méthodes d'importation :
    Mode multi-thread qui déclenche l'exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    voiture = new ObjectVBO();
    ThreadImport ti = new ThreadImport(voiture, "./models/", "audi", gl);
    ti.start();
    while(ti.isAlive()){Thread.currentThread().sleep(50);};
    Mode mono-thread qui fonctionne sans erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    voiture = new ObjectVBO();
    ThreadImport ti = new ThreadImport(voiture, "./models/", "audi", gl);
    ti.run(); //Lancement dans le même thread
    Merci de votre attention

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 032
    Billets dans le blog
    12
    Par défaut
    En multithread, il faut normalement un contexte OpenGL par thread, donc généralement on crée un contexte principal puis un contexte par thread, qui partage ses données avec le contexte principal.
    Je pense que ton problème doit se situer à ce niveau.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Par défaut
    Merci de ta réponse,
    je suis en train de regarder comment créer un contexte openGL pour en créer un par nouveau thread.
    Avec JOGL il y a la classe GLContext qui permet de le faire je crois, je posterais la réponse dès que j'aurais trouvé comment faire.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Par défaut
    Je me rapproche de la solution, cependant il me retourne une exception que je ne sais pas solver.
    J'utilise cette ligne de code que j'ai trouvé dans la javadoc de JOGL dans un nouveau thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GLContext glc = GLDrawableFactory.getDesktopFactory().createExternalGLContext();
    cependant cette ligne me renvoit cette exception :
    javax.media.opengl.GLException: Error: attempted to make an external GLContext without a context current, werr 0
    at jogamp.opengl.windows.wgl.WindowsExternalWGLContext.create(WindowsExternalWGLContext.java:79)
    at jogamp.opengl.windows.wgl.WindowsWGLDrawableFactory.createExternalGLContextImpl(WindowsWGLDrawableFactory.java:588)
    at jogamp.opengl.GLDrawableFactoryImpl.createExternalGLContext(GLDrawableFactoryImpl.java:446)
    at models.object.ThreadImport.run(ThreadImport.java:68)
    at java.lang.Thread.run(Unknown Source)
    Je cherche toujours pour résoudre cette erreur et ainsi avoir un nouveau context openGL mais si vous savez pourquoi j'ai cette exception, merci de me le dire.

    [EDIT]
    Je viens de trouver l'erreur, en fait, il faut créer le context OpenGL dans un thread ou un context OpenGL est déjà créé. Je le créé donc dans le constructeur avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GLDrawableFactory.initSingleton();
    glc = GLDrawableFactory.getDesktopFactory().createExternalGLContext();//avec GLContext glc
    et je récupère mon context dans le nouveau thread, je fais : puis je récupère mon objet GL2 et je fais ce que j'ai à faire.
    L'ennuis c'est que le probleme revient au probleme du début, il me retourne la même excpetion, donc :
    javax.media.opengl.GLException: array vertex_buffer_object must be enabled to call this method
    at jogamp.opengl.gl4.GL4bcImpl.checkBufferObject(GL4bcImpl.java:34324)
    at jogamp.opengl.gl4.GL4bcImpl.checkArrayVBOEnabled(GL4bcImpl.java:34351)
    at jogamp.opengl.gl4.GL4bcImpl.glVertexAttribPointer(GL4bcImpl.java:32871)
    at models.object.ObjectVBO.draw(ObjectVBO.java:342)

  5. #5
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 032
    Billets dans le blog
    12
    Par défaut
    Le problème c'est que je n'ai jamais fait de JOGL, mais voilà comment, conceptuellement, il faudrait faire (c'est aussi comme ça qu'on fait en C/C++)

    • Création du GLContext principal lié à la fenêtre/panel/... du rendu, sur le thread principal
    • Pour chaque nouveau thread :
      • Dans le contexte du nouveau thread, activer le GLContext principal
      • Création du GLContext du nouveau thread, en lui faisant partager ses ressources avec le GLContext principal
      • Désactivation du GLContext principal
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/06/2011, 07h14
  2. [débutant] problème avec les VBO
    Par TNT89 dans le forum OpenGL
    Réponses: 5
    Dernier message: 29/12/2009, 19h24
  3. Multi texture dans avec les VBO
    Par yvesall dans le forum OpenGL
    Réponses: 5
    Dernier message: 28/04/2009, 01h05
  4. [Avis aux pros !] Problèmes de la VCL avec les threads
    Par benj63 dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/02/2006, 22h38

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