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 :

Geometry shader, impossible de dessiner un rectangle


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Par défaut Geometry shader, impossible de dessiner un rectangle
    Bonsoir, cela fait des heures que j'essaie de modéliser un rectangle dans mon geometry shader avec la sortie triangle_strip. Quoi que je fasse je n'obtiens que des triangles orientés différemment ou bien rien du tout, il est pourtant précisé ici que les sommets étaient pris par paquets de 3 de sorte à ce que 4 sommets suffisent à former deux triangles mais dans mon cas on dirait que le 1er sommet est toujours ignoré.

    Je dessine mes vertices de cette manière :

    Nom : Rectangle geometry shader.jpg
Affichages : 289
Taille : 95,2 Ko

    Si je remplace "triangle_strip" par "line_strip" j'obtiens ceci :

    Nom : Ligne geometry shader.jpg
Affichages : 286
Taille : 87,7 Ko

    Voici mes shaders :

    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
    16
    17
    18
    19
    20
    #version 330 core
     
    layout (location=0) in vec3 vertex;
     
    uniform mat4 projection;
    uniform mat4 modele;
    uniform mat4 vue;
     
    out VS_OUT {
        vec4 pos;
    } vs_out;
     
    void main(void)
    {
    	vec4 vertex2=vec4(vertex,1.0);
     
    	//gl_Position=projection*vue*modele*vertex2;
     
    	vs_out.pos=vertex2;
    }

    Geometry 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
    #version 330 core
     
    layout(points) in;
    layout(triangle_strip, max_vertices = 4) out;
     
    uniform mat4 projection;
    uniform mat4 modele;
    uniform mat4 vue;
     
    in VS_OUT {
        vec4 pos;
    } gs_in[];
     
    void main()
    {
        const float largeur=2.0;
        const float hauteur=10.0;
     
    	gl_Position = projection*vue*modele*(gs_in[0].pos + vec4(0.0,largeur/2,0.0,0.0));
        EmitVertex();
     
    	gl_Position = projection*vue*modele*(gs_in[0].pos + vec4(0.0,largeur/2,hauteur,0.0));
        EmitVertex();
     
    	gl_Position = projection*vue*modele*(gs_in[0].pos + vec4(0.0,-largeur/2,0.0,0.0));
        EmitVertex();
     
    	gl_Position = projection*vue*modele*(gs_in[0].pos + vec4(0.0,-largeur/2,hauteur,0.0));
        EmitVertex();
     
        EndPrimitive();
    }

    Fragment shader :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #version 330 core
     
    out vec4 FragColor;
     
    void main(void)
    {
    	FragColor=vec4(1.0,0.0,0.0,1.0);
    }
    Avec ce geometry shader rien n'est dessiné (Pour une raison mystérieuse), avec celui-ci :

    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
    #version 330 core
     
    layout(points) in;
    layout(triangle_strip, max_vertices = 6) out;
     
    uniform mat4 projection;
    uniform mat4 modele;
    uniform mat4 vue;
     
    in VS_OUT {
        vec4 pos;
    } gs_in[];
     
    void main()
    {
        const float largeur=2.0;
        const float hauteur=10.0;
     
    	gl_Position = projection*vue*modele*(gs_in[0].pos + vec4(0.0,largeur/2,0.0,0.0));
        EmitVertex();
     
    	gl_Position = projection*vue*modele*(gs_in[0].pos + vec4(0.0,largeur/2,hauteur,0.0));
        EmitVertex();
     
    	gl_Position = projection*vue*modele*(gs_in[0].pos + vec4(0.0,-largeur/2,0.0,0.0));
        EmitVertex();
     
    	///////////////////////////////////////////////////////////////////////////////////////////////
     
    	gl_Position = projection*vue*modele*(gs_in[0].pos + vec4(0.0,-largeur/2,0.0,0.0));
        EmitVertex();
     
    	gl_Position = projection*vue*modele*(gs_in[0].pos + vec4(0.0,largeur/2,hauteur,0.0));
        EmitVertex();
     
    	gl_Position = projection*vue*modele*(gs_in[0].pos + vec4(0.0,-largeur/2,hauteur,0.0));
        EmitVertex();
     
        EndPrimitive();
    }
    J'obtiens des triangles posés sur la pointe. J'ai essayé d'autres configurations mais je n'obtiens JAMAIS de rectangles.

    Pourriez-vous m'aider svp car là je sèche complètement ...

  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
    On peut voir les résultats que tu obtiens, avec l'un et l'autre shader ?
    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
    Responsable 2D/3D/Jeux


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

    Combien de points dessinez vous (envoyez vous à la carte graphique) ? Envoyez-vous ces points directement en espace écran ?
    La largeur me semble vraiment petite, mais bon, cela dépend de quel espace nous nous trouvons.
    Avez-vous tenté un débogage avec un débogueur GPU ?
    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.

  4. #4
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Par défaut
    J'ai résolu le problème finalement, merci pour vos messages, il faut apparemment dessiner dans un ordre précis, en suivant la structure d'un Z et non d'un N comme je faisais.

    Bref sinon j'aimerais avoir vos avis sur la meilleure manière de dessiner un arbre car j'utilise ici quatre surfaces texturées disposées en étoile mais une fois l'éclairage mis en place ça fait ressortir les surfaces et je n'aime pas trop :

    Nom : Capture.jpg
