Introduc4on à OpenGL

Transcription

Introduc4on à OpenGL
Introduc)on à OpenGL Introduc)on à OpenGL •  OpenGL est une librairie graphique de bas niveau pour tracer des objets geometriques en dimension 2 ou 3. •  Les objets complexes sont tracés a par)r de combinaisons d'objets elementaires. OpenGL est independant du systeme et du langage avec lesquels on l'u)lise. •  OpenGL se lie avec les langages C ou C++ et avec d'autres langages tels que Java (package Java3D) ou Tcl. •  OpenGL n'a pas de capacite de fenetrage. •  OpenGL est une machine a etats finis. •  A tout instant, on connait les parametres graphiques courants du systeme (transforma)on, lumiere...). lls sont u)lises pour le trace courant. Pipeline Graphique Les étapes du pipeline de rendu graphique 1.  Defini)on du modèle mathema)que d'un objet graphique 2.  Defini)on d'un point de vue de la scene graphique 3.  Calcul des couleurs et des lumières 4.  Rasterisa)on (transforma)on en points lumineux) Les exemples donnés dans ce cours reposent sur une programma)on en C/C++ et u)lisent la librairie GLUT pour la ges)on des fenetres et des evenements. Pipeline Graphique
Transforma)ons de modélisa)on Modèle de la
scène
Illumina)on (Shading) Transforma)ons d’affichage Clipping Transforma)on écran (Projec)on) Pixelisa)on (Rasteriza)on) Visibilité / Affichage Image 3D
Système de coordonnées
Transforma)ons de modélisa)on Repère objet
Illumina)on (Shading) Repère scène
Transforma)ons d’affichage Clipping Transforma)on écran (Projec)on) Pixelisa)on (Rasteriza)on) Visibilité / Affichage Repère caméra
Repère caméra
normalisé (NDC)
Espace écran
Premier Exemple •  Tracé d´un rectangle blanc sur fond noir Premier Exemple Créa)on de la fenêtre graphique. Defini)on de la taille de la fenetre et de sa posi)on. Crea)on de la fenetre en lui a^ribuant un )tre. glutInitWindowSize(WIDTH, HEIGHT); glutInitWindowPosi)on(0, 0); glutCreateWindow("Premier exemple : carré"); Défini)on de trois fonc)ons de call-­‐back: Ce sont des fonc)ons qui sont automa)quement appelees lorsque les evenements correspondants sont interceptes : window_display est appelee chaque fois que l'on doit redessiner la fenetre, window_reshape est appelee chaque fois que l'on redimensionne la fenetre, window_key est appelee chaque fois qu'une touche clavier est pressee. glutDisplayFunc(&window_display); glutReshapeFunc(&window_reshape); glutKeyboardFunc(&window_key); Premier exemple Tracé graphique. A l'ini)alisa)on, on definit la couleur du fond qui sera u)lisee lorsqu on effacera le fond par glClear(GL_COLOR_BUFFER_BIT). GLvoid initGL() { glClearColor(RED, GREEN, BLUE, ALPHA);
} Le trace consiste a definir une couleur (le blanc) et une forme : un polygone a quatre sommets dont les sommets sont enumeres par glVertex3f. glColor3f(1, 1, 1); glBegin(GL_POLYGON); glVertex3f(-­‐1, -­‐1, 0); glVertex3f(1, -­‐1, 0); glVertex3f(1, 1, 0); glVertex3f(-­‐1, 1, 0); glEnd(); Enfin, on indique a OpenGL de tracer la scene graphique qui vient d etre definie. glFlush(); Pipeline graphique Avant d’etre trace, un point passe par : 1. 
2. 
3. 
modele de vue (defini)on mathema)que des objets), projec)on (point de visualisa)on de la scene), port de vue (applica)on a une zone d'ecran). 1. 
le port de vue est modifie pour que la scene represente toujours la meme frac)on de la fenetre, la projec)on est modifiee pour compenser la modifica)on de la taille du port de vue,le volume de projec)on doit etre change dans son rapport largeur sur hauteurpour conserver les propor)ons des objets geometriques. En cas de redimensionnement de la fenetre graphique, les transforma)ons de modele de vue et de projec)on sont redefinies : 2. 
Premier exemple Redimensionnement de la fenêtre graphique GLvoid window_reshape(GLsizei width, GLsizei height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIden)ty(); glOrtho(-­‐2.0, 2.0, -­‐2.0, 2.0, -­‐2.0, 2.0); // toutes les transforma)ons suivantes s´appliquent au modèle de vue glMatrixMode(GL_MODELVIEW); } Boucle des évènements Ges)on des événements clavier et souris, par exemple la recep)on des evenements suivants : –  touches clavier a ou A , –  touches speciales fleche vers le haut ou vers la gauche et saut d'une page vers le haut, –  clicks souris gauche (touche enfoncee) et click droit (touche relevee et majuscule ac)ve). Exemple d´exécu)on $ opengl-­‐boucle-­‐evt Touche 'a' Touche [<-­‐] La touche spéciale 102 n´est pas ac)ve. Touche [^^] La touche spéciale 105 n´est pas ac)ve. Bouton gauche enfoncé. Bouton droite relevé avec touche majuscule ac)ve. Boucle des évènements Le programme principal con)ent la boucle prinicipale de ges)on des evenements u)lisateur (librairie GLUT). glutMainLoop(); Défini)on de trois fonc)ons de call-­‐back: Trois fonc)ons de call-­‐back sont enregistrees pour capturer et traiter ces evenements : – 
– 
– 
la ges)on des événements clavier glutKeyboardFunc(&window_key); la ges)on des événements clavier (touches spéciales telles que les -­‐>) glutSpecialFunc(&window_special_key); la ges)on des événements souris glutMouseFunc(&window_mouse); Boucle des évènements Exemple de fonc)on de call-­‐back : ges)on d´une touche ordinaire Un choix selon la valeur de la touche pressee. GLvoid window_key(unsigned char key, int x, int y) { switch (key) { case KEY_ESC: exit(1); break; case 'a': case 'A': prinz ("Touche 'a'\n"); break; default: prinz ("La touche %d n'est pas ac)ve.\n", key); break; } } Syntaxe des commandes OpenGL Syntaxe générale des commandes graphiques OpenGL •  Toutes les commandes OpenGL commencent par gl. •  Celles qui commencent par glut sont de la librairie GLUT. Elles ne sont pas implementees sur toutes les plate-­‐formes acceptant OpenGL. •  Les commandes sont generalement encadrees par un glBegin() (avec une constante en GL_...) et un glEnd(). glColor3f(1, 1, 1); glBegin(GL_POLYGON); glVertex3f(-­‐1, -­‐1, 0); glVertex3f(1, -­‐1, 0); glVertex3f(1, 1, 0); glVertex3f(-­‐1, 1, 0); glEnd(); ll est recommandé d’indenter entre un glBegin() et un glEnd(). Syntaxe des commandes OpenGL Flexibilité sur les types des arguments Certaines noms de commandes OpenGL ont de 1 a 3 le^res finales qui denotent le nombre et le type de leurs parametres. • Premier caractere : nombre de parametres (2, 3, ou 4), • Deuxieme(et troisieme eventuellement) caractere : type des argument • 
• 
• 
• 
• 
• 
• 
• 
• f : float • d : double float • s : signed short integer • i : signed integer • b : character • ub : unsigned character • us : unsigned short integer • ui : unsigned integer • Dernier caractere (v) : argument sous forme d'un vecteur au lieu d'une liste de scalaires. Syntaxe des commandes OpenGL Cas de la commande glColor*() Chaque commande OpenGL a une documenta)on associee accessible en ligne h^p://www.opengl.org/developers/documenta)on/specs.html Lorsqu’on nomme une commande typee, on omet les le^res de typage en les remplacant par une *. par exemple glColor* désigne glColor3b, glColor3d, glColor3f, glColor3i, glColor3s,glColor3ub, glColor3ui, glColor3us, glColor4b, glColor4d, glColor4f,glColor4i, glColor4s, glColor4ub, glColor4ui, glColor4us, glColor3bv, glColor3dv, glColor3fv, glColor3iv, glColor3sv, glColor3ubv,glColor3uiv, glColor3usv, glColor4bv, glColor4dv, glColor4fv,glColor4iv, glColor4sv, glColor4ubv, glColor4uiv, glColor4usv Trois exemples: On a la même sélec)on de couleur (le blanc opaque) avec : // 3 floats glColor3f(1.0, 1.0, 1.0); // 3 unsigned bytes glColor3ub(255, 255, 255); // 4 floats sous forme de vecteur double vecteur[4] = {1.0, 1.0, 1.0, 1.0}; glColor4dv( v ); Primi)ves Primi)ves Tracé d´une primi)ve géométrique Toute primi)ve se trace au moyen d'une suite de sommets donnes par glVertex et situes entre un glBegin() et un glEnd(). // figure en bas à droite glBegin(GL_TRIANGLE_FAN); glVertex2f(-­‐1.0, 1.0); glVertex2f(1.0, 2.0); glVertex2f(2.0, 0.0); glVertex2f(1.0, -­‐1.0); glVertex2f(-­‐2.0, -­‐2.0); glEnd(); Le trace effec)f d'une primi)ve n'a lieu que lors de la rencontre d'une commande glFlush() Variable d’état Le trace graphique est affecté par la valeur des variables d’état qui consituent l’environnement graphique courant. Variables de mode ll existe deux modes d'ombrage definies par la commande glShadeModel qui modifie la variable d'etat de mode GL_SHADE_MODEL : –  glShadeModel(GL_SMOOTH) : ombrage doux, –  glShadeModel(GL_FLAT) : ombrage plat (la valeur par defaut Variable d’état Variables booléennes Les variables booleennes sont ac)vees et desac)vees au moyen des commandes glEnable() et glDisable(). • GL_POINT_SMOOTH : trace des points avec le filtrage correct ou an)aliases, • GL_LINE_SMOOTH : trace des droites avec le filtrage correct ou an)aliases, • GL_LINE_STIPPLE : trace en poin)lles pour les droites. Exemple // Exemple en haut à droite glEnable(GL_POINT_SMOOTH); Variable d’état Variables d´état valuées Des commandes specifiques perme^ent de changer leur valeur. Leur valeur est accessible au moyen des commandes glGetBooleanv(), glGetDoublev(), glGetFloatv(), ou glGe)ntegerv(). Exemple : la couleur glColor3f(0.0, 0.0, 0.0);
Noir glColor3f(1.0, 0.0, 0.0);
Rouge glColor3f(0.0, 1.0, 0.0);
Vert glColor3f(0.0, 0.0, 1.0);
Bleu glColor3f(1.0, 1.0, 0.0);
Jaune glColor3f(0.0, 1.0, 1.0);
Cyan glColor3f(1.0, 0.0, 1.0);
Magenta glColor3f(1.0, 1.0, 1.0);
Blanc Variable d’état Autres variables valuées Taille des points : glPointSize(GLfloat taille) ou taille est la taille en pixel souhaitee pour le trace des points. Largeur des lignes : glLineWidth(GLfloat largeur) ou largeur est la largeur en pixel souhaitee pour le trace des lignes. Lignes poin)llees : glLineS)pple(GLint facteur, GLushort patrOn) ou patron est une serie de 16 bits a 0 (pas de trace) ou 1 (trace). Ce patron est repete autant que necessaire pour le trace d'une ligne. Le parametre facteur, entre 0 and 255, est un coefficient de dilata)on du patron. GL_LINE_STIPPLE doit etre ac)ve par glEnable(GL_LINE_STIPPLE). Variable d’état Exemple de ligne poin)llée // Ac)ve le poin)llé glEnable(GL_LINE_STIPPLE); // Définit le patron de poin)llés 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 glLineS)pple(2, 0x0C0F); glBegin(GL_LINES); glVertex2f(-­‐2.0, 0.0); glVertex2f(2.0, 0.0); glEnd(); Transforma)on Géometrique Variable d´état : Mode de transforma)on La commande glMatrixMode(GLenum mode) sert a changer la valeur de la variable d'etat GL_MATRIX_MODE. Trois valeurs possibles GL_MODELVIEW, GL_PROJECTION, et GL_TEXTURE. •  Composi)on des transforma)ons Lorsque glMatrixMode() est appelee, toutes les transforma)ons suivantes affectent la matrice de ce mode en se composant les unes aux autres. Dans la suite, nous ne considerons que les composi)ons de transforma)ons sur la matrice de modele de vue. Transforma)on Géometrique Transla)on La commande glLoadIden)ty() sert a reini)aliser la matrice courante a la matrice iden)te. La commande glTranslate(TYPE x, TYPE y, TYPE z) mul)plie la matrice courante par une matrice qui deplace un objet de (x, y, z) (ou qui, en d'autres termes, deplace l'origine du meme vecteur). // Réini)alisa)on de la matrice de modèle de vue glLoadIden)ty(); // transla)on horizontale du triangle d'origine -­‐> triangle rouge glColor3f(1.0, 0.0, 0.0); glTranslatef(1.5, 0, 0); triangle(); Transforma)on Géometrique Rota)on La commande glRotate(TYPE angle, TYPE x, TYPE y, TYPE z) mul)plie la matrice courante par une matrice qui fait tourner un objet d une angle angle autour de l’axe passant par l’origine et de vecteur directeur (x, y, z) (ou qui, en d'autres termes, fait tourner le repere du meme angle autour du meme axe). // transla)on ver)cale du triangle d'origine -­‐> contour triangle vert glColor3f(0.0, 1.0, 0.0);
glTranslatef(0, 1.5, 0); triangleContour(); glColor3f(0.0, 0.0, 1.0);
glRotatef(30, 0, 0, 1); triangle(); // rota)on de 30 degrés autour de Oz dans le repère translaté de (0, 1.5, 0) // (donc centré au milieu de l'hypothénuse) -­‐> triangle bleu Transforma)on Géometrique Changement d´échelle La commande glScale(TYPE x, TYPE y, TYPE z) mul)plie la matrice courante par une matrice qui fait trois homothe)es selon les trois axes du repere de rapports (x, y, z) (ou qui, en d'autres termes, mul)plient les vecteurs unitaires des memes rapports). A^en)on, si un des parametres du changement d'echelle est nul, ce^e dimension est perdue jusqu'au prochain glLoadIden)ty(). // transla)on horizontale du triangle d'origine -­‐> contour triangle jaune glColor3f(1.0, 1.0, 0.0); glTranslatef(-­‐1.5, 0, 0); triangleContour(); // changement d´échelle de 1/2 sur chaque axe dans le repère translaté de (-­‐1.5, 0, 0) (donc centré au milieu de l'hypothénuse) -­‐> triangle cyan glColor3f(0.0, 1.0, 1.0); glScalef(.5, .5, .5); triangle(); Transforma)on Géometrique Changement d´échelle de rapport néga)f : symtétrie Un changement d'echelle nega)f par rapport a un axe revient a une symetrie par rapport au plan perpendiculaire composée avec une homothe)e de rapport posi)f. // transla)on ver)cale du triangle d'origine -­‐> contour triangle magenta glColor3f(1.0, 0.0, 1.0);
glTranslatef(0, -­‐1.5, 0);
triangleContour(); glColor3f(0.5, 0.5, 0.5);
glScalef(1, -­‐1, 1);
triangle(); // changement d´échelle de -­‐1 sur Oy et 1 sur Ox et Oz // (une symétrie par rapport à xOz) // dans le repère translaté de (0, -­‐1.5, 0) // (donc centré au milieu de l'hypothénuse) -­‐> triangle gris Transforma)on Géometrique Commande glViewport La transforma)on de port de vue revient a choisir la taille du papier pour le )rage d'une photographie. La commande glViewport(GLint x, GLint y, GLsizei largeur, GLsizei hauteur) place le coin haut gauche du port de vue en (x, y) et lui donne pour taille (largeur, hauteur). Ce^e commande est generalement u)lisee en redimensionnement de la fenetre pour conserver la totalite de l'image dans la fenetre. Transforma)on de Port de Vue Distorsion Si la transforma)on de port de vue n’est pas dans les memes propor)ons que le rectangle proche du volume de vue, l'image subit une distorsion. Projec)on Orthogonale Le volume de vue dans une projec)on orthographique est un parallelepipede rectangle. Propriété •  Conserve le parallelisme quelle que soit l'orienta)on des droites. •  Conserve les rapports de longueurs sur des droites paralleles. Commande glOrthO •  La commande glOrtho(GLdouble le•, GLdouble right, GLdouble bo^om, GLdouble top, GLdouble near, GLdouble far) definit -­‐ les dimensions des rectangles de clipping (proche et lointain) -­‐ leurs posi)ons sur Oz. Projec)on en Perspec)ve Le volume de vue dans une projec)on orthographique est un tronc de pyramide. Propriété •  Ne conserve pas le parallelisme : •  des droites paralleles convergent vers un point de fuite. •  Les objets lointains apparaissent plus pe)ts que les objets proches. Commande glFrustum La commande glFrustum(GLdouble le•, GLdouble right, GLdouble bo^om, GLdouble top, GLdouble near, GLdouble far) definit -­‐ les dimensions du rectangle de clipping proche -­‐ les posi)ons des rectangles de clipping proche et lointain sur Oz. Ces distances doivent etre posi)ves. Display Lists U)lité des Display lists Les display lists servent a enregistrer en memoire des commandes qui seront executees ulterieurement dans cet ordre. Pour des objets traces plusieurs fois, elles perme^ent d'effectuer les calculs une fois pour toutes et ainsi op)miser les programmes. De plus, elles u)lisent, sur les cartes graphiques appropriees, des mecanismes d’acces memoire (DMA) accelerant le rendu graphique. Défini)on des Display lists Les commandes glNewList(GLuint name, GLenum mode) et glEndList() definissent la display list d'iden)ficateur name. L’iden)ficateur name est un en)er unique. ll peut etre genere par la commande glGenLists(GLuint nbListes). GLuint displayList; displayList = glGenLists(1); Display Lists Deux modes sont possibles : -­‐ GL_COMPILE les commandes sont compilees sans etre executees, -­‐ GL_COMPILE_AND_EXECUTE les commandes sont compilees et executees. Exemple Défini)on de la display list My_Circle #define My_Circle 1 glNewList(My_Circle, GL_COMPILE); glBegin(GL_POLYGON); // Génère les points du cercle for(i = 0; i < 100; i++) { cosine = cos(i * 2 * PI / 100.0); sine = sin(i * 2 * PI/100.0); glVertex2f(cosine, sine); } glEnd(); // Fin de la défini)on d´un cercle glEndList(); Invoca)on de la display list My_Circle glCallList(My_Circle); Tracé d'un cube Tracé d'un cube •  Instruc)ons pour le masquage des par)es cachés en 3D •  L'effacement des par)es cachees est gere dans OPenGL au moyen du Z-­‐buffer. •  Alloca)on du Z-­‐buffer. A placer dans l'ini)alisa)on d'OpenGL. –  glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH); •  Variable d´état d´ac)va)on du Z-­‐buffer. A placer dans l'ini)alisa)on d'OpenGL. –  glEnable(GL_DEPTH_TEST); •  Effacement du Z-­‐buffer. A placer avant chaque dessin de la scene. –  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Anima)on Anima)on d'un cube par les touches + et – Principe Une anima)on est obtenue en modifiant progressivement les parametres d'un affichage et en retracant la figure apres chaque modifica)on. En raison de la persistence re)nienne, l observateur voit une scene en mouvement con)nu. Dans le programme ci-­‐dessus, l'angle de rota)on du cube est modifie par l'appui sur les touches + et -­‐. Anima)on Instruc)ons pour l'anima)on par double buffer L'anima)on est geree par deux buffers : -­‐ un buffer de trace non visible (le buffer arriere) -­‐ un buffer visible (le buffer avant). Une fois le nouveau trace effectue, on permute les deux buffers au moyen de la commande glutSwapBuffer() (librairie GLUT) apres glFlush(). Alloca)on du double buffer À placer dans l´ini)alisa)on d´OpenGL. glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); Échange des deux buffers À placer après chaque dessin de la scène. glutSwapBuffers(); Modifica)on des valeurs du tracé Apres chaque modifica)on des valeurs du trace, il faut redemander un affichage glutpostRedisplay(); Anima)on Anima)on automa)que d'un cube par une fonc)on de call-­‐back d'a^ente Exemple: anima)on d un cube en rota)on automa)que. Défini)on d´une fonc)on de call-­‐back d´a^ente On definit une fonc)on de call-­‐back d'a^ente qui est appelee des que le systeme ne traite plus un autre evenement ou un autre call-­‐back. glutIdleFunc(&window_idle); Ce^e fonc)on incremente l'angle de rota)on et demande le reaffichage. GLvoid window_idle() { angle++; glutPostRedisplay(); } Anima)on Selon les machines, une meme anima)on automa)que s’executera plus ou moins vite si l'on ne controle pas le rythme de mise a jour. Défini)on d'une vitesse maximale d'anima)on On definit un intervalle minimal de rafraichissment de 40ms. void anime(int pas){ /* ac)on à effectuer en fonc)on du numéro d'image */ if(pas == 2000) return; /* redemande l'affichage */ glutPostRedisplay(); pas++; /* rappellera la fonc)on d'anima)on anime dans 40 millisecondes au pus tôt */ glutTimerFunc( 40, anime, pas ); } A^en)on, la fonc)on de call-­‐back definie par glutTimerFunc n est appelee qu une seule fois. Anima)on Anima)on automa)que Quelques principes pour reussir une anima)on: •  temporiser les anima)ons avec la fonc)on glutTimerFunc •  avoir une variable globale unique t pour le temps, •  lire le temps machine entre deux frames pour voir si le rythme de mise a jour est suffisant (au minimum 30 fps), •  prevoir des procedures d'op)misa)on en cas de charge trop forte (niveaux de detail, maillage adapta)f, remplacement d objets par des imposteurs...). Anima)on Anima)on d'un cube par déplacement de la souris Le programme src/opengl-­‐anim6.c fait une anima)on d’un cube par deplacement de la souris avec le bouton gauche enfonce. Défini)on d´une fonc)on de call-­‐back de ges)on des clicks souris (avant un déplacement) glutMouseFunc(&window_mouseFunc); On note le lieu ou a lieu un click souris de sorte a gerer les mouvements rela)fs de la souris lors de son deplacement. GLvoid window_mouseFunc(int bu^on, int state, int x, int y) { } • 
if (state == GLUT_DOWN && bu^on == GLUT_LEFT_BUTTON) { mouse_pos_x = x; mouse_pos_y = y; } Anima)on Anima)on par déplacement de la souris (suite et fin) Défini)on d´une fonc)on de call-­‐back de ges)on des déplacement de la souris glutMo)onFunc(&window_mo)onFunc); Ce^e fonc)on modifie l'angle de rota)on en fonc)on des deplacements rela)fs de la souris et demande le reaffichage. GLvoid window_mo)onFunc(int x, int y) { angle_x += y -­‐ mouse_pos_y; angle_y += x -­‐ mouse_pos_x; mouse_pos_x = x; mouse_pos_y = y; glutPostRedisplay(); } •  Eclairement Instruc)ons pour définir un éclairement L'eclairement requiert : -­‐ une ou plusieurs sources lumineuses, -­‐ des proprietes lumineuses sur les objets. Source lumineuse: A placer dans l'ini)alisa)on d'OpenGL et definie par une posi)on et une couleur (blanc par defaut). // Crée une source de lumière direc)onnelle glLighzv(GL_LIGHT0, GL_POSITION, posi)on); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); Variable d´état d´ombrage doux (vs. Plat) A placer dans l'ini)alisa)on d'OpenGL. // Définit un modèle d´ombrage glShadeModel(GL_SMOOTH); Eclairement Instruc)ons pour définir un éclairement (suite et fin) Défini)on des caractéris)ques lumineuses des objets (propriétés matérielles) Par souci de simplicite, on donne comme propriete de lumiere ambiante et diffuse la couleur qui est definie par un appel a glColor(). // La variable d´état de couleur GL_AMBIENT_AND_DIFFUSE // est définie par des appels à glColor glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); Pour chaque objet, on definit les proprietes materielles de la couleur speculaire et du degre de brillance. glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess); Eclairement Défini)on de propriétés matérielles Défini)on directe des propriétés matérielles avec une transparence On donne quatre composantes: ambiente, diffuse, speculaire et brillance. Les trois premieres sont definies par trois composantes de couleur et une Transparence. GLfloat emeraldAmb[] = {0.0215, 0.1745, 0.0215, 0.5}; GLfloat emeraldDiff[] = {0.07568, 0.61424, 0.07568, 0.5}; GLfloat emeraldSpec[] = {0.633, 0.727811, 0.633, 0.5}; GLfloat emeraldExp = 76.8; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, emeraldAmb); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, emeraldDiff); lMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, emeraldSpec); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, emeraldExp); ll faut ac)ver la ges)on de la transparence. glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); Texturage Instruc)ons pour définir un texturage Le texturage requiert : -­‐ un bitmap decrivant l'image a plaquer sur les faces, -­‐ une associa)on entre les sommets d'un polygone et les coordonnees de la texture (delimitee par un rectangle [0,1]x[0,1]). Bitmap de la texture On peut la charger au moyen de la libjpeg a par)r d'un fichier jpeg. U)liser pour cela les fichiers fournis texjpeg.c et texjpeg.h. CreateTexture(g_Texture, "chaton.jpg"); Variable d´état de texturage. A placer dans l'ini)alisa)on d'OpenGL. glEnable(GL_TEXTURE_2D); texturage Instruc)ons pour définir un texturage (suite et fin) Paramètres du texturage Definissent le mode d applica)on des textures. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ou GL_BLEND); Applica)on du texturage, Definissent l'ancrage de la texture sur le polygone lors du trace. glBegin(GL_POLYGON); glTexCoord2f( 0.0 , 1.0 ); glVertex3f(0, 0, 0); glTexCoord2f( 1.0 , 1.0 ); glVertex3f(1, 0, 0); glTexCoord2f( 1.0 , 0.0 ); glVertex3f(1, 1, 0); glTexCoord2f( 0.0 , 0.0 ); glVertex3f(0, 1, 0); glEnd(); Texturage Texturage avec transparence Chargement des textures Les fichiers de textures contenant une composante alpha, on doit u)liser un format qui l accepte. On peut les charger au moyen de la libpng a par)r d'un fichier png. U)liser pour cela les fichiers fournis texpng.c et texpng.h. CreateTexturePNG(&g_Texture[0], "montagne.png" ); CreateTexturePNG(&g_Texture[1], "arbre.png" ); CreateTexturePNG(&g_Texture[2], "nuages.png" ); Ac)ver la transparence sur les textures et sur les primi)ves. A placer dans l'ini)alisa)on d'OpenGL. glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

Documents pareils