Exposé d OpenGL. Sujet : Augmenter la rapidité d affichage en utilisant les extensions d OpenGL



Documents pareils
TPs Architecture des ordinateurs DUT Informatique - M4104c SUJETS. R. Raffin Aix-Marseille Université romain.raffin-at-univ-amu.fr

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

PROJET DE MODELISATION CASERNE SERGEANT BLANDAN

Synthèse d'images I. Venceslas BIRI IGM Université de Marne La

GL BE FLYER. Chef de projet de l équipe : SCIONICO Pierre

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Mise en scène d un modèle dans l espace 3D

des outils disponibles et des performances possibles

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Construire des plug-ins pour SAS Management Console SAS 9.1

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

1 Architecture du cœur ARM Cortex M3. Le cœur ARM Cortex M3 sera présenté en classe à partir des éléments suivants :

Chapitre 2. Classes et objets

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

Rendu temps réel de mer et de nuages

Windows 7, Configuration

Manuel d administration de Virtual Box MANUEL D UTILISATION VIRTUAL BOX

LPP SAINT JOSEPH BELFORT MODE OPERATOIRE ACTIVINSPIRE. Bonne utilisation à toutes et tous! UTILISATION DES TBI LE LOGICIEL ACTIVINSPIRE

Vers du matériel libre

Pour les futurs développeurs Sommaire

Virtual Universe aperçu numéro 1

Couplage d une base de données documentaire à une visualisation interactive 3D sur l Internet

A.P.I. Kuka Manuel de l utilisateur Version 0.0.5

Création et Gestion des tables

IFT3030 Base de données. Chapitre 2 Architecture d une base de données

Chapitre II : Infographie et bibliothèques graphiques

Matériel & Logiciels (Hardware & Software)

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

VOS PREMIERS PAS AVEC TRACENPOCHE

Conception des systèmes répartis

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Eternelle question, mais attention aux arnaques Question qui est souvent mise en premier plan => ce n est pas une bonne idée

«Connais toi toi-même comme l as dit Socrate!»

Module Criteo Tags et Flux pour Magento

Conventions d écriture et outils de mise au point

Génie Logiciel avec Ada. 4 février 2013

Quel PC pour quels usages? 1) PC de Bureau ou Portable? Les différents types de portables. - Les ultra-portables. - Les portables généralistes

Programmation C. Apprendre à développer des programmes simples dans le langage C

Flex. Lire les données de manière contrôlée. Programmation Flex 4 Aurélien VANNIEUWENHUYZE

Initiation à la librairie graphique VTK

Rappels Entrées -Sorties

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

I. Introduction aux fonctions : les fonctions standards

á Surveillance en temps réel á Contrôle PTZ á Enregistrement

Analyse de la vidéo. Chapitre La modélisation pour le suivi d objet. 10 mars Chapitre La modélisation d objet 1 / 57

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Mes premiers diaporamas avec Open Office Impress?

Architecture des ordinateurs

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

I00 Éléments d architecture

UE Programmation Impérative Licence 2ème Année

L environnement de travail de Windows 8

µrv : Realité Virtuelle

Ladibug TM 2.0 Logiciel de présentation visuel d'image Manuel de l utilisateur - Français

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

PROJET ALGORITHMIQUE ET PROGRAMMATION II

PROJET 1 : BASE DE DONNÉES REPARTIES

Cours d initiation à la programmation en C++ Johann Cuenin

1. Base de données SQLite

Structure fonctionnelle d un SGBD

Développement d un moteur de jeu vidéo pour la console Nintendo Wii U et portage d un jeu

Gérer, stocker et partager vos photos grâce à Picasa. Janvier 2015

Gestion de scène pour les moteurs 3D

EIP 2012 Projet Livepad. Documentation technique 1.5

La programmation orientée objet et le langage C++

Ce document décrit la démarche à suivre pour installer les outils de développement et compiler le projet TANAGRA.

AGASC / BUREAU INFORMATION JEUNESSE Saint Laurent du Var Tel : bij@agasc.fr Word: Les tableaux.

Virtual Universe Pro V2 Manuel de l Utilisateur (C) 2013 IRAI. Manuel Utilisateur VIRTUAL UNIVERSE PRO V2 Page 1

Architectures d implémentation de Click&DECiDE NSI

TD : Codage des images

