La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

GRAPHISME PAR ORDINATEUR SIF-1032. Contenu du cours 2 Introduction à OpenGL (Version avant 3.x) Traçage de points Traçage de lignes Traçage de polylignes.

Présentations similaires


Présentation au sujet: "GRAPHISME PAR ORDINATEUR SIF-1032. Contenu du cours 2 Introduction à OpenGL (Version avant 3.x) Traçage de points Traçage de lignes Traçage de polylignes."— Transcription de la présentation:

1 GRAPHISME PAR ORDINATEUR SIF-1032

2 Contenu du cours 2 Introduction à OpenGL (Version avant 3.x) Traçage de points Traçage de lignes Traçage de polylignes Traçage de triangles Traçage de triangles (Version 3.x et +) Autres outils de dessin –Fenêtre du monde VS viewport Projet de session LECTURES: Chapitres 2 et 3

3 Introduction à OpenGL Le chapitre 1 du livre OpenGL Super Bible donne une vue d'ensemble des possibilités offertes par OpenGL. OpenGL est introduit au chapitre 2 (Super Bible). OpenGL est un ensemble de fonctions codées en langage de programmation C. Ces fonctions constituent un langage de commandes pour une machine virtuelle spécialisée pour la visualisation de scènes contenant des objets (logiciels) à 3 dimensions. Toutes ces fonctions commencent par "gl". En voici quelques unes: glVertex(), glColor(), glPushMatrix(), etc.

4 Introduction à OpenGL OpenGL est basé sur un modèle de type "client-serveur": Le client est le programme qui utilise les commandes OpenGL. Par exemple, un client peut écrire l’appel de fonction "glVertex3f(1.0,2.0,3.0);" dans un programme. Ce qui signifie qu'on veut passer au serveur l'information qu'un sommet est situé dans l’espace au point (1.0,2.0,3.0). Cette information est stockée dans une représentation interne au niveau du serveur. Cette représentation interne est utilisée par le code du serveur qui est responsable d'afficher les objets à l'écran.

5 Introduction à OpenGL Nous avons déjà mentionné qu'OpenGL avait comme origine la programmation de la machine graphique Iris (de SGI). Les commandes sont en fait destinées à programmer une machine de type Iris qui est simulée sur un PC. Comme le graphisme par ordinateur est très complexe, il n'est pas étonnant qu'il y ait des centaines de commandes et d'options, et plusieurs façons de réaliser le même travail. Le code de la machine OpenGL est contenu dans les fichiers Opengl32.dll, glu32.dll et glut32.dll. En plus des instructions (commandes), la machine virtuelle a aussi des registres qui maintiennent l'état actuel de la machine. Leur nombre est aussi élevé.

6 Introduction à OpenGL Les cartes graphiques existent en plusieurs modèles. Les modèles récents contiennent un processeur graphique qui permet d'accélérer les opérations d'affichage. Ainsi, le serveur OpenGL communique au pilote de la carte graphique les opérations qu’il doit exécuter. OpenGL est une API (Application Programming Interface). La programmation OpenGL est complexe à cause du fait qu'on utilise le langage C (avec une approche de bas niveau). Ainsi, il faut en général toute une série de commandes pour une opération logique souvent simple.

7 Introduction à OpenGL Les types d'OpenGL –À la page 41 de la Super Bible, on retrouve un tableau qui montre tous les types supportés par OpenGL. Par exemple, GLfloat est un float en C. –Le type "double" n’est pas supporté parce que les opérations avec des floats sont plus rapides. –Nous rappelons que pour la fonction "glVertex3f(1.0,2.0,3.0)". Le 3 signifie que le point est spécifié avec 3 coordonnées (3D) et le "f" signifie que les points sont des "floats". La librairie GLUT –La librairie GLUT est utilisée dans beaucoup d'exemples dans les livres de références. Elle offre un interface avec le système de fenêtres de l'ordinateur qui est indépendante du système d'exploitation. –Cette interface est très élémentaire et n'est jamais utilisée dans les applications professionnelles. C'est pour cette raison qu‘il est préférable d'utiliser l'interface des classes MFC

