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 avec les geometry shaders dans GLSL


Sujet :

OpenGL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Points : 291
    Points
    291
    Par défaut problème avec les geometry shaders dans GLSL
    Salut après avoir réussi à maitriser les shader GLSL (vertex et fragment) j'essaye depuis peu d'utiliser les geometry program.
    Et j'ai des problèmes rien ne s'affiche. J'ai fais un shader qui ne fait rien juste afficher l'objet en orange pour tester. quand j'enlève le geometry shader tout s'affiche. Quand je le met rien ne s'affiche.
    Je ne comprend pas d'ou vient l'erreur

    Je précise que j'ai une carte NVidia 8700 gt qui support le geometry shader. J'ai télécharger des exemples qui fonctionnnent

    voici les codes:

    vertex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #version 120
     
    void main()
    {	
    	gl_Position = ftransform();
    }
    geometry
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #version 120 
    #extension GL_EXT_gpu_shader4 : enable
    #extension GL_EXT_geometry_shader4 : enable
     
    void main() 
    { 
    	for(int i = 0; i < gl_VerticesIn; ++i) 
    	{ 
    		gl_Position = gl_PositionIn[i]; 
    		EmitVertex(); 
    	}
    	EndPrimitive();
    }
    fragment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #version 120
     
    void main()
    {
    	gl_FragColor = vec4(1.0, 0.5, 0.0, 1.0);  
    }
    et voici le code chargement et compilation du 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
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
        std::string nomVP = VERTEX_SHADER_SOURCE;
        std::string nomFP = FRAGMENT_SHADER_SOURCE;
        std::string nomGP = GEOMETRY_SHADER_SOURCE;
        //nomRessource = nom;
        bool l_bGeometryShader = false;
     
        // Create the program object container.
        GLuint shaderID = glCreateProgram();
        GLuint vertexID = 0;
        GLuint fragmentID = 0;
        GLuint geomertyID = 0;
        programName = shaderID;
     
        char error[4096];
        int result = 0;
     
        // Load the vertex shader.
        std::string shaderCode = LoadShader(nomVP.c_str());
        // si NULL: le fichier n'est pas lu 
        if (shaderCode.size() < 1)
        {
            return false;
        }
     
        vertexID = glCreateShaderObjectARB(GL_VERTEX_SHADER);
        const char * source = shaderCode.c_str();
        glShaderSourceARB(vertexID, 1, (const char**)&source, NULL);
        glCompileShaderARB(vertexID);
        glGetObjectParameterivARB(vertexID, GL_OBJECT_COMPILE_STATUS_ARB, &result);
     
     
        // Load the geomerty shader
        // le geometry shader est facultatif
        shaderCode = LoadShader(nomGP);
        if (shaderCode.size() > 1)
        {
            geomertyID = glCreateShaderObjectARB(GL_GEOMETRY_SHADER_EXT);
            source = shaderCode.c_str();
            glShaderSourceARB(geomertyID, 1, (const char**)&source, NULL);
            glCompileShaderARB(geomertyID);
            glGetObjectParameterivARB(geomertyID, GL_OBJECT_COMPILE_STATUS_ARB, &result);
            l_bGeometryShader = true;
        }
     
        // Load the pixel shader.
        shaderCode = LoadShader(nomFP);
        if (shaderCode.size() < 1)
        {
            return false;
        }
     
            fragmentID = glCreateShaderObjectARB(GL_FRAGMENT_SHADER);
            source = shaderCode.c_str();
            glShaderSourceARB(fragmentID, 1, (const char**)&source, NULL);
            glCompileShaderARB(fragmentID);
            glGetObjectParameterivARB(fragmentID, GL_OBJECT_COMPILE_STATUS_ARB, &result);
     
        if (l_bGeometryShader)
        {        
            ////Setup Geometry Shader////
            //Set POINTS primitives as INPUT
            glProgramParameteriEXT(shaderID,GL_GEOMETRY_INPUT_TYPE_EXT , GL_TRIANGLES );
            //Set TRIANGLE STRIP as OUTPUT
            glProgramParameteriEXT(shaderID,GL_GEOMETRY_OUTPUT_TYPE_EXT , GL_TRIANGLE_STRIP);
            //Set maximum number of vertices to be generated by Geometry Shader 
            //This parameter is very important and have an important impact on Shader performances
            //Its value must be chosen closer as possible to real maximum number of vertices
            glProgramParameteriEXT(shaderID,GL_GEOMETRY_VERTICES_OUT_EXT, 1024);
        }
     
        // attachement
        glAttachObjectARB(shaderID, vertexID);
        if (l_bGeometryShader)
        {        
            glAttachObjectARB(shaderID, geomertyID);
        }
        glAttachObjectARB(shaderID, fragmentID);
     
        // Link them together
        glLinkProgram(shaderID);
        glGetObjectParameterivARB(shaderID, GL_OBJECT_LINK_STATUS_ARB, &result);
        glGetInfoLogARB(shaderID, sizeof(error), NULL, error);

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Points : 291
    Points
    291
    Par défaut
    Si on me répond pas c'est peu être par ce que ma question est est un peu trop balèze pour ce forum
    Ou bien que je n'ai pas réussi à me faire comprendre

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 80
    Points : 62
    Points
    62
    Par défaut
    Salut, j'ai le meme probleme.

    J'avais cru avoir la solution mais en fait non.
    Donc j'édite mon message pour enlever ma solution foireuse.

    Si quelqu'un a une solution, j'suis preneur aussi.

    -- HopeLeaves

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Points : 1 630
    Points
    1 630
    Par défaut
    Essaye de remplacer GL_TRIANGLE_STRIP par GL_TRIANGLES.
    Je ne réponds à aucune question par MP, posez vos questions sur le forum adéquat.
    Profils : G+ - LinkedIn

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    Citation Envoyé par Syl_20 Voir le message
    Si on me répond pas c'est peu être par ce que ma question est est un peu trop balèze pour ce forum
    Ou bien que je n'ai pas réussi à me faire comprendre
    ou que personne ici n'utilise les geometry shaders ne serai-ce que par limitation technique
    à mon avis ton problème ne concerne qu'un nombre très réduit de personnes ayant les moyens de t'aider
    par exemple, en ce qui me concerne, ma carte ne les "supporte" pas (geforce 7)

    si tu peux partir d'un exemple en glsl fonctionnel alors prends cet exemple et simplifie le peu à peu et teste le au fur et à mesure
    tu as certainement oublié quelque chose dans le processus de traitement du vertex
    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.

  6. #6
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Points : 1 630
    Points
    1 630
    Par défaut
    Perso j'ai ça comme code :

    http://gitorious.org/projects/person...src/shader.cpp
    http://gitorious.org/projects/person...Direction.geom

    Et ca marche bien, peut-être que ta carte ne supporte pas les 1024 vertice il faut peut-être moins, fait comme moi dans le code.
    Je ne réponds à aucune question par MP, posez vos questions sur le forum adéquat.
    Profils : G+ - LinkedIn

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 318
    Points : 291
    Points
    291
    Par défaut
    J'ai résolue mon problème. En tâtonnant et procédant par élimination à partir de code fonctionnant trouvé sur internet
    J'ai pas compris ce qui ne marchait pas mais ça marche maintenant.

    vertex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void main()
    {	
    	//Transform the vertex (ModelViewProj matrix)
    	gl_Position = ftransform();
    }
    geometry:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #version 120 
    #extension GL_EXT_geometry_shader4 : enable
     
    void main(void)
    {
    	for(int i=0; i< gl_VerticesIn; i++)
            {
    		gl_Position = gl_PositionIn[i];
    		EmitVertex();
    	}
    	EndPrimitive();	
    }
    fragment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void main()
    {	
    	gl_FragColor = vec4(0.0,0.0,1.0,1.0);	
    }
    et le code de chargement du 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
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    	bool Success = true;
     
        std::string nomVP = VERTEX_SHADER_SOURCE;
        std::string nomFP = FRAGMENT_SHADER_SOURCE;
        std::string nomGP = GEOMETRY_SHADER_SOURCE;
        //nomRessource = nom;
        bool l_bGeometryShader = false;
     
        // Create the program object container.
        GLuint shaderID = glCreateProgramObjectARB();
        GLuint vertexID = 0;
        GLuint fragmentID = 0;
        GLuint geomertyID = 0;
        programName = shaderID;
     
        char error[4096];
        int result = 0;
     
        // Load the vertex shader.
        std::string shaderCode = LoadShader(nomVP.c_str());
        // si NULL: le fichier n'est pas lu 
        if (shaderCode.size() < 1)
        {
            return false;
        }
     
        vertexID = glCreateShaderObjectARB(GL_VERTEX_SHADER);
        const char * source = shaderCode.c_str();
        glShaderSourceARB(vertexID, 1, (const char**)&source, NULL);
        glCompileShaderARB(vertexID);
        glGetObjectParameterivARB(vertexID, GL_OBJECT_COMPILE_STATUS_ARB, &result);
     
     
        // Load the geomerty shader
        // le geometry shader est facultatif
        shaderCode = LoadShader(nomGP);
        if (shaderCode.size() > 1)
        {
            geomertyID = glCreateShaderObjectARB(GL_GEOMETRY_SHADER_EXT);
            source = shaderCode.c_str();
            glShaderSourceARB(geomertyID, 1, (const char**)&source, NULL);
            glCompileShaderARB(geomertyID);
            glGetObjectParameterivARB(geomertyID, GL_OBJECT_COMPILE_STATUS_ARB, &result);
            l_bGeometryShader = true;
        }
     
        // Load the pixel shader.
        shaderCode = LoadShader(nomFP);
        if (shaderCode.size() < 1)
        {
            return false;
        }
     
        fragmentID = glCreateShaderObjectARB(GL_FRAGMENT_SHADER);
        source = shaderCode.c_str();
        glShaderSourceARB(fragmentID, 1, (const char**)&source, NULL);
        glCompileShaderARB(fragmentID);
        glGetObjectParameterivARB(fragmentID, GL_OBJECT_COMPILE_STATUS_ARB, &result);
     
        if (l_bGeometryShader)
        {        
            ////Setup Geometry Shader////
            //Set POINTS primitives as INPUT
            glProgramParameteriEXT(shaderID,GL_GEOMETRY_INPUT_TYPE_EXT , GL_TRIANGLES );
            //Set TRIANGLE STRIP as OUTPUT
            glProgramParameteriEXT(shaderID,GL_GEOMETRY_OUTPUT_TYPE_EXT , GL_TRIANGLE_STRIP);
            //Set maximum number of vertices to be generated by Geometry Shader 
            //This parameter is very important and have an important impact on Shader performances
            //Its value must be chosen closer as possible to real maximum number of vertices
    glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT,&(int)m_nNBMaxGeometrieOutVerctice);        glProgramParameteriEXT(shaderID,GL_GEOMETRY_VERTICES_OUT_EXT, m_nNBMaxGeometrieOutVerctice);
        }
     
        // attachement
        glAttachObjectARB(shaderID, vertexID);
        if (l_bGeometryShader)
        {        
            glAttachObjectARB(shaderID, geomertyID);
        }
        glAttachObjectARB(shaderID, fragmentID);
     
        // Link them together
        glLinkProgram(shaderID);
        glGetObjectParameterivARB(shaderID, GL_OBJECT_LINK_STATUS_ARB, &result);
        glGetInfoLogARB(shaderID, sizeof(error), NULL, error);
    ma valeur 1024 correspond au max accepté par ma carte et est obtenu avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT,&(int)m_nNBMaxGeometrieOutVerctice);
    dans ces lignes de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glProgramParameteriEXT(shaderID,GL_GEOMETRY_INPUT_TYPE_EXT , GL_TRIANGLES );
    //Set TRIANGLE STRIP as OUTPUT      glProgramParameteriEXT(shaderID,GL_GEOMETRY_OUTPUT_TYPE_EXT , GL_TRIANGLE_STRIP);
    les valeur accepté sont les suivantes:
    en INPUT: POINTS, LINES, LINES_ADJACENCY_EXT, TRIANGLES, TRIANGLES_ADJACENCY_EXT.
    en OUTPUT: GL_POINTS, GL_LINE_STRIP , GL_TRIANGLE_STRIP

    voici le lien: http://appsrv.cse.cuhk.edu.hk/~ymxie/Geometry_Shader/

    shenron666, mon deuxième message c'était de l'humour

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    Citation Envoyé par Syl_20 Voir le message
    shenron666, mon deuxième message c'était de l'humour
    c'est noté dans le doute je préfère prévenir quand un sujet peut s'avérer quelque peu "élitiste"
    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.

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

Discussions similaires

  1. [PowerShell] Problème avec les caractères spéciaux dans un mail ?
    Par papykun dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 21/07/2014, 12h46
  2. Réponses: 7
    Dernier message: 03/01/2012, 17h47
  3. Problème avec les méthodes addTo* dans un service
    Par csperandio dans le forum Grails
    Réponses: 0
    Dernier message: 02/11/2011, 10h31
  4. [MySQL] Problème avec les htmlentities stockés dans bdd
    Par zouetchou dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/12/2007, 22h01
  5. Réponses: 2
    Dernier message: 07/04/2007, 11h29

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