Les tablettes. Présentation tablettes Descriptif Fournisseurs Caractéristiques Comparatifs Conseils Perspectives Démonstration

WHS FutureStation Nano Extras\Options: Général

Choisir le bon ordinateur. et la bonne imprimante en avec. Les prix bas, la confiance en plus

Programmation impérative

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

LOGICIEL DC4D MONITOR

Vision industrielle et télédétection - Détection d ellipses. Guillaume Martinez 17 décembre 2007

LOGICIEL DE SURVEILLANCE NUUO NOTICE

TP Blender n 2 : Importation d un modèle SketchUp et animation

DOCUMENTATION VISUALISATION UNIT

Bien travailler sur plusieurs écrans

Évaluation et implémentation des langages

Date M.P Libellé Catégorie S.Catégorie Crédit Débit Solde S.B

Centres d accès communautaire Internet des Îles LA CLÉ USB

IV- Comment fonctionne un ordinateur?

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

Computer Link Software

SharePoint (Toute la Gamme)... 1 Office 2010 (Toute la Gamme)... 2 OLAP (Toute la Gamme)... 2 STATISTICA Connecteur PI (Produit Complémentaire)...

Support de TD ArcGIS Introduction à l automatisation et au développement avec ArcGIS 10.1 JEAN-MARC GILLIOT e année ingénieur

Imagerie Numérique Synthèse d images. DUT Informatique Sébastien THON

as Architecture des Systèmes d Information

Guide de l utilisateur. Faites connaissance avec la nouvelle plateforme interactive de

GUIDE Excel (version débutante) Version 2013

Microscope numérique portable Celestron (HDM) Modèle nº Informations, spécifications et instructions

Transcription:

Exposé d OpenGL Sujet : Augmenter la rapidité d affichage en utilisant les extensions d OpenGL Professeur : M. Christophe LOHOU Élève : Boris Brugevin

Sommaire I - INTRODUCTION - 2 - II - OPENGL - 3-1 QU EST CE QU OPENGL - 3-2 ÉNONCIATION DU SUJET - 3 - III - DIFFERENTES METHODES D AFFICHAGE - 4-1 L AFFICHAGE BASIC : «IMMEDIATE MODE» - 4-2 COMPILATION DE PRIMITIVES : «DISPLAY LISTS» - 5-3 TABLEAU DE VERTEX : «VERTEX ARRAYS» - 5-4 TABLEAU DE STRUCTURE : «INTERLEAVED VERTEX ARRAYS» - 6-5 STOCKAGE EN MEMOIRE VIDEO : «GL_ARB_VERTEX_BUFFER_OBJECT» - 7-6 RECAPITULATIF DES METHODES - 10 - IV - BENCHMARK DES DIFFÉRENTS SYSTÈMES D AFFICHAGE - 11-1 TEST 1 : NVIDIA RIVA TNT - 12-2 TEST 2 : NVIDIA GE-FORCE4 GO 420 ERREUR! SIGNET NON DEFINI. 3 TEST 3 : NVIDIA GE-FORCE4 TI 4800-13 - 4 TEST 4 : NVIDIA GE-FORCE FX 5900-14 - 5 CONCLUSION - 14 - V - POURQUOI TIMER LES ACTIONS? - 15 - VI - CONCLUSION - 16 - VII - GLOSSAIRE ERREUR! SIGNET NON DEFINI. Exposé d OpenGL - 1 -

I - Introduction Intéressé depuis toujours par les jeux vidéos, j ai voulu connaître leur fonctionnement. Je me suis donc engagé dans des études de programmation orientées vers l imagerie numérique : IUT Informatique - option Imagerie Numérique d Arles. Ces études m ont passionné, j ai étudié les mathématiques et différents langages de programmation qui m ont fortement aidé à manier la 3D. J ai eut des cours sur différentes API graphiques telles que Direct3D et OpenGL. Mais nous n avons vu que les bases en cours, j ai donc beaucoup travaillé tout seul pour en savoir plus sur ces librairies. Pour améliorer mes compétences j ai voulu continuer mes études dans la même voie. J ai donc opté pour une licence professionnelle en Imagerie Numérique au Puy-en-Velay. Avec cette licence, je devrais avoir plus de connaissances, surtout sur les Shaders (vertex et fragment programmes) que je ne connais que très peu. Je compte continuer mes études si cela est possible. Je voudrais faire un Master et un DESS toujours dans le même domaine à Reims : STIC Informatique multimédia. Exposé d OpenGL - 2 -