8 Introduction à OpenGL Retour sur le projet GLRect (Super Bible: page 51)

9 Introduction à OpenGL Retour sur le projet GLRect (Super Bible: page 51)

10 Introduction à OpenGL Retour sur le projet GLRect (Super Bible: page 51)

11 Introduction à OpenGL Retour sur le projet GLRect (Super Bible: page 51) Fenêtres redimensionnées

12 Introduction à OpenGL Voici quelques remarques sur le programme: –Il s'agit d'une application Win32 de type console. La fonction "main" démarre le programme. Elle initialise le mode d'affichage à un espace mémoire aussi appelé "buffer" (GLUT_SINGLE). Ensuite, on désigne la fonction "RenderScene()" pour répondre au message WM_PAINT de Windows qui est appelée lorsque le système doit redessiner. On désigne aussi la fonction "ChangeSize()" qui est appelée lorsqu'on change la taille de la fenêtre. La fonction "SetupRC()" sert à définir les propriétés de rendu (rendering context). –La fonction SetupRC() définit la couleur de fond à bleu. Les couleurs sont toujours données avec RGB (rouge, vert, bleu). Parfois, on utilise une 4 ième composante appelée "alpha" (opacité) et qui est 1 en général. On l'utilise parfois pour mélanger une couleur avec la couleur de fond. "0.5f" signifie que le nombre est un float. –La fonction "RenderScene()" trace un rectangle rouge. La fonction glRectf() place le rectangle avec z=0. On donne les coins opposés du rectangle. Notez que la fonction glRect(x1, y1, x2, y2) est équivalente à :

13 Introduction à OpenGL Voici quelques remarques sur le programme: –La fonction glOrtho() définit un volume de visualisation en 3D (viewing volume ou frustum) qui représente l'espace des éléments visuels retenus pour l'affichage (les éléments en dehors de cette zone ne sont pas affichés). –Les objets sur la frontière du volume de visualisation sont découpés (Clipping)

14 Introduction à OpenGL Les commandes envoyées au serveur OpenGL sont accumulées. La commande glFlush() sert à actualiser toutes les commandes accumulées. Dans la fonction ChangeSize(), la fonction glViewport() informe OpenGL de la taille de la fenêtre d’affichage. Ensuite, on définit le type de projection "Orthogonale". Il faut savoir qu'une projection en perspective fait se rapprocher des lignes parallèles qui s'éloignent en z. Cette projection donne l’effet de profondeur. Dans une projection orthogonale, les points sont projetés en selon l’axe z (x,y,0). La fonction glOrtho() fixe le rapport entre les unités de l'utilisateur et celle de la fenêtre:

15 Introduction à OpenGL Librairies *.lib, DLLs et fichiers *.h –La librairie GLUT n'est pas supportée par Microsoft. Aussi, vous la trouverez sur le disque du livre ou sur le site FTP du cours:

16 Introduction à OpenGL Pour utiliser les exemples de programmes il faut au préalable organiser l’environnement de travail Microsoft Visual C++.NET: –Inclure le fichier header glut.h comme suit:

17 Introduction à OpenGL Inclure le fichier librairie glut32.lib comme suit:

18 Introduction à OpenGL Inclure le fichier DLL glut32.dll dans le répertoire c:/WINNT/System comme suit:

19 Introduction à OpenGL Une autre façon consiste à indiquer à VS où sont ces éléments avec le menu Tools/Options:

20 Introduction à OpenGL Voici les fichiers *.h et *.lib que vous allez utiliser:

21 Introduction à OpenGL Si vous avez des erreurs de liens aux librairies (Link Error), c'est que le compilateur ne trouve pas une des librairies *.lib. On peut aussi ajouter ces librairies dans les propriétés du projet:

