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 :

glsl : attributs in et types possibles


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut glsl : attributs in et types possibles
    Bonjour à tous

    Je viens de constater quelque chose de très inattendu. En effet, je viens de m'apercevoir que, dans un code qui buggait depuis 1 semaine, envoyer des int en tant que in vec2 dans un shader glsl (version 1.40) avec glVertexAttribPointer à la place d'envoyer des int en tant que in int permettait de résoudre le problème et d'obtenir le comportement souhaité.

    Ma question est donc simple : y a-t-il une restriction des types que l'on peut passer en "in" dans le shader, à savoir tous types de base comme int, float ...

    En d'autre termes pourquoi écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #//version 140
    in int numberFace
    Ne fonctionne pas lorsqu'on passe un tableau d'int via glVertexAttribPointer alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #//version 140
    in ivec2 numberFace
    fonctionne lorsqu'on passe un tableau d'int via glVertexAttribPointer.

    Avez-vous d'éventuelles explications à me fournir ? Merci par avance !

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    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 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Car si vous écrivez il ne faut pas passer un tableau, mais juste un élément. Après, cela dépend aussi de votre code OpenGL (avez vous fait des glGetError ? Vérifiez vous bien si l'id du in est trouvé ?).
    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é
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Oui ceci expliquerait cela mais dans ce cas comment expliquer qu'on puisse passer des tableaux d'int lorsqu'on met dans le shader ?

    Sinon je vais effectivement faire quelques tests d'erreur pour vérifier mais je crois l'avoir déjà fait avec gdebugger ^^

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    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 129
    Billets dans le blog
    149
    Par défaut
    Car au final, un vec2, c'est deux int, soit, un tableau de deux int.
    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é
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    En fait je viens de m'apercevoir que ça ne marche pas dans tout les cas ^^

    Voici mon shader (vertex) :
    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
    #version 140
     
    in highp vec3 in_Color;
    in highp int currentCube;
     
    out highp vec3 color;
     
    uniform float length = 5;
    uniform vec3 centers = vec3(10,10,10);
    uniform mat4 projection;
    uniform mat4 modelview;
     
     
    void main()
    {
    	if(currentCube>=0)
    	{
    		if(currentCube<1)
    		{
    		 gl_Position = projection * modelview * vec4(centers[0]-length/2,centers[1]-length/2,centers[2]-length/2, 1.0);
    		}
    		else if(currentCube<2)
    		{
    		 gl_Position = projection * modelview * vec4(centers[0]-length/2,centers[1]+length/2,centers[2]-length/2, 1.0);
    		}
    		else if(currentCube<3)
    		{
    		 gl_Position = projection * modelview * vec4(centers[0]+length/2,centers[1]+length/2,centers[2]-length/2, 1.0);
    		}
    		else if(currentCube<4)
    		{
    		 gl_Position = projection * modelview * vec4(centers[0]+length/2,centers[1]-length/2,centers[2]-length/2, 1.0);
    		}
    		else if(currentCube<5)
    		{
    		 gl_Position = projection * modelview * vec4(centers[0]-length/2,centers[1]-length/2,centers[2]+length/2, 1.0);
    		}
    		else if(currentCube==5)
    		{
    		 gl_Position = projection * modelview * vec4(centers[0]-length/2,centers[1]+length/2,centers[2]+length/2, 1.0);
    		}
    		else if(currentCube==6)
    		{
    		 gl_Position = projection * modelview * vec4(centers[0]+length/2,centers[1]+length/2,centers[2]+length/2, 1.0);
    		}
    		else if(currentCube==7)
    		{
    		 gl_Position = projection * modelview * vec4(centers[0]+length/2,centers[1]-length/2,centers[2]+length/2, 1.0);
    		}
    		else
    		{
    		 gl_Position = projection * modelview * vec4(in_Vertex[0]+currentCube,in_Vertex[1]+currentCube,in_Vertex[2]+currentCube, 1.0);
    		}
    	}
    	else
    	{
    		gl_Position = projection * modelview * vec4(centers, 1.0);
    	}
     
        color = in_Color;
    }
    Ce shader ne fonctionne tout simplement pas même si il compile.

    J'aimerais savoir pourquoi je déséspère à vrai dire j'ai fait de très nombreux tests et vraisemblablement ce qu'il y a dans les if n'est pas vérifié ou est vérifié de la même façon quelque soit le "currentCube" passé en "argument" au shader.

    Voici ce qui se passe dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    float couleurs3[] = {1.f,1.f,1.f, 0.9,0.9,0.9, 0.8,0.8,0.8, 0.7,0.7,0.7, 0.5,0.0,0.0, 0.6,0.1,0.1, 0.7,0.2,0.2, 0.8,0.3,0.3};
        int ids[] = {0,1,2,3,4,5,6,7};
        unsigned int index2[] = {0,1,2,3,  0,1,5,4,  1,2,6,5,  2,3,7,6,  3,0,4,7,  4,5,6,7};
        //p est le programme correctement compilé
    	glBindAttribLocation(p.getProgramID(), 2, "currentCube");
    	glBindAttribLocation(p.getProgramID(), 3, "in_Color");
    Puis à l'affichage :
    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
     
                glVertexAttribPointer(2, 1, GL_INT, GL_FALSE, 0, ids);
                glEnableVertexAttribArray(2);
                glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, couleurs3);
                glEnableVertexAttribArray(3);
     
                glUseProgram(p2.getProgramID());
                glUniformMatrix4fv(glGetUniformLocation(p2.getProgramID(), "projection"), 1, GL_TRUE, matrix.getValeurs());
                glUniformMatrix4fv(glGetUniformLocation(p2.getProgramID(), "modelview"), 1, GL_TRUE, modelview.getValeurs());
                glUniform1f(glGetUniformLocation(p2.getProgramID(), "length"), 5.f);
                glUniform3fv(glGetUniformLocation(p2.getProgramID(), "centers"), 1, center);
     
                glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, index2);
     
                glUseProgram(0);
     
                glDisableVertexAttribArray(2);
                glDisableVertexAttribArray(3);
    Ce programme est sensé afficher un cube en fonction des index placés dans "ids" et "index2" : ids sont les différents sommets du cube et index2 sont les index correspondant à l'ordre d'affichage des sommets.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    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 129
    Billets dans le blog
    149
    Par défaut
    Il n'y a toujours pas de glGetError() ?
    Avez vous essayer de voir avec gDEBugger ?
    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.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/07/2008, 23h29
  2. peut-on cacher des attributs dans un type union ?
    Par gorgonite dans le forum F#
    Réponses: 2
    Dernier message: 28/05/2008, 13h28
  3. [DOM] checkbox multiples avec attribut name du type nom[]
    Par beyo dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 16/04/2008, 09h15
  4. template spécification du type possible
    Par MatRem dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2007, 14h47
  5. Balise form - problème attributs name et type
    Par michihala dans le forum Struts 1
    Réponses: 3
    Dernier message: 03/04/2006, 17h17

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