II - OpenGL 1 Qu est ce qu OpenGL OpenGL est une librairie graphique 3D. Cela signifie qu'on lui donne des ordres de tracé de primitives graphiques directement en 3D, une position de caméra, des lumières, des textures à plaquer sur les surfaces, etc, et qu'à partir de là OpenGL se charge de faire les changements de repère, la projection en perspective à l'écran, le clipping, l'élimination des parties cachées, d'interpoler les couleurs, et de rasteriser les faces pour en faire des pixels. OpenGL s'appuie sur le hardware disponible selon la carte graphique. Toutes les opérations de base sont a priori accessibles sur toute machine, simplement elles iront plus ou moins vite selon qu'elles sont implémentées en hard ou pas. Pour les fonctions évoluées qui ne font pas partie de la norme OpenGL mais figurent parmi les extensions, il se peut par contre qu'elles ne soient disponibles que sur certaines machines. 2 Énonciation du sujet OpenGL est un générateur d image 3D qui tourne en temps réel. Plusieurs modes pour tracer des primitives existent. Y en a t il un plus rapide? Et si oui lequel? Nous allons tester plusieurs méthodes d affichage qu OpenGL propose afin de déterminer laquelle est là plus rapide et permet donc un affichage optimisé. Exposé d OpenGL - 3 -

III - Différentes méthodes d affichage Tout d abord, comment peut-on mesurer la performance d un programme 3D? Pour cela on réalise une application qui va tourner à l infini afin de réaliser une mesure : le fps (frames par seconde). Le fps est le nombre de rafraîchissement de la fenêtre OpenGL en une seconde. On peut coupler à cette méthode un calcule du nombre de primitives afficher en une frame. Grâce à ces deux méthodes, on peut étudier et comparer les différentes techniques d affichage sous OpenGL. 1 L affichage basic : «Immediate mode» C est le mode d affichage le plus simple à utiliser. Il suffit de faire appel aux fonctions glvertex*() pour placer un point, glnormal*() pour lui associer une normale, glcolor*() pour donner une couleur au vertex et gltexcoord*() pour lui donner des coordonnées de texture. Ce mode est donc très flexible et permet de rapidement dessiner une primitive en OpenGL. Les points négatifs sont nombreux. Tout d abord, ce mode d affichage produit beaucoup d appels aux fonctions citées au-dessus, de plus la vitesse d affichage va dépendre du processeur de la machine, car les données vont transiter par le bus pour passer dans la carte graphique. Exemple de programme : // Affichage glcolor4f(1.0f,0.0f,0.0f,1.0f); // Attribut une couleur au polygone ( r, g, b, a) glnormal3f(0.0f,0.0f,1.0f); // Attribut une normale au polygone glbegin(gl_triangles); // mode de polygon, ici : triangle glvertex3f(0.0f,1.0f,0.0f); gltexcoord2f(0.5f,1.0f) ; // Coord. du vertex dans l espace glvertex3f(-1.0f,-1.0f,0.0f); gltexcoord2f(-1.0f,0.0f) ; // et coord. de texture glvertex3f(1.0f,-1.0f,0.0f); gltexcoord2f(-1.0f,0.0f) ; glend(); Le code est simple et clair. Et voici le résultat : Exposé d OpenGL - 4 -