22 Traçage de points Une séquence de points est représentée par une liste ordonnée de points p 0 =(x 0,y 0 ), p 1 =(x 1,y 1 ),…., p n =(x n,y n ). Avec OpenGL chaque point individuel est dessiné en spécifiant ses coordonnées (x,y,z). Le système d'axes (coordonnées) normal: X vers la droite, Y vers le haut, et Z augmentant en se rapprochant de l'oeil ou observateur. On suit aussi toujours la règle de la main droite: un angle positif est anti-horaire. Code de la fonction main():

23 Traçage de points Le programme de la page 85 du livre [1] (répertoire Points chap. 4) montre comment tracer des points sous la forme d'un ressort. Voici le code de l'affichage:

24 Traçage de points La fonction glRotate() permet de spécifier un angle en degrés, puis l'axe de rotation. On a donc demander d'abord une rotation autour de l'axe X, et une rotation autour de l'axe Y. Ces rotations permettent de déplacer les points du ressort donc de modifier l’orientation de la visualisation Ensuite, on demande de tracer des points avec la grandeur par défaut (1 pixel) avec la fonction glBegin(GL_POINTS). On dessine environ 90 points et la coordonnée z commence à -50, augmente de 0.5 à chaque itération, donc la valeur finale de z est à peu près 45. Donc le ressort est à peu près centré en z.

25 Traçage de points Ensuite, on a défini une fonction pour recevoir les caractères du clavier glutSpecialFunc(SpecialKeys); dans la fonction main(). key ??, xRot

26 Traçage de points On remarque que la flèche vers le haut diminue l'angle xRot de -5 degrés et la flèche droite augmente l'angle yRot de 5 degrés. Nous pourrions ramener les angles de rotation xRot et yRot à zéro avec la touche "END ou Fin". On peut examiner le contenu du fichier glut.h pour trouver les noms des touches du clavier:

27 Traçage de points Exemples d’exécution:

28 Traçage de lignes Le programme (page 91 Super Bible) montre que la fonction glBegin(GL_LINES) permet de tracer des lignes. Il suffit de fournir les extrémités des lignes par paires. On peut aussi spécifier la taille des lignes avec la fonction glLineWidth()

29 Traçage de lignes Les fonctions glEnable(GL_LINE_STRIPPLE) et glLineStripple(factor, pattern) permettent de tracer des lignes pointillées quelconque. "factor" est le grossissement et pattern est le jeu de bits (voir les pages 96-97). Notez qu'on doit activer ce mode avec la fonction glEnable(GL_LINE_STRIPPLE). On désactive un mode avec la fonction inverse glDisable(GL_LINE_STRIPPLE). Ceci s'applique à toutes les options d'affichage.

30 Traçage de polylignes Une polyligne est une séquence de droites jointes bout à bout Une séquence de droites dont le point terminal de la dernière droite rejoint le point de départ de la première ligne est appelé un polygone Une polyligne est représentée par une liste ordonnée de points p 0 =(x 0,y 0 ), p 1 =(x 1,y 1 ),…., p n =(x n,y n ) Avec OpenGL une polyligne est dessinée en spécifiant les sommets

31 Traçage de polylignes Exemples de traçage de polylignes (répertoire polyligne) –Traçage de 3 lignes vertes contiguës d ’une épaisseur de 5 pixels glBegin(GL_LINE_STRIP);… glEnd(); –Indique le traçage de lignes contiguës glLineWidth(5.0); // largeur des lignes

32 Traçage de polylignes Exemples de traçage de polylignes (répertoire polyligne)

33 Traçage de polylignes Exemples de traçage de polylignes (répertoire polyligne)

34 Traçage de polylignes (forme ouvertes)

35 Traçage de polylignes (formes fermées)

36

