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 :

Réorganisation d'un programme


Sujet :

OpenGL

  1. #1
    Membre du Club
    Profil pro
    Enseignant
    Inscrit en
    Septembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Points : 46
    Points
    46
    Par défaut Réorganisation d'un programme
    Bonjour,

    Je maintiens un programme dont chaque classe s'occupe d'afficher sa "partie" en OpenGL.
    Environ 140 fichiers, 50 classes. Ni trop gros, ni trop petit, humainement gérable.
    C'était du vieux code OpenGL avec du gLbegin, gLvertex gLend partout...

    Je rénove le programme et la transformation en OpenGL4 arrive petit à petit à quelque chose.

    Chaque classe qui s'occupe d'afficher quelque chose gère ses propres fonctions d'affichage.
    J'ai une classe spécialisée qui me charge mes shaders et qui me compile le tout, me donnant un shaderProgram .

    Ainsi, pour chaque shader que j'emploie, je me retrouve avec ces portions de codes :

    Pour les données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	//shader for first layer
    	shaderProgram* shaderLayer;
    	GLuint vboLayerPos;
    	GLuint vaoLayer;
    Pour les méthodes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	void initLayerShader();
    	void initLayerParam();
    	void drawFirstLayer();
    Le programme tourne mais ...
    Autant avant mes classes d’affichage avaient peu de fonction, autant la je me retrouve avec 5 à 7 fonctions, pour chaque shader à utiliser, qui font que mes classes deviennent au final denses, difficiles à lire et que je sens bien que je copie/colle trop.
    Je ne sais pas comment m'en sortir élégamment.

    Comment faites vous pour gérer de nombreux shaders ? VAO ? VBO ?
    J'aime pas les spaghettis.

    Merci par avance !

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par tickyletroll Voir le message
    Autant avant mes classes d’affichage avaient peu de fonction, autant la je me retrouve avec 5 à 7 fonctions, pour chaque shader à utiliser, qui font que mes classes deviennent au final denses, difficiles à lire et que je sens bien que je copie/colle trop.
    est-ce que tu utilises l'héritage, ne serait-ce qu'un minimum ?
    L'héritage ça permet d'éviter les copier-coller notamment.
    Si tu fais hériter une méthode d'une classe grâce à l'héritage pas besoin de redéfinir les méthodes de la classe de base c'est fait pour ça

  3. #3
    Membre du Club
    Profil pro
    Enseignant
    Inscrit en
    Septembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Points : 46
    Points
    46
    Par défaut
    Merci Mat.M pour ta rapide réponse.
    Alors oui, j'ai été formé à penser en orienté objet.

    Mais la, en OpenGL je bloque. En fait j'ai pas d'idées de comment faire.
    Je n'ai pas posté de code car je ne veux pas qu'on me fasse, je veux juste savoir comment faire, et je ferai le reste.

    Si je regarde 3 fonctions de tracés dans une de mes classes, je vois ceci :

    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
     
    void App::drawFirstLayer()
    {
    	glDisable(GL_BLEND);
    	shaderLayer->use();
    	glBindVertexArray(vaoLayer);
    	glDrawArrays(GL_TRIANGLE_STRIP,0,4);
    	glUseProgram(0);
    }
     
    void App::drawViewportShape()
    {
    	glDisable(GL_BLEND);
    	glBlendFunc(GL_ONE, GL_ONE);
     
    	shaderViewportShape->use();
     
    	glActiveTexture(GL_TEXTURE0);
    	glBindTexture(GL_TEXTURE_2D, texViewportShape->getID());
    	glUniform1i(ViewportShapeTex,0);
     
    	glBindVertexArray(vaoViewportShape);
    	glDrawArrays(GL_TRIANGLE_STRIP,0,4);
    	glUseProgram(0);
    }
     
    void App::drawColorInverse()
    {
    	glEnable(GL_BLEND);
    	glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
     
    	shaderColorInverse->use();
    	glUniform1i(ViewportShapeTex,0);
     
    	glBindVertexArray(vaoViewportShape);
    	glDrawArrays(GL_TRIANGLE_STRIP,0,4);
    	glUseProgram(0);
    }

    Je suis embêté de voir ces trois fonctions similaires. D'où ma requête.

  4. #4
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Ce que je vais dire relève de mon expérience personnelle, et de ce que je dois faire pour passer mon moteur sous Vulkan.
    Dans Vulkan, tu as un VkPipeline, qui contient en gros tous les états de rendu (tout ce qui se fait avec glEnable/glDisable), le viewport, le shader program, et encore plus...
    Le truc, c'est qu'une fois créé, un pipeline est immuable, il n'y a plus moyen de le changer.
    Dans mon moteur, comme dans le code que tu as, tout était changé à la volée, et au niveau du GPU, on ne peut pas faire pire.
    Au final, j'implémente cette notion de pipeline immuable, et ça apporte des gains de performance notables.

    Tout ça pour dire, je ne peux que te conseiller de commencer par regrouper les divers états dans des classes qui ne s'occuperont que de gérer ces états (BlendState, RasteriserState, DepthStencilState, ...), puis tu mets ces états dans un pipeline, avec le shader pour ce pipeline.
    Ce, afin de pouvoir faire un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Pour chaque pipeline
      BindPipeline
        Dessin de tous les objets utilisant ce pipeline
      UnbindPipeline
    C'est un changement de longue haleine, mais qui au final va simplifier le boulot, et améliorer les performances de rendu.
    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).

  5. #5
    Membre du Club
    Profil pro
    Enseignant
    Inscrit en
    Septembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Points : 46
    Points
    46
    Par défaut
    Je sais alors ce qu'il me reste à faire.

    Merci !

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

Discussions similaires

  1. Programme moulinette pour réorganisation tableau 2 dimensions
    Par quentin31000 dans le forum Général Python
    Réponses: 8
    Dernier message: 28/06/2013, 10h33
  2. [WD17] Réorganiser une table par programmation
    Par squall049 dans le forum WinDev
    Réponses: 6
    Dernier message: 09/03/2013, 17h16
  3. Réorganisation d'un programme en fonctions
    Par élève6018 dans le forum MATLAB
    Réponses: 4
    Dernier message: 05/10/2011, 16h41
  4. Réorganiser la fenêtre de relations par programme ?
    Par marot_r dans le forum VBA Access
    Réponses: 9
    Dernier message: 08/03/2009, 18h34
  5. Réorganiser le menu programme par ordre alphabétique
    Par koKoTis dans le forum Windows XP
    Réponses: 2
    Dernier message: 31/05/2007, 09h40

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