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 :

Optimisation code OpenGL


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 49
    Par défaut Optimisation code OpenGL
    Bonjour à tous,

    je suis en train de coder sous vb.net un projet pour mon boulot. (je n'ai pas le choix de la plateforme)
    J'ai ajouté un petit peu de 3D via OpenTK qui utilise OpenGL.

    Mon projet consiste à dessiner des cylindres, pour cela j'utilise une simple boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    GL.Begin(BeginMode.Lines)
                For i = 0 To 360
                    mycos = (Math.Cos(i * 2 * Math.PI / 360)) * 100
                    mysin = (Math.Sin(i * 2 * Math.PI / 360)) * 100
                    GL.Vertex3(mycos, mysin, 0)
                    mycos = (Math.Cos(i * 2 * Math.PI / 360)) * 100
                    mysin = (Math.Sin(i * 2 * Math.PI / 360)) * 100
                    GL.Vertex3(mycos, mysin, 100)
                Next i
    GL.End()
    Sur ce cylindre, j'ai dessiné un filetage. j'ai gardé la même fonction mais j'ai ajouté une boucle qui me décale le point d'arrivé. Voici un exemple bidon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    GL.Begin(BeginMode.Lines)
    for j = 0 to 200
                For i = 0 To 360
                    mycos = (Math.Cos(i * 2 * Math.PI / 360)) * 100
                    mysin = (Math.Sin(i * 2 * Math.PI / 360)) * 100
                    GL.Vertex3(mycos, mysin, j)
                    mycos = (Math.Cos(i * 2 * Math.PI / 360)) * 100
                    mysin = (Math.Sin(i * 2 * Math.PI / 360)) * 100
                    GL.Vertex3(mycos, mysin, j+1)
                Next i
    GL.End()
    next j
    Mon souci est que c'est très lourd de faire cela dans une boucle principal et j'ai mes FPS qui chutes...

    Il existe une solution pour réduire cette charge ? Je suis débutant en OpenGl alors je ne fais peu être pas de la bonne manière.

    Merci à vous.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Par défaut
    La première optimisation est de ne pas faire de calcul dans un glVertex, tu n'as pas grand chose mis à part ton j+1.

    Après tu dessines ligne par ligne, il est conseillé d'utiliser des polynômes, le nombre de polynôme détermineront la qualité de ton cylindre.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Par défaut
    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
     
    #define NB_POINTS 12I
    #define PI    3.14159265358979323846
     
     
    float x[NB_POINTS], z[NB_POINTS];
     
    void init(void) 
    {
       int i;
       float angle;
     
       glClearColor (0.0, 0.0, 1.0, 0.0);
       glEnable (GL_DEPTH_TEST);
     
        for (i = 0; i < NB_POINTS; i++) {
            angle = i  * 2 * PI / NB_POINTS;
            x[i] = cos(angle);
            z[i] = sin(angle);
        }
    }
     
    void jeton(float r, float g, float b)
    {
       int i;
     
       glColor3f (r, g, b);
     
       glPushMatrix();
       glScalef(0.5,0.25,0.5);
     
       glBegin(GL_POLYGON);
       for (i = 0; i < NB_POINTS; i++) {
                glVertex3f(x[i], 1, z[i]);
       }
       glEnd();
     
       glBegin(GL_POLYGON);
       for (i = 0; i < NB_POINTS; i++) {
                glVertex3f(x[i], -1, z[i]);
       }
       glEnd();
     
       glBegin(GL_QUADS);
       for (i = 0; i < NB_POINTS-1; i++) {
                glVertex3f(x[i], -1, z[i]);
                glVertex3f(x[i], 1, z[i]);
                glVertex3f(x[i+1], 1, z[i+1]);
                glVertex3f(x[i+1], -1, z[i+1]);
       }
       glVertex3f(x[NB_POINTS-1], -1, z[NB_POINTS-1]);
       glVertex3f(x[NB_POINTS-1], 1, z[NB_POINTS-1]);
       glVertex3f(x[0], 1, z[0]);
       glVertex3f(x[0], -1, z[0]);
       glEnd();
     
       glPopMatrix();
    }

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 49
    Par défaut
    Ok je vois ton optimisation, tu initialise un tableau pour le cos et le sin pour éviter d'avoir à faire se calcul
    à chaque fois que je dessine. A voir mais vue que j'applique le cos et le sin avec un diamètre qui évolue
    en permanence je vais devoir le refaire à un moment ou un autre.

    Après, se qui me choque c'est que je suis obligé de faire tout ça en boucle. Il faut savoir que je vais devoir dessiner des tas de cylindres en permanence et je ne vois pas comment je vais faire pour tenir un bon FPS.

    Les cylindres en openGL prennent vraiment beaucoup de ressource...

    Par exemple, pour dessiner un objet comme ça :

    http://help.solidworks.com/2012/Fren...41_00001.image

    Vous ferez comment ?

    Edit : Enfaîte mon gros soucis est que mes cylindres sont coté avec une echelle, je les dessine avec des vrai diamètre.
    La question que je me pose est :
    Aujourd'hui je dessine directement les cylindres au diamètre donc je dois calculer un cos et un sin à chaque fois.
    Mais pourquoi pas appliquer le diamètre via le scalef directement ? comme ça je me retrouve avec un cos et sin fixe.

  5. #5
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 034
    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 034
    Billets dans le blog
    12
    Par défaut
    Sinon, tu jettes ces antiquités de glBegin, glEnd, glVertex... Pour faire de l'OpenGL 2.x au moins, avec des VBO, et tu initialiseras tes VBO avec les bonnes valeurs, à l'initialisation, ou au changement de modèle, et à ton affichage tu n'auras ni boucle, ni calculs, juste un draw call.

    EDIT:

    Et pour tes soucis de côtes, tu crées un simple cylindre de diamètre 1, de hauteur 1, et tu le mets à l'échelle avec des matrices de tranformation.
    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).

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 49
    Par défaut
    Je vais regarder ça, merci à vous

Discussions similaires

  1. Réponses: 13
    Dernier message: 22/02/2008, 18h55
  2. Optimiser code VBA
    Par willytito dans le forum VBA Access
    Réponses: 5
    Dernier message: 19/11/2007, 09h49
  3. Choix de l'execution du code OpenGL : GPU ou CPU ?
    Par Invité dans le forum OpenGL
    Réponses: 2
    Dernier message: 29/11/2006, 16h56
  4. Réponses: 3
    Dernier message: 19/04/2006, 21h02
  5. Réponses: 7
    Dernier message: 12/05/2004, 22h27

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