37 Traçage de polylignes Exemples de traçage de courbe avec des polylignes (répertoire polylignecourbe) –Traçage de lignes vertes contiguës d ’une épaisseur de 1 pixel permettant d ’approximer une courbe glVertex3f(x,y,z) // points dans l ’espace Procédure SpecialKeys(key,x,y); –Permet de faire bouger l ’objet dessiné dans l ’espace glRotatef(xrot,1.0f,0.0f,0.0f); –Permet de faire une rotation autour de l ’axe x d ’un angle xrot glRotatef(yrot,0.0f,1.0f,0.0f); –Permet de faire une rotation autour de l ’axe y d ’un angle yrot

38 Traçage de polylignes Exemples de traçage de courbe avec des polylignes (répertoire polylignecourbe)

39 Traçage de polylignes Exemples de traçage de courbe avec des polylignes (répertoire polylignecourbe)

40 Traçage de polylignes Exemples de traçage de courbe avec des polylignes (répertoire polylignecourbe)

41 Traçage de polylignes Exemples de traçage de courbe avec des polylignes (répertoire polylignecourbe)

42 Traçage de polylignes Il est aussi possible de tracer une polyligne à partir d ’un fichier avec un format donné Exemple de fichier 21 nombre de polylignes totales 4nombre de points de la première polyligne 169 118 174 120 179 124 178 126 5 etc.

43 Traçage de polylignes Il est aussi possible de tracer une polyligne à l ’aide de la souris (répertoire polymouse) –myMouse() est une procédure qui trace une polyligne au fur et à mesure que les points sont introduits à l ’aide de la souris –GLUT_LEFT_BUTTON et GLUT_BUTTON_RIGHT correspondent aux boutons gauche et droit de la souris –GLUT_DOWN indique qu ’une touche est enfoncée

44 Traçage de polylignes Il est aussi possible de tracer une polyligne à l ’aide de la souris (répertoire polymouse)

45 Traçage de polylignes Il est aussi possible de tracer une polyligne à l ’aide de la souris (répertoire polymouse)

46 Traçage de polylignes Exemple de traçage une polyligne à l ’aide de la souris (répertoire polymouse)

47 Traçage de triangles Les objets 3D sont représentés dans l’ordinateur en décrivant leur surface. Cette surface est décomposée en sections planaires qu'on appelle "polygones". Comme les surfaces doivent être planaires, on doit s'assurer que tous les points d'un polygone appartiennent à la même surface planaire. Une méthode fréquemment utilisée consiste à décomposer la surface à l'aide de triangles (triangularisation ou tessalation). La fonction glBegin(GL_TRIANGLES)¸permet de définir des triangles par groupe de 3 sommets. La fonction glBegin(GL_TRIANGLE_STRIP) permet de spécifier des triangles rattachés. Après les 3 premiers sommets, chaque sommet subséquent définit un nouveau triangle en ré-utilisant l'arête précédente (edge). La fonction glBegin(GL_TRIANGLE_FAN) permet de définir des surfaces en arcs de cercle. La fonction glBegin(GL_QUADS) permet de spécifier des structures à 4 sommets. glBegin(GL_QUAD_STRIP) permet de spécifier une séquence de polygones à 4 sommets.

48 Traçage de triangles GL_TRIANGLE_STRIP/GL_TRIANGLE_FAN

49 Traçage de triangles GL_QUAD_STRIP/GL_QUAD

50 Traçage de triangles Les fonctions précédentes réduisent le nombre de sommets à spécifier. De plus, elles permettent de définir des structures non-convexes, ce qui n'est pas le cas de glBegin(GL_POLYGON). Finalement, OpenGL n'est pas consistent: les quads sont CW (clockwise), les triangle strips sont CCW (counter clock wise), les triangle fans sont CW. Pour tester ces concepts, vous devez analyser très attentivement le programme "Triangle" du chapitre 4 du livre OpenGL Super Bible (page 102). Notez toutes les fonctions qui y sont définies: glPolygonMode(), glFrontFace(), glCullFace(), glEdgeFlag(), etc. Notez aussi toutes les anomalies de ce programme par rapport à la réalité. On appelle le graphisme 3D "réalité virtuelle" parce qu'on peut afficher des images qui n'ont pas d'équivalent dans la réalité de tous les jours.

