Un triangle

    Pour l'instant aucun appel a OpenGL n'a ete effectue. Le but maintenant est d'afficher le classique triangle OpenGL, avec un coin rouge, une autre vert et le dernier bleu.

  1. Il faut d'abord creer un Viewport, c'est-a-dire creer un point de vue sur une scene. Cela peut se faire a plusieurs endroit, mais le meilleur c'est dans OnSize (ClassWizard) pour que l'utilisateur puisse redimensionner la fenetre.

    void CTutorialView::OnSize(UINT nType, int cx, int cy)
    {
        CView::OnSize(nType, cx, cy);
       
        // TODO: Add your message handler code here
        GLsizei width, height;
        GLdouble aspect;

        width = cx;
        height = cy;

        if (cy==0)
            aspect = (GLdouble)width;
        else
            aspect = (GLdouble)width/(GLdouble)height;

        glViewport(0, 0, width, height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0.0, 500.0 * aspect, 0.0, 500);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glDrawBuffer(GL_BACK);
    }

    Quelques precisions sur les points d'OpenGL qui apparaissent ici :
    - tout ce qui concerne OpenGL commence par "gl"
    - les types de donnees OpenGL doivent etre utilises pour la portabilite et les futures evolutions, mais pour l'instant GLdouble correspond a double, GLfloat a float, etc...
    - les fonctions sont appelees les unes a la suite des autres, la programmation ressemble a un script

    Pour le role des fonctions utilisees, le mieux est de consulter les "man pages" par ordre alphabetique ou par theme (ca c'est du tutorial :-) ), sinon afites comme moi : copier-coller.

    A savoir absolument : tout API 3D est a base de matrices 4x4, et les vecteurs ont 4 composantes (3 coordonnes dans l'espace + couleur). Dans OpenGL il y a trois matrices : MODELVIEW, PROJECTION, et TEXTURE. Dans la grande majorite des cas, seule la premiere est utilisee directement : elle permet de modifier le point de vue, la position des objets...
  2. Maintenant il est possible de dessiner dans OnPaint (ClassWizard) :

    void CTutorialView::OnPaint()
    {
        CPaintDC dc(this); // device context for painting
       
        // TODO: Add your message handler code here
        glMatrixMode(GL_MODELVIEW);
        glClear(GL_COLOR_BUFFER_BIT);

        glBegin(GL_POLYGON);
            glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
            glVertex2f(100.0f, 50.0f);
            glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
            glVertex2f(275.0f, 400.0f);
            glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
            glVertex2f(450.0f, 50.0f);
        glEnd();

        glFlush();

        SwapBuffers(dc.m_ps.hdc);
        // Do not call CView::OnPaint() for painting messages
    }

    Compilez et observez le resultat : un beau triangle.
    Tutorial2.jpg (10048 bytes)

    Comme les fonctions utilisees ici sont les plus importantes, quelques details :
    - glClear efface les buffers precises en parametres, ici le "color_buffer" qui correspond au contenu de la fenetre (ce qu'on voit)
    - toute sequence de dessin est comprise entre glBegin et glEnd, et glBegin determine quelle primitive est utilisee (voir les pages du man pour la liste des primitives). Attention : RIEN n'est dessine : il s'agit juste d'une liste d'instructions a faire !
    - l'affichage se fait avec la fonction glFlush() qui execute toutes les sequences d'un coup
    - si le double buffering est actif (c'est le cas ici, car sinon c'est pas beau), il faut swapper les buffers...
    - vertex signifie point
    - color signifie couleur :-)

    Les fonctions ont parfois un nombre de parametres variables, et de types differents, comme par exemple glVertex. Pour la liste, voir encore les pages man. La regle est que le chiffre indique le nombre de parametres, la lettre le type (f pour float, d pour double...). Comme OpenGL est en C, il n'y a pas la surcharge du C++, c'est bien dommage.

    Et Voila ! Vous pouvez maintenant dessiner tout ce que voulez, mais en 2D me direz vous. Eh bien non parce que la 3D c'est exactement la meme chose avec des glVertex3f et quelques autres petites choses a changer.

    Code source : Tutorial2.zip

    Etape precedente     Etape suivante