Affichages : 244
Taille : 253,9 Ko

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 053
    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 053
    Billets dans le blog
    141
    Par défaut
    Pour les arbres, je pense que vous utilisez une méthode des années 2000. Pour régler rapidement le problème, enlever les arbres du processus d'éclairage (autrement dit, les arbres ne sont pas affectés par l'éclairage). Donnez leur juste une couleur fixe. Si jamais vous avez un éclairage dynamique (notamment un cycle jour/nuit), faites varier la couleur.
    Sinon, je pense que dorénavant, on utilise des modèles 3D pour les arbres. Sinon, il faut utiliser des billboards (carré qui font toujours face à la caméra).

    Autrement, cette technique peut être valable pour du très bas niveau de détail, c'est-à-dire, pour des arbres très loin.
    On remarquera sur la chaîne suivante, pas mal de triche pour les objets lointains :
    https://www.youtube.com/channel/UCHT...wm49CQeCVZogMw
    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.

  6. #6
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Par défaut
    J'ai aussi pensé à utiliser un billboard mais j'ai un léger souci : Pour calculer l'orientation de la surface je calcule le produit scalaire entre le vecteur normal à la surface (1,0,0) et le vecteur reliant la surface à la caméra et j'utilise la fonction acos() mais cette fonction ne fournit pas de valeur au-delà de 180° donc par moments la surface est mal orientée.

    Pour les modèles 3D c'est délicat car il y a plus de 80 000 vertex pour un arbre (Je l'ai modélisé sous Blender et fait des rendus pour avoir mes textures) et je ne peux pas faire ça avec un geometry shader. C'est pour gagner en performance que je veux utiliser un geometry shader : L'arbre n'est dessiné que si la caméra est proche.

    Edit : J'ai finalement réussi à faire en sorte que la surface soit toujours alignée avec la caméra mais je n'aime pas trop le résultat car on peut voir la surface pivoter : https://imgur.com/a/ZrcYdb0

Discussions similaires

  1. [C#][Direct3D] Comment dessiner un rectangle
    Par FraktaL dans le forum DirectX
    Réponses: 3
    Dernier message: 26/10/2005, 00h29
  2. Réponses: 14
    Dernier message: 13/10/2005, 15h00
  3. Dessiner un rectangle sur une forme
    Par Neo41 dans le forum MFC
    Réponses: 6
    Dernier message: 13/08/2005, 01h08
  4. [VB.NET] Dessiner plusieurs rectangles.
    Par Emcy dans le forum Windows Forms
    Réponses: 9
    Dernier message: 23/03/2005, 16h57
  5. Dessiner un rectangle avec bords et texte ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 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