51 Traçage de triangles Dans l'exemple Triangle, on présente aussi le concept de Culling. Cette opération est utilisée pour cacher les facettes dont l'extérieur n'est pas dirigée vers l'observateur. Ce projet permet aussi d’introduire le Depth test. En effet, comme il y a une composante en z pour chaque sommet des objets, certains objets peuvent alors en cacher d'autres. OpenGL résout ce problème en utilisant un depth buffer (appelé aussi z-buffer) qui est une mémoire supplémentaire dans laquelle il place la coordonnée de distance à l'observateur, de chaque point affiché (dans le buffer de l'image). Si par la suite, OpenGL rencontre un point qui est plus près de l'observateur, alors il modifie le point de l'image et la profondeur (plus petite) dans le z- buffer.

52 Traçage de triangles (Projet Triangle)

53

54

55

56

57

58 Traçage de triangles (Projet Triangle: exécution)

59 Traçage de triangles (Projet Triangle: exécution sans surfaces cachées)

60 Traçage de triangles (Projet Triangle: exécution avec culling)

61 Traçage de triangles (Projet Triangle: exécution avec l’arrière plan en fil de fer)

62 Traçage de triangles (Version 3.x et +) Voir: https://github.com/openglbook/openglbook- samples/blob/master/chapter-2/chapter.2.4.c

63 Traçage de triangles (Version 3.x et +)

64

65

66

67

68 Traçage de triangles (Version 3.x et +) Résultat de l’éxécution

69 Traçage de triangles (Version 3.x et +) Quelques explications sur le code Vertex Shader #version 400 // version d’OpenGL layout(location=0) in vec4 in_Position; “vec4″ est un vecteur de 4 composantes, “layout(location = 0)” pointe dans un tampon (buffer ) pour extraire l’attribut in_Position Chaque sommet comporte plusieurs attributs : La position, une ou plusieurs couleurs, une ou plusieurs coordonnées de texture, les vecteurs associés aux normales. Les layouts auront les mêmes valeurs que le 1ier paramètre de la fonction glVertexAttribPointer(). In_Position contient la position d’un sommet passé au shader “in” signifie que c’est un input au shader “out” une sortie du shader

70 Traçage de triangles (Version 3.x et +) Quelques explications sur le code Fonction CreateVBO(): pour stocker les sommets du triangle

71 Traçage de triangles (Version 3.x et +) Quelques explications sur le code Fonction CreateVBO(): pour stocker les sommets du triangle void glGenVertexArrays(GLsizei n, GLuint *arrays); // n: nombre de VAOs à créer // arrays: vecteur d’indices, référence Un VAO est un objet décrivant comment les attributs des sommets sont stockés dans un Vertex Buffer Object (VBO) Les attributs des sommets peuvent être décrits par la fonction glVertexAttribPointer() void glGenBuffers(GLSizei n, GLuint* buffers); // n: nombre de tampons à créer // buffers: vecteur d’indices, référence void glBindBuffer(GLenum target, GLuint buffer); // target: GL_ARRAY_BUFFER, attributs de sommets // buffer: l’indice du tampon

72 Traçage de triangles (Version 3.x et +) Quelques explications sur le code Fonction CreateVBO(): pour stocker les sommets du triangle void glBufferData( GLenum target, GLsizeiptr size, GLvoid* data, GLenum usage); // target: GL_ARRAY_BUFFER // size: nombre d’octets de données // data: pointeur sur les données (sommets) // usage: GL_STATIC_DRAW void glVertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer ); // index: identificateur de l’attribut // size: nombre d’octets par objet (4: X, Y, Z, W) // type: GL_FLOAT // normalized: GL_FALSE // stride: nombre d’octets entre chaque objet // pointer: décalage (octets) dans l’objet void glEnableVertexAttribArray(GLuint index); // index: indice du tampon sélectionné void glDisableVertexAttribArray(GLuint index); // désactivation du tampon

73 Traçage de triangles (Version 3.x et +) Quelques explications sur le code Fonction CreateShader(): pour créer le programme de shading GLuint glCreateShader(GLenum shaderType); // retourne un id // shaderType: GL_VERTEX_SHADER void glShaderSource( GLuint shader, GLsizei count, const GLchar** string, const GLint * length ); // shader: id du shader // count: nombre de strings dans string // string: programme de configuration du shader // length: longueur des strings void glCompileShader(GLuint shader); // compilation du programme GLuint glCreateProgram(void); // création d’un objet programme, retourne un id void glAttachShader(GLuint program, GLuint shader); void glLinkProgram(GLuint program); void glUseProgram(GLuint program); // le shader devient actif

74 Traçage de triangles (Version 3.x et +) Quelques explications sur le code Fonction RenderFunction(): affichage du contenu du VB void glDrawArrays(GLenum mode, GLint first, GLsizei count); // model: GL_TRIANGLE // first: indice du premier objet // count: nombre de sommets utilisés pour dessiner une primitive

75 Traçage de rectangles (Version 3.x et +) Modifications de la fonction CreateVBO() 2 Triangles

76 Traçage de rectangles (Version 3.x et +) Modifications de la fonction CreateVBO()

77 Traçage de rectangles (Version 3.x et +) Modifications de la fonction CreateVBO() Triangle strip

78 Gestion des touches du clavier Voir les leçons 4 et 7 dans NeHe –Ouverture d’une fenêtre Windows avec le WINAPI –Gestion des messages provenant de la fenêtre par une fonction LRESULT CALLBACK WndProc() –Gestion des touches du clavier dans la fonction principale int WINAPI WinMain()

79 Autres outils de dessins Fenêtre du monde VS viewport –Une surface dans le système de coordonnées du monde sélectionnée pour l’affichage est appelée une fenêtre du monde. Une surface sur un écran sur laquelle est proje- tée la fenêtre est un port de visualisation (viewport) –La visualisation d ’une scène correspond alors à la transposition des objets observés dans une fenêtre du monde vers un viewport dans l’écran

80 Autres outils de dessins Fenêtre du monde VS viewport

81 Autres outils de dessins Fenêtre du monde VS viewport WC -> VC –Pour maintenir les mêmes positions relatives dans les deux représentations nous devons savoir v: viewport w: window

82 Autres outils de dessins Fenêtre du monde VS viewport WC -> VC –Maintien des positions relatives

83 Autres outils de dessins Fenêtre du monde VS viewport WC -> VC –Nous pouvons alors déduire (xv,yv) par

84 Autres outils de dessins Fenêtre du monde VS viewport –Exemple de traçage d ’une fonction sinc glOrtho2D(-5.0,5.0,-0.3,1.0) // permet de définir les bornes de la fenêtre du monde glOrtho2D(left, right, buttom, up); glViewport(0.0,0.0,640.0,480.0); //permet de définir la dimension du viewport glViewport(xcorner,ycorner,width,height);

85 Autres outils de dessins Fenêtre du monde VS viewport –Exemple de traçage d ’une fonction sinc

86 Autres outils de dessins Fenêtre du monde VS viewport –Exemple de traçage d ’une fonction sinc

87 Autres outils de dessins Fenêtre du monde VS viewport –Exemple de traçage d ’une fonction sinc

88 Autres outils de dessins Fenêtre du monde VS viewport –Exemple de traçage d ’une fonction sinc

89 Projet de session Constitution des équipes Choix du projet (animation, image de synthèse, objets impliqués) Choix du modèle de représentation des objets Répartition initiale des tâches (important) Premier échéancier (9 mars 2015) –objets modélisés –visualisation des objets –animation simple dans l’espace


Télécharger ppt "GRAPHISME PAR ORDINATEUR SIF-1032. Contenu du cours 2 Introduction à OpenGL (Version avant 3.x) Traçage de points Traçage de lignes Traçage de polylignes."

Présentations similaires


Annonces Google