2 Compilation de primitives : «Display Lists» C est une autre méthode simple et qui permet un affichage rapide. Elles permettent de stocker les vertex et leurs attributs (coordonnées de texture, couleurs, etc) dans la mémoire vidéo si les drivers le permettent. Par contre une fois compilée, la display liste ne peut être changée. On est donc limité si l on souhaite interagir sur les vertex de la forme. Une fois crée, la fonction qui génère la display liste envoie un identifiant pour la localiser en mémoire vidéo. Pour l afficher on n a plus qu a appeler cet Id. En fin de programme il ne faut pas oublier de relâcher la mémoire vidéo prise par la liste d OpenGL. Exemple de programme : // Début du programme GLuint Liste = glgenlists(1); glnewlist(liste,gl_compile); glendlist(); // Affichage de la liste : glcalllist(liste); // Fin du programme gldeletelists(liste, 1); // création de la liste GL // (Affichage de la primitive Ex : en Immediate Mode) // suppression de la listegl Le paramètre de glgenlist() est en fait le nombre de liste que nous voulons créer. S il y en a plusieurs, c est toujour un unsigned int qui devra réceptionner les Ids. Le DeleteList() prend aussi le l UINT et le nombre de liste à supprimer. Si l on souhaite créer plusieurs listes avec un seul Id il faudra appeler la fonction gllistbase(liste) après glgenlists(). 3 Tableau de vertex : «Vertex Arrays» Différents tableaux stockent les vertex, les corrdonnées de texture, les normales, les couleurs et les indexes. Les données peuvent être modifié rapidement car tout cela est traité en ram. C est tableau sont donnés à OpenGL afin qu il gère la création des vertex buffer et donc éviter l appel des fonctions basic vu en immediate mode. Ce mode permet aussi d indexé l affichage grâce à un tableau d indexe, ceci évite d envoyer plusieurs fois les même points à la carte graphique. Exemple de programme : // Début du programme GLuint *index = NULL; GLfloat *Normals = NULL; GLfloat *Color = NULL; GLfloat *Vertices = NULL; // init et remplissage des tableaux // Tableau des faces // Tableau des normales // Tableau des couleurs // Tableau des vertex Exposé d OpenGL - 5 -

// affichage glenableclientstate(gl_color_array); glcolorpointer(4, GL_FLOAT, 0, Color); // activation du tableau de couleurs // on donne le pointeur sur le tableau glenableclientstate(gl_vertex_array); glvertexpointer(3, GL_FLOAT, 0, Vertices); glenableclientstate(gl_normal_array); glnormalpointer(gl_float, 0, Normals); // affichage de la primitive indexé gldrawelements( GL_TRIANGLES, nb_faces*3, GL_UNSIGNED_INT, index); gldisableclientstate(gl_color_array); // désactivation du tableau de couleurs gldisableclientstate(gl_vertex_array); gldisableclientstate(gl_normal_array); // Fin du programme delete [] index ; index = NULL ; // suppression des tableaux delete [] Normals; Normals = NULL; delete [] Color; Color = NULL; delete [] Vertices; Vertices = NULL; Tout d abord il faut déclarer plusieurs tableaux qui vont contenir les différentes données nécessaires pour tracer la primitive. Ensuite il faut les remplir. Il faut dire à OpenGL quels tableaux doivent être appelé pour dessiner l objet ainsi que le pointeur sur chacun des tableaux. Enfin, à la fin du programme, on supprime l espace mémoire utilisé par les tableaux. 4 Tableau de structure : «Interleaved Vertex Arrays» C est le même principe que les vertex arrays, sauf qu on crée un tableau de structure comme en direct3d. Le code est donc plus facile à la lecture tout en gardant les avantages des vertex arrays. Exemple de programme : // Début du programme struct VERTEX { GLfloat r,g,b,a; GLfloat nx,ny,nz; GLfloat x,y,z; }; // un vertex // Couleur // Normale // Coordonnées VERTEX *vertexes = NULL; GLuint *index = NULL ; // init et remplissage des tableaux // Tableau des vertex // Tableau des index Exposé d OpenGL - 6 -

