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 :

VBO OpenGL3.x problème shader


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut VBO OpenGL3.x problème shader
    Bonjour tout le monde!
    J'essaye de mettre en place des VBO avec OpenGL 3.x comme nous pouvons le voir sur les super tutos de bakura : Utilisation des VBO avec OpenGL 3.x.
    Lors de l'implémentation de ces VBO, j'ai utilisé des shaders comme indiqué. Cependant j'ai un problème lors de la récupération de l'identifiant de mes attributs contenus dans le shader: j'obtiens la valeur -1.

    Voici mon code pour charger mes shader (je suis en Java et j'utilise le binding LWJGL):
    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
     
    public void loadShader() {
            //new Shader2 appelle la méthode glCreateShader([I]type[\I]) 
    	Shader2 vertexShader = new Shader2(GL20.GL_VERTEX_SHADER);
    	Shader2 fragmentShader = new Shader2(GL20.GL_FRAGMENT_SHADER);
     
            //Lecture du fichier vbo.vs, le charge dans un String et appelle la 
            //méthode glShaderSource(idShader, source) 
    	vertexShader.source("./shaders/vbo.vs");
    	fragmentShader.source("./shaders/vbo.fs");
     
            //compile les shader avec glCompileShader(idShader)
    	vertexShader.compile();
            //test si le shader est compilé en récupérant la valeur de 
            //glGetShader(idShader, GL_COMPILE_STATUS)
    	vertexShader.isCompile();
     
    	fragmentShader.compile();
    	fragmentShader.isCompile();
     
            //new ShaderProgram2() fait appel à glCreateProgram()
    	shaderProgram = new ShaderProgram2();
            //On attache les deux shader dans le programme 
            //(glAttachShader(idProgram, idShader)).
    	shaderProgram.attachShader(vertexShader);
    	shaderProgram.attachShader(fragmentShader);
     
            //On lie le programme
    	shaderProgram.linkProgramShader();
     
            //On récupère l'identifiant de la matrice de notre scène
    	uniformModelViewProjectionMatrix = shaderProgram.getUniformLocation("ModelViewProjectionMatrix");
     
            //On récupère l'id pour les couleurs, les position et les normales.
    	vertexColorAttrib = shaderProgram.getAttribLocation("VertexColor");
    	vertexPositionAttrib = shaderProgram.getAttribLocation("VertexPosition");
    	vertexNormalAttrib = shaderProgram.getAttribLocation("VertexNormal");
     
            // Affiche : uniformModelViewProjectionMatrix: 0
    	System.out.println("uniformModelViewProjectionMatrix: " + uniformModelViewProjectionMatrix); 
    	// Affiche: vertexColorAttrib: -1
            System.out.println("vertexColorAttrib: " + vertexColorAttrib); 
           // Affiche: vertexNormalAttrib: -1
    	System.out.println("vertexNormalAttrib: " + vertexNormalAttrib); 
     
          //Affiche: vertexPositionAttrib: 0
          System.out.println("vertexPositionAttrib: " + vertexPositionAttrib);
        }
    Et voici mes deux shaders:
    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
     
    //Vertex Shader
    #version 130
     
    in vec3 VertexNormal;
    in vec3 VertexPosition;
     
    in vec3 VertexColor;
     
    uniform mat4 ModelViewProjectionMatrix;
     
    invariant gl_Position;
     
    noperspective out vec3 NoPerspectiveColor;
     
    void main()
    {
        NoPerspectiveColor = VertexColor;
        gl_Position = ModelViewProjectionMatrix * vec4(VertexPosition, 1.0);
    }
    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
     
    //Fragment Shader
    #version 130
     
    precision highp float;
     
    smooth in vec3 InterpolatedColor;
     
    // Sortie du fragment shader, ira dans le framebuffer principal
    out vec4 Color;
     
    void main()
    {
        Color = vec4 (InterpolatedColor, 1.0);
    }
    Lors de l'ouverture de ma fenêtre, je ne vois mes données (ma fenêtre est toute noire alors que je l'ai initialisé avec glClearColor(1,1,1,1)...) . Je pensais au début que le problème venait des données que je passais dans les tableaux génériques mais ils sont correctement remplis. Je pense avoir trouvé l'origine du problème: les valeurs des identifiants de mes attributs ne sont pas correct du moins pour ceux des couleurs et normales (égaux à -1).

    Avez-vous une idée de la cause? Et surtout comment remédier à ce problème?

    Merci d'avance

  2. #2
    Membre actif
    Avatar de Aladore
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 70
    Par défaut
    Alors première question, quand est-ce que tu exécutes cette portion de code ? Je veux dire par là, est-ce que tu fais ça *après* avoir ouvert un contexte OpenGL ?

    Sinon, est-ce que tu peux nous montrer ton code qui te donne les identifiants ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut
    Merci pour ta réponse.
    Pour ta question, j'exécute bien cette méthode après la création du contexte car sinon nous avons une erreur de type GLException je crois...

    Sinon le code pour récupérer mes identifiants est dans la méthode loadShader:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    vertexColorAttrib = shaderProgram.getAttribLocation("VertexColor");
    ...
     
    //avec getAttribLocation
    public int getAttribLocation(String nameParameter) {
    	return GL20.glGetAttribLocation(programId, nameParameter);
    }
    Ce qui est étrange c'est qu'il arrive a récupérer un identifiant pour l'attribut VertexPosition mais pas pour les deux autres (VertexColor et VertexNormal)...

  4. #4
    Membre actif
    Avatar de Aladore
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 70
    Par défaut
    Peut-être activer les attributs de sommet avec: glEnableVertexAttribArray ?
    J'avoue que là je sèche un peu, et que je procède un peu par tâtonnement ..

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut
    glEnableVertexArrayAttrib ne sert pas plutôt à activer notre tableau générique?

  6. #6
    Membre actif
    Avatar de Aladore
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 70
    Par défaut
    Si oui pardon, la fatigue ...
    Est-ce que tu regardes s'il y a une erreur lors du linkage de tes shaders dans le programme ? Je reste dubitatif quand au fait que ça marche pour VertexPosition est pas pour les autres ...

Discussions similaires

  1. OpenGL3 VS2010 problème de link
    Par Antoine++ dans le forum OpenGL
    Réponses: 13
    Dernier message: 10/09/2010, 19h33
  2. Problème performances VBOs
    Par Burckel dans le forum OpenGL
    Réponses: 3
    Dernier message: 08/03/2007, 19h48
  3. Problème VBO (indices et vertices)
    Par Bakura dans le forum OpenGL
    Réponses: 13
    Dernier message: 09/11/2006, 18h25
  4. Problème VBO + texture
    Par f56bre dans le forum OpenGL
    Réponses: 2
    Dernier message: 18/08/2006, 09h20
  5. Problème avec l'utilisation des VBO
    Par Ekinoks dans le forum OpenGL
    Réponses: 12
    Dernier message: 09/07/2006, 18h42

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