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 :

Oscilloscope


Sujet :

OpenGL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Oscilloscope
    Bonjour,

    Je suis en train de développer une interface graphique pour un oscilloscope sous linux.
    Je ne suis pas novice en programation, mais je débute en opengl et j'ai quelques problèmes pour l'affichage temps réel de mes courbes.

    En effet, j'ai recréé un écran d'oscilloscope en arrière plan (le quadrillage habituellement imprimé sur les écrans des oscilloscopes pour marquer les divisions...), et je voudrai afficher mes courbes par dessus.
    Seulement, a chaque fois que je veux dessiner une de mes courbes, il me faut redessiner l'écran (arrière plan)... et cela reste long...

    J'aimerai donc savoir si il est possible de creer un e sorte de buffer pour les courbes uniquement, et de mettre a jour uniquement le buffer des courbes (par un glFlush par exemple), sans redessiner l'arrière plan a chaque fois...

    J'aimerai aussi connaitre vos astuces pour avoir un affichage tres rapide en 2d... ceci est extrêmement important dans le cadre de mon application, puisques les données transmisses par l'oscillo doivent etres affichées/mise a jour en temps réel (c'est a dire a la vitesse de rafraichissement de l'écran, soit 75Hz environ)...

    voici mon code :


    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    #include <stdio.h>
    #include <stdlib.h>
     
    #include <GL/glut.h>
    #include <math.h>
     
    #define width 640
    #define height 480
    #define h_scale 5
    #define w_scale 5
    #define grad_size 0.02
    #define subdiv_nb 2
     
    //affichage de la grille (arrière plan, constitué de deux parties, les axes et le quadrillage)
    void display_grid(void)
    {
      int i=0;
      int j=0;
     
     
     
     
     
      //first grid
      glBegin(GL_POINTS);
      glColor3f(0.0,0.5,0.0);
      for(i=1; i<= 2*w_scale*subdiv_nb; i++)
      {
        for(j=1; j<= 2*h_scale*subdiv_nb; j++)
        {
          glVertex2f(((1/((GLfloat)w_scale*subdiv_nb))*(GLfloat)i)-1.0,((1/((GLfloat)h_scale*subdiv_nb))*(GLfloat)j)-1.0);
        }
      }
     
      //second grid
      glColor3f(0.0,0.8,0.0);
      for(i=1; i<= 2*w_scale; i++)
      {
        for(j=1; j<= 2*h_scale; j++)
        {
          glVertex2f(((1/((GLfloat)w_scale))*(GLfloat)i)-1.0,((1/((GLfloat)h_scale))*(GLfloat)j)-1.0);
        }
      }
      glEnd();
     
      glBegin(GL_LINES);
     
      glColor3f(0.0,0.8,0.0);
     
      glVertex2f(-1.0,0.0);
      glVertex2f(1.0,0.0);
      glVertex2f(0.0,-1.0);
      glVertex2f(0.0,1.0);
     
      for(i=1; i<= 2*w_scale; i++)
      {
        glVertex2f(((1/(GLfloat)w_scale)*(GLfloat)i)-1.0,grad_size);
        glVertex2f(((1/(GLfloat)w_scale)*(GLfloat)i)-1.0,-grad_size);
      }
      for(i=1; i<= 2*h_scale; i++)
      {
        glVertex2f(-grad_size,((1/(GLfloat)h_scale)*(GLfloat)i)-1.0);
        glVertex2f(grad_size,((1/(GLfloat)h_scale)*(GLfloat)i)-1.0);
      }
      glEnd();
     
     
     
    }
     
    //affichage des courbes : ici c'est simplement un ensemble de sinusoides
    void display_curves(int valeur)
    {
      int i=0;
      float decalage;
      decalage = (float)valeur/100;
      //sinusoide pour le test
      glBegin(GL_LINE_STRIP);
      glColor3f(1.0,0.0,0.0);
      for(i=0; i<=200; i++)
      {
        glVertex2f(((float)i)/100.0-1.0, cos((float)i/10.0)+decalage);
     
      }
      glEnd();
    }
     
     
    //fonction d'affichage principale
    void display()
    {
      int i=0;
      glClear(GL_COLOR_BUFFER_BIT);
      //display_grid();
      for(i=0; i<100; i++)
      {
        display_grid();
        display_curves(i);
        glutSwapBuffers();
      }
    }
     
    void Reshape()
    {
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      gluOrtho2D(-1,1,-1,1);
    }
     
    int WindowName;
     
     
    int main(int argc, char *argv[])
    {
     
     
      //paramètre d'initialisation de la fenetre avec glut
      glutInit(&argc,argv);
      glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH);
      glutInitWindowPosition(200,200);
      glutInitWindowSize(width,height);
      WindowName=glutCreateWindow("ma première fenetre opengl");
     
      //début du programme principal avec glut
      //glutReshapeFunc(Reshape);
     
        glutDisplayFunc(display);
        glutMainLoop();
     
     
      //fin normale
      return EXIT_SUCCESS;
    }

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    bonjour,

    à ma connaissance tu es obligé de tout redessinner pour la simple raison que puique tes courbes bougent, les parties visible de ton fond aussi.
    Cela ce fait tres rapidement, à moins que ton fond soit super lourd. Pour que l'affichage soit fluide, il te faut utiliser un affichage avec double buffer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE) ;
    Par ailleur, je ne sais pas si avec tes calculs de courbes tu pourras en permanence garder un rafraichissement en 75Hz.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    J'utilise déja le double buffer, et pour la fludité des calculs il n'y a pas de problème puisque qu'ils sont hardwares et seront fait par le module electronique a l'extérieur du pc...

    En effet je pense que mon fond est relativement lourd, puisque la grille peut devenir tres fine, et c'est bien pour cela que j'aimerai éviter de le redessiner a chaque fois... mais je ne peux pas tellement changer la forme de la grille...

    Je vais essayer d'utiliser les listes d'affichage pour accelerer le tout, mais mon probleme n'est toujours pas résolu ...

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Je proposerais un "Render to texture"... Tu rends ta grille d'oscillo une seule fois et la transforme en texture. Ensuite tu map ta texture sur un quad. Tu n'aura plus qu'a dessiner ta (tes) courbe(s) devant.

    La fonction display_grid() ne sera ainsi appelée qu'une seule fois.

    Le seul problème est que tu ne devra pas changer d'échelle (en rapport avec le quadrillage) qui devient fixe une fois pour toute. Tu pourra toujours re-rendre le quadrillage si tu devais changer d'échelle.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    cette derniere solution me plait bien en effet!!!
    Si je comprends bien je n'aurai plus que deux elements a afficher non??? Le quad avec la texture, et la courbe??
    Je vais tenter le coup...

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par jollo
    cette derniere solution me plait bien en effet!!!
    Si je comprends bien je n'aurai plus que deux elements a afficher non??? Le quad avec la texture, et la courbe??
    Je vais tenter le coup...
    Exact, vu ton application, pense à enlever le buffer de profondeur (s'il est mis en place), tu n'en aura pas besoin...

    Jc

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Ca y est c'est bon!!!

    J'ai réussit en utilisant simplement les display lists.... J'arrive à afficher 1000 courbes de 200 points en 5s, soit a 200Hz!!!! ce qui est suffisant pour mon application!!!! Je vais meme pouvoir augmenter un peu la résolution (a 400 points...) si le débit du port série (et peut etre usb dans une future version ) le permet!!!

    En tout cas merci à tous pour votre aide!!!

  8. #8
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Félicitation,

    oublis pas la mention "Résolu"
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

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

Discussions similaires

  1. programmer un oscilloscope
    Par wurst dans le forum Linux
    Réponses: 7
    Dernier message: 14/10/2014, 01h33
  2. transfert de données d'un oscilloscope !
    Par fabricio94 dans le forum C++
    Réponses: 2
    Dernier message: 05/04/2007, 14h29
  3. oscilloscope hameg 407
    Par medchennani dans le forum Delphi
    Réponses: 1
    Dernier message: 03/04/2007, 11h24
  4. RS232 oscilloscope
    Par didi59650 dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 06/04/2006, 11h11
  5. [MFC] Réaliser l'affichage d'un oscilloscope
    Par Racailloux dans le forum MFC
    Réponses: 7
    Dernier message: 04/03/2005, 00h52

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