// affichage glinterleavedarrays(gl_c4f_n3f_v3f, sizeof(vertex), vertexes); gldrawelements(gl_triangles, nb_faces*3, GL_UNSIGNED_INT, index); // Fin du programme delete [] index ; index = NULL ; // suppression des tableaux delete []vertexes; vertexes = NULL; Au début il faut faire une structure d un vertex. Les données peuvent être diverses mais dans un ordre bien précis car pour l affichage il faudra dire à OpenGL comment lire la structure. Voici les types de lecture qu OpenGl connaît : // gl.h #define GL_V2F 0x2A20 #define GL_V3F 0x2A21 #define GL_C4UB_V2F 0x2A22 #define GL_C4UB_V3F 0x2A23 #define GL_C3F_V3F 0x2A24 #define GL_N3F_V3F 0x2A25 #define GL_C4F_N3F_V3F 0x2A26 #define GL_T2F_V3F 0x2A27 #define GL_T4F_V4F 0x2A28 #define GL_T2F_C4UB_V3F 0x2A29 #define GL_T2F_C3F_V3F 0x2A2A #define GL_T2F_N3F_V3F 0x2A2B #define GL_T2F_C4F_N3F_V3F 0x2A2C #define GL_T4F_C4F_N3F_V4F 0x2A2D Les V correspondent au mot vertex, les C à la couleur, les T aux coordonnées de texture et les N aux normales. Les UB et F correspondent aux types unsigned byte et float. Par exemple dans le programme : GL_C4F_N3F_V3F correspond à 4 couleurs : r, g, b et a, 3 float pour la normale et 3 float pour le vertex. L ordre d écriture de ces constantes doit être respecté dans la structure. 5 Stockage en mémoire vidéo : «GL_ARB_vertex_buffer_object» C est le mode d affichage le plus rapide d OpenGL. On crée des vertex arrays et on appel une extension d OpenGL qui va copier les différents tableaux dans la mémoire vidéo (AGP). Les données ne transitent donc qu une seule fois par le bus à la création. La carte graphique disposant des points dans ça mémoire affiche beaucoup plus vite les primitives. Ces vertex buffer ARB peuvent être dynamiques on peut aller modifier les données directement dans la mémoire graphique ou statiques juste en lecture seule. Exemple de programme : // Début du programme struct VERTEX { // un vertex Exposé d OpenGL - 7 -

}; GLfloat r,g,b,a; GLfloat nx,ny,nz; GLfloat x,y,z; // Couleur // Normale // Coordonnées VERTEX *vertexes = NULL; GLuint *index = NULL ; // Tableau des vertex // Tableau des index // ID Index & Vertex Buffer ARB GLuint IndexBuffer = -1; GLuint VertexBuffer = -1; // pointeur sur les fonctions ARB_vertex_buffer_object PFNGLBINDBUFFERARBPROC glbindbufferarb = NULL; PFNGLGENBUFFERSARBPROC glgenbuffersarb = NULL; PFNGLBUFFERDATAARBPROC glbufferdataarb = NULL; PFNGLGETBUFFERPARAMETERIVARBPROC glgetbufferparameterivarb = NULL; PFNGLDELETEBUFFERSARBPROC gldeletebuffersarb = NULL; Tout d abord comme vu précédemment, on déclare une structure de vertex. Ensuite, nous devons créer les tableaux nécessaires au stockage de nos points et index. Nous créons aussi des identifiants pour la génération de ces vertex et index buffers en mémoire vidéo. Nous déclarons les pointeurs sur les fonctions nécessaires à la récupération des fonctions étendues d OpenGL. Pour tester si les drivers de la carte graphique détient les extensions OpenGL nécessaire à la création de ces buffers, on utilise la fonction suivante : // recuperation de la chaine de char des extension char *ext = (char*)glgetstring( GL_EXTENSIONS ); // on test si l extension voulue est présente if( strstr( ext, "ARB_vertex_buffer_object" ) == NULL ) { MessageBox(NULL,"ARB_index_buffer_object n'existe pas", "ERROR",MB_OK MB_ICONEXCLAMATION); return E_FAIL; // extension non présente } Si l extension est présente, il suffit de récupérer les pointeurs sur les fonctions. // on récupère les fonctions de l'extension glbindbufferarb = (PFNGLBINDBUFFERARBPROC)wglGetProcAddress("glBindBufferARB"); glgenbuffersarb = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffersARB"); glbufferdataarb = (PFNGLBUFFERDATAARBPROC)wglGetProcAddress("glBufferDataARB"); glgetbufferparameterivarb = Exposé d OpenGL - 8 -

