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 OpenGL : plus aucun affichage lorsque je tente d'utiliser les variables glsl


Sujet :

OpenGL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 35
    Points : 38
    Points
    38
    Par défaut Problème OpenGL : plus aucun affichage lorsque je tente d'utiliser les variables glsl
    Bonjour tout le monde, je suis nouveau sur le site,
    J'ai décidé de me mettre à OpenGL; et comme toutes les fonctionnalités du pipeline fixe sont dépréciées, je me suis mis directement à apprendre le fonctionnement du pipeline programmable.
    J'ai commencé en douceur... un carré blanc.
    Voici mon fragment shader :
    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
    // debut fragment shader :
     
    #version 130
     
    precision highp float;
     
    in vec4 vertexColour;
    out vec4 pixelColour;
     
    void main()
      {
      pixelColour=vertexColour;
      }
     
    // fin fragment shader.
    Et voici mon vertex shader :
    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
    // debut vertex shader :
     
    #version 130
     
     
    in vec2 vertexPosition;
    out vec4 vertexColour;
     
    void main()
      {
      vertexColour=vec4(float(1),float(1),float(1),0f);
      gl_Position=vec4(vertexPosition,float(0),float(1));
      }
     
    // fin vertex shader.
    Jusque là, rien de folichon, on est d'accord. Voici un bout de mon code C++ pour que vous puissiez visualiser mes appels aux fonctions OpenGL.
    J'utilise les bibliothèques glew (pour les extensions) et glfw (pour la gestion du fenêtrage)
    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
    // glew et glfw initialises, contexte OpenGL cree.
    // shaders deja charges, compiles et lies dans le programme nomme shaderProgramId.
    // ...
     
    // initialisation :
    glEnable(GL_DEPTH_TEST);
      glClearColor(0.0f,0.0f,0.0f,1.0f);
     
      unsigned int vaoId,
                   vboIds[2];
      glGenVertexArrays(1,&vaoId);// initialisation des vertex array objects
      glBindVertexArray(vaoId);
      glGenBuffers(2,vboIds);// initialisation des vertex buffer objects
      glBindBuffer(GL_ARRAY_BUFFER,vboIds[0]);
      const float vertexArray[]=
                    {
                    -0.9f,-0.5f,
                    -0.4f,-0.5f,
                    -0.4f,0.0f,
                    -0.9f,0.0f
                    };
      glBufferData(GL_ARRAY_BUFFER,sizeof(vertexArray),vertexArray,GL_STATIC_DRAW);// passage des données de sommets dans le buffer
      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,vboIds[1]);
      const char indexArray[]=
                   {
                   0,1,2,3
                   };
      glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indexArray),indexArray,GL_STATIC_DRAW);// passage des indices des sommets dans le buffer
     
    /* gl_Vertex deprecated, recuperation des positions du sommet courant par l'attribut vec2 vertexPosition/*
      const unsigned int posLocation=glGetAttribLocation(shaderProgramId,"vertexPosition");
      glEnableVertexAttribArray(posLocation);
    glVertexAttribPointer(posLocation,2,GL_FLOAT,false,2*sizeof(float)/*equivalent a 0...*/,0);
    // fin initialisation
     
    // rendu
      while(true))
        {
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);// "nettoie" l'affichage
        glUseProgram(shaderProgramId);// binding du programme
        glBindVertexArray(vaoId);// binding des buffers
        glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,0);// dessin
        //glDrawElementsInstancedARB(GL_QUADS,4,GL_UNSIGNED_BYTE,0,1);
        glfwSwapBuffers();// swap buffers
        }
    // fin rendu
    // …
    Tout fonctionne impeccablement, j'ai bien mon carré blanc. Mais alors pourquoi ce post?

    Eh bien, voici mon problème : dès que je souhaite accéder à la variable gl_VertexID (introduite avec l'extension GL_EXT_gpu_shader4), par exemple en rajoutant simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int vertexId=gl_VertexID;
    dans le main de mon vertex shader, je n'ai plus rien qui s'affiche. Pourtant, OpenGL ne détecte aucune erreur.
    En mettant «*#extension GL_EXT_gpu_shader4 : enable*» (ou «*require*») après «*#version 130*» dans le code du vertex shader (et même dans le code du fragment shader où c'est a priori inutile...), rien ne s'affiche non plus et aucune erreur n'est détectée. La variable gl_VertexID est bien reconnue puisque si je rajoute en plus «*#entension GL_EXT_gpu_shader4 : warn*», OpenGL me signale que je l'utilise, m'indiquant la ligne.

    J'ai exactement le même problème avec la variable gl_InstanceIDARB (introduite avec GL_ARB_draw_instanced) même en changeant «*glDrawElements*» par «*glDrawElementsARB*», et là, ça m'embête beaucoup plus car l'instancing est une fonctionnalité que je trouve intéressante et j'aurais bien aimé pouvoir l'utiliser.

    Je précise que j'ai compilé mon code source avec Mingw 5.4 et Visual C++ 2008 Express Edition, toujours pour le même résultat. J'ai même écrit un code équivalent en Java avec la bibliothèque de binding OpenGL LWJGL. Idem : je n'ai plus mon carré blanc lorsque j'essaie d'accéder aux variables gl_VertexID ou gl_InstanceIDARB.

    Ma carte graphique est une radeon 3650 agp avec pilotes catalyst 9.4 (les derniers disponibles pour les cartes radeons agp). Mon OS est Windows XP sp3.
    J'espère que vous pourrez m'aider. Je vous remercie d'avance de vous pencher sur mon problème.

  2. #2
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Les fonctions pour l'instancing ne sont glDrawElements mais glDrawElementsInstanced, ou quelque chose comme ça. C'est cette fonction qui va donner une valeur valide à gl_VertexID (et, après réflexion.... ce n'est pas la variable gl_InstanceID que cette fonction écrit plutôt que gl_VertexID ?). Regarde aussi du côté de l'extension GL_ARB_instanced_array, ça pourrait peut-être t'intéresser.

    Sinon, juste pour info, je crois que les geometry shaders ne sont pas encore supportés chez ATi sur OpenGL (mais le sont sous DirectX).

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 35
    Points : 38
    Points
    38
    Par défaut Merci de votre réponse Bakura
    Merci de prendre la peine de me répondre Bakura mais je crois que je me suis mal exprimé. En effet, l'exemple que je donnai illustrait le fait que je n'ai plus d'affichage quand j'essaie d'accéder à la variable gl_VertexID, qui est de type "attribute" et permet de connaître l'indice du vertex courant dans le vertex shader. Elle s'utilise avec glDrawElements (ou même glDrawElementsInstancedARB d'ailleurs), pas forcément pour faire de l'instancing donc.
    Et de plus, effectivement, lorsque je veux faire de l'instancing (je remplace donc glDDrawElements par glDrawElementsInstancedARB donc), et lorsque j'essaie d'accéder à la variable gl_InstanceIDARB, plus rien ne s'affiche.
    Sinon, la variable glInstanceIDARB existe bien d'après les spécifications de l'extension GL_ARB_draw_instanced (voir : http://www.opengl.org/registry/specs..._instanced.txt) et vaut 0 lorsqu'on ne fait pas d'instancing (donc vous voiyer que l'on peut quand même y accéder sans avoir écrit glDrawElelementsInstancedARB dans le code C++).
    En outre, ma carte semble supporter cette extension car le logiciel OpenGL Extension Viewer l'a détectée dans la liste des extensions de ma carte (et le vertex shader ne compilerait pas si je ne l'avais pas).
    Update :
    Même quand j'essaie d'accéder à la variable gl_Vertex (supportée depuis OpenGL 2.0 quand même!), mon carré blanc ne s'affiche plus?! (Je précise que je fais juste vec3 vert=gl_Vertex.xyz; dans le vertex shader, donc rien à voir avec les instructions pour afficher mon carré...).
    Je me demande si mes problèmes ne viendraient pas des pilotes de ma carte (qui sont pourtant les derniers disponibles pour les ati en agp).
    Qu'en pensez-vous?
    Doit-on avoir un réglage spécifique du bus agp pour faire du glsl?

  4. #4
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Ah désolé j'avais mal compris. Je n'ai jamais utilisé gl_VertexID donc je n'en sais rien. Quand au fait que gl_Vertex ne fonctionne plus, c'est tout à fait normal après tout : à partir du moment ou tu envois toi-même tes données (comme demandé par OGL 3.x) via les attributs génériques, il n'y a plus rien dans gl_Vertex (dont l'utilisation est dépréciée).

    Désolé de pas pouvoir t'aider plus :/.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Août 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut gl_VertexID
    Salut,

    Je me demande si mes problèmes ne viendraient pas des pilotes de ma carte (qui sont pourtant les derniers disponibles pour les ati en agp).
    Qu'en pensez-vous?
    J'ai le meme probleme et aussi une carte ATI (en PCI-E) donc je penche pour le driver. D'autant que je suis sous Linux ou le support est loin d'etre parfait.
    A voir quand meme s'il n'y aurait pas d'autres pistes du cote d'OpenGL et des nouvelles fonctionnalites ajoutees, mais je n'ai toujours pas trouve.

    Quelqu'un pourrait confirmer/infirmer ce bug d'utilisation de glVertexID en GLSL 1.30 (#version 130) avec carte ATI et/ou NVIDIA? Ca serait utile pour localiser l'origine du probleme.

    Doit-on avoir un réglage spécifique du bus agp pour faire du glsl?
    Selon moi rien a voir. AGP est une architecture materielle, GLSL un language de script pour l'architecture logicielle OpenGL. Aucun lien direct entre les deux.

    Quand au fait que gl_Vertex ne fonctionne plus, c'est tout à fait normal après tout : à partir du moment ou tu envois toi-même tes données (comme demandé par OGL 3.x) via les attributs génériques, il n'y a plus rien dans gl_Vertex (dont l'utilisation est dépréciée).
    Je ne sais pas si c'est "normal" mais effectivement ca ne me choque pas. Au contraire de gl_VertexID, gl_Vertex est marque deprecated. Je precise d'ailleurs que j'ai fait mes tests avec et sans contexte "forward-compatible".

    Un retour de la part des utilisateurs de gl_VertexID serait vivement apprecie!
    merci d'avance

    PS: Je n'ai en revanche aucun probleme avec gl_PrimitiveID dans le fragment shader. Ce qui me fait d'autant plus pencher pour la these du bug de driver.

Discussions similaires

  1. OutlookExpress - Plus aucun affichage
    Par padsalad dans le forum Outlook Express / Windows Mail
    Réponses: 4
    Dernier message: 11/09/2011, 12h37
  2. Réponses: 4
    Dernier message: 17/08/2009, 18h38
  3. Plus aucun affichage
    Par Totof008 dans le forum Composants
    Réponses: 3
    Dernier message: 13/06/2009, 00h09
  4. Réponses: 11
    Dernier message: 10/07/2007, 20h26
  5. [MySQL] Problème affichage lorsque champ non renseigné
    Par fannoche dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/04/2007, 11h10

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