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.
- 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...
- 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.
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