(PFNGLGETBUFFERPARAMETERIVARBPROC)wglGetProcAddress("glGetBufferParameterivARB"); gldeletebuffersarb = (PFNGLDELETEBUFFERSARBPROC)wglGetProcAddress("glDeleteBuffersARB"); Si les extensions sont présentes, on peut générer les buffers ARB voulu. Il suffit de faire appel à la function glgenbuffersarb(), de sélectionner le buffer à remplir avec glbindbufferarb() puis de remplir sa mémoire avec glbufferdataarb(). Ceci copie automatiquement les informations des buffers de la ram vers la mémoire video. // Génération de l index buffer glgenbuffersarb( 1, &IndexBuffer ); glbindbufferarb( GL_ELEMENT_ARRAY_BUFFER_ARB, IndexBuffer ); // sélection du buffer glbufferdataarb( GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(uint) * nb_faces*3, index, GL_STATIC_DRAW_ARB ); glgetbufferparameterivarb( GL_ELEMENT_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &nparam_arrayobjectsize ); glbindbufferarb( GL_ELEMENT_ARRAY_BUFFER_ARB, NULL ); // désélection du buffer // Génération de du vertex buffer glgenbuffersarb( 1, &VertexBuffer ); glbindbufferarb( GL_ARRAY_BUFFER_ARB, VertexBuffer ); glbufferdataarb( GL_ARRAY_BUFFER_ARB, sizeof(vertex) * nb_vertexes, vertexes, GL_STATIC_DRAW_ARB ); glgetbufferparameterivarb( GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &nparam_arrayobjectsize ); glbindbufferarb( GL_ARRAY_BUFFER_ARB, NULL ); delete [] index ; index = NULL ; // suppression des tableaux delete []vertexes; vertexes = NULL; Pour l affichage, il faut sélectionner le buffer et indiquer à OpenGL qu il faudra l appeler avec la fonction glenableclientstate(). // affichage // Sélection de l'indexbuffer glbindbufferarb( GL_ELEMENT_ARRAY_BUFFER_ARB, IndexBuffer ); glindexpointer( GL_UNSIGNED_INT, sizeof(gluint), BUFFER_OFFSET(0) ); glenableclientstate( GL_INDEX_ARRAY ); // Sélection du vertexbuffer glbindbufferarb( GL_ARRAY_BUFFER_ARB, VertexBuffer ); glcolorpointer( 4, GL_FLOAT, sizeof(vertex), BUFFER_OFFSET(0) ); glnormalpointer( GL_FLOAT, sizeof(vertex), BUFFER_OFFSET(sizeof(GLfloat) * 4 )); glvertexpointer( 3, GL_FLOAT, sizeof(vertex), BUFFER_OFFSET(sizeof(GLfloat) * 7) ); Exposé d OpenGL - 9 -

glenableclientstate( GL_COLOR_ARRAY ); glenableclientstate( GL_NORMAL_ARRAY ); glenableclientstate( GL_VERTEX_ARRAY ); // affichage indexé ARB gldrawelements( GL_TRIANGLES, nb_faces*3, GL_UNSIGNED_INT, BUFFER_OFFSET(0)); gldisableclientstate( GL_COLOR_ARRAY ); gldisableclientstate( GL_NORMAL_ARRAY ); gldisableclientstate( GL_VERTEX_ARRAY ); // Désélection des index & vertex buffer glbindbufferarb( GL_ARRAY_BUFFER_ARB, NULL ); glbindbufferarb( GL_ELEMENT_ARRAY_BUFFER_ARB, NULL ); La macro BUFFER_OFFSET sert à créer un offset pour la lecture des informations dans la structure. Elle a la forme suivante : #define BUFFER_OFFSET(i) ((char *)NULL + (i)) A la fin du programme on supprime les buffers situés en mémoire vidéo : // Fin du programme gldeletebuffersarb( 1, &IndexBuffer ); // suppression des buffers de la mémoire vidéo gldeletebuffersarb( 1, &VertexBuffer ); 6 Récapitulatif des méthodes Méthode Niveau Lieu de stockage Dynamique/statique Immediate mode Facile Aucun Dynamique Display list Facile Mémoire graphique (en cache selon les drivers) Statique Vertex Arrays Moyen Mémoire Ram du pc Dynamique Interleaved Vertex Arrays Moyen Mémoire Ram du pc Dynamique Buffers ARB Difficile Mémoire graphique Dynamique Exposé d OpenGL - 10 -

IV - Benchmark des différents systèmes d affichage Afin de réaliser un test de ces différentes méthodes d affichage, nous essaierons ces techniques avec différentes scènes n ayant pas le même nombre de polygones. De plus, nous testerons aussi avec différent type de carte graphique pour avoir plus d informations à recouper pour une meilleure évaluation de ces modes d affichage. J ai donc conçu un programme qui va avoir les différentes méthodes d affichage possible et réaliser des testes de fps. Voici un screenshot du programme : Exposé d OpenGL - 11 -

1 Test 1 : nvidia Riva TNT 120 Comparatif des modes d'affichage d'opengl PIII - nvidia Riva TNT (Extension non supporté) Frames par seconde 100 80 60 40 20 0 12 1 200 1 850 2 256 9 386 46 464 Triangles Immediate mode Display list Vertex Buffer Interleaved Vertex Buffer ARB Vertex Buffer Object (non supporté) Tout d abord, nous pouvons constater que le nombre de triangles dans la scène joue sur le fps. Plus il y a de triangles, plus celui-ci baisse. Nous pouvons aussi remarquer que les méthodes d affichage sont à peu près équivalentes en dessous d un certain seuil de triangles. Passé ce seuil, on peut comparer la vitesse d affichage. Ici le seuil se trouve au alentour des 9 000 triangles. On voit nettement la supériorité des GL Liste. Les buffers ARB n étant pas supporté, nous ne pouvons les comparés aux autres méthodes. Exposé d OpenGL - 12 -

2 Test 2 : nvidia Ge-Force4 Ti 4800 1200 Comparatif des modes d'affichage d'opengl PIV - nvidia Ge-Force4 Ti 4800 Frames par seconde 1000 800 600 400 200 0 12 1 200 1 850 2 256 9 386 46 464 Triangles Immediate mode Display list Vertex Buffer Interleaved Vertex Buffer ARB Vertex Buffer Object Ce test est très concluant, on voit nettement la supériorité des méthodes utilisant la mémoire vidéo pour stocker les informations des sommets. La méthode des buffers ARB est cependant un peu moins rapide qu une liste d OpenGL. Exposé d OpenGL - 13 -

3 Test 3 : nvidia Ge-Force FX 5900 Frames par seconde 500 450 400 350 300 250 200 150 100 50 0 Comparatif des modes d'affichage d'opengl PIV - nvidia Ge-Force FX 5900 12 1 200 1 850 2 256 9 386 46 464 Triangles Immediate mode Display list Vertex Buffer Interleaved Vertex Buffer ARB Vertex Buffer Object Ce test affirme celui du dessus, et prouve une fois de plus la rapidité d exécution de la display liste et des buffers ARB. 4 Conclusion Tout ces testes réalisé on a peu près les même résultats. La Liste Gl et les buffers ARB sont les plus rapides. Mais la performance dépend beaucoup du nombre de polygones que contient la scène. Cela parait assez logique vu que les données transite par le bus pour les autres méthodes. Plus il y a de triangles à affiché, plus le bus s encombre pour passer les informations à la carte graphique. Le seule moyen de contourner ce système et donc de mettre toutes les informations dans la mémoire interne à la carte graphique. La display liste est là méthode la plus rapide, mais elle est limité à cause de sa compilation, on ne peut changer la position des vertexes. Donc si on souhaite utiliser des formes qui vont bouger en fonction du temps, il faudrait utiliser les buffers dynamique. Ceux-ci permettent l accès rapide aux données stockées en mémoire vidéo afin de pouvoir effectuer les modifications nécessaires. Exposé d OpenGL - 14 -

V - Pourquoi Timer les actions? Pourquoi est-il important de timer les actions? Comme nous l avons vu précédemment, le fps peut changer en fonction des cartes graphique et des moyens utilisés pour afficher les primitives. Si l on souhaite faire une rotation à chaque frame d un cube par exemple, selon les ordinateurs, le cube va allé plus ou moins vite. Ce que l on veut c est que le cube aille à la même vitesse sur toutes les machines. Il ne faut donc pas calculé le déplacement en fonction de la vitesse d exécution du programme, mais en fonction du temps. Pour cela nous avons accès à des fonctions de temps : TimeGetTime() ou GetTickCount() sont donc des fonctions utiles pour la gestion des animations pour un rendu 3D. D autres fonctions encore plus précises peuvent être utilisé comme par exemple le compteur de performance de windows. Exposé d OpenGL - 15 -

VI - Conclusion OpenGL propose divers moyen d afficher les primitives, ces méthodes sont plus ou moins rapides d exécution. La méthode de dessin statique la plus rapide est l utilisation des listes GL, mais si l utilisateur souhaite modifier ses sommets rapidement, les buffers ARB sont la méthode la plus appropriée. Exposé d OpenGL - 16 -