Texel
DirectX | Index | Contact

Présentation de DirectX



L'API WIN32 n'est pas assez performante et complète pour permettre le développement d'applications multimédias rapides. Il faut en effet pour cela exploiter le plus possible les capacités du matériel. Mais le PC est une architecture ouverte, ce qui implique une grande diversité du matériel. Pour facilité la vie des développeurs et leurs évités d'avoir à écrire des versions de leurs programmes pour chaques périphériques existants, Microsoft a crée DirectX (qui s'appuie toujours sur l'API WIN32 pour le fenêtrage) . Cet ensemble de bibliothèques multimédias qui en est actuellement à la 9ième version, est constituée de plusieurs composantes destinées à satisfaire les besoins des développeurs:

_ DirectX Graphics: Pour l'affichage. Elle est elle-même constituée de deux autres composantes principales:
   Direct Draw pour la 2D.
   Direct 3D pour la 3D.
_ DirectX Audio: Pour le son. Elle a aussi deux composantes:
   Direct sound: Pour la lecture des sons wave.
   Direct music: Pour la lecture des musiques au format midi.
_ Direct input: Pour les entrées utilisateurs (clavier, joystick, volant …).
_ Direct play: Pour le réseau.
_ Direct Show: Pour la manipulation (lecture, encodage, filtres …) de tous les fichiers multimédias qui peuvent être lus par Windows Media Player (audio et vidéo).

Avant l'arrivé de DirectX8, Direct Show faisait partie d'une extension de DirectX appelée DirectX Media qui contenait en plus Direct transform (filtre et fusion d'images) et Direct animation (intégration de DirectX dans les pages web).

Les fonctions DirectX sous très souvent accélérées par le matériel. Lorsque le matériel ne prend pas en charge une fonction elle est dans la très très grande majorité des cas émulé. DirectX a en effet deux couches: HAL (hardware acceleration layer) et HEL (hardware emulation layer).

Vous pouvez actuellement utiliser les différentes composantes de DirectX indépendamment les unes des autres (exemple: OpenGL + Direct Sound + Direct Input). Ca n'a pas toujours été le cas puisqu'avant DX8, D3D s'appuyait sur DDraw.

N'oubliez pas que Windows NT 4 ne peut pas faire tourner les applications utilisant les dernières versions de DirectX (surtout en ce qui concerne Direct3D) même avec les derniers services packs.



I . Le modèle COM

DirectX est basé sur un model COM (Component Object Model). Je connais peu de choses sur ce sujet, mais je vais vous expliqué seulement ce qu'il faut en savoir pour utiliser DirectX. Pour plus d'infos lisez la doc du SDK (malheureusement en anglais).

COM est un modèle orienté objet . Il existe donc des objets COM (difficiles à créer, mais faciles à utiliser) qui ressemblent un peu aux objets du langage C++. Pour comprendre ce qu'est un objet COM, voyons d'abord ce qu'est un objet en C++. Rassurez-vous, vous n'avez pas besoin de connaître le langage C++ pour programmer des applications DirectX (tant qu'elles restent simples:-).

Comme vous le savez, les structures du langage C sont des sortes de sacs à variables. Le langage C++ offre en plus l'avantage d'ajouter des fonctions dans des structures (je simplifie vraiment là). Ces structures sont alors appelées classe et les fonctions des classes sont appelées méthodes. Un objet en C++ est tous simplement une occurrence de classe (donc une "variable" déclaré comme ayant pour type une classe). Pour appeler une méthode, c'est comme pour les variables, on tape: Objet.méthode() . Sachez aussi qu'il est possible de rendre certaines parties d'une classe public ( toutes les variables et méthodes y sont en libre accès dans le programme) ou private ( les variables et méthodes ne sont pas accessibles directement et ne peuvent l'être qu'en utilisant des méthodes de la partie public).

Le model COM permet de créer des librairies avec des fonctions utilisables avec tous les langages de programmations. Un objet COM est constitué d'une ou plusieurs interfaces qui contiennent chacune des méthodes. Les interfaces qui existent déjà ne peuvent pas être modifiées (les méthodes aussi). Donc à chaque fois que l'on veut ajouter des fonctions à une librairie basée sur le COM, il faut créer et ajouter à l'interface existante une autre interface qui sert d'extension (mais ça, c'est le travail de Microsoft, pas le votre). C'est pourquoi, à chaque fois que vous installez une nouvelle version de DirectX sur votre PC, les programmes qui utilisait les anciennes versions de la DirectX fonctionnent toujours. Vous pouvez aussi programmer de nouvelles applications en utilisant les anciennes fonctions de DirectX 1,2,3,4…Tous les objets COM ont une interface commune Iunknown qui elle peut être modifiée et qui permet d'accéder aux différentes interfaces et leurs méthodes.

A chaque fois que vous voulez utiliser un objet COM, vous devez déjà en déclarer un (exemple: LPDIRECTDRAW7 pour DirectDarw 7) .

Vous avez alors une interface par défaut qui contient une méthode QueryInterface() qui vous permet d'atteindre un pointeur qui dirige vers l'interface que vous souhaitez (exemple: interface IdirectDraw7 pour utiliser la version 7 de DDraw). L'interface souhaitée doit être passée en argument à la fonction grâce à ce que l'on appelle un identificateur globalement unique (GUID). Cet identificateur représente une unique interface COM. Ce qui veut dire que lorsque vous voulez obtenir l'interface de Direct draw 7, vous passez en argument à la méthode QueryInterface() le mot IID_IDirectDraw7 qui est en faite l'identificateur GUID de l'interface.

Pour utiliser ces identificateurs GUID (qui appartiennent à une bibliothèque, vous devez ajouter au début de vos programmes DirectX la ligne "#define INITGUID" avant d'inclure toutes vos libraires DirectX.

Ensuite vous utilisez l'objet de la même façon que pour le C++. Quand vous voulez utiliser une fonction (exemple: Définition de la résolution de l'affichage), vous utilisez en faite une méthode en tapant Objet.méthode() .

Enfin, ce qui est très très important une fois que vous avez fini d'utiliser un objet COM (souvent à la fin d'un programme), c'est que vous devez absolument libérer l'interface que vous avez crée un utilisant la méthode Release() qui prend en argument votre objet COM. L'utilisation de la méthode QueryInterface() n'est pas obligatoire, car certaines autres méthodes (exemple: DirectDrawCreateEx) permettent aussi d'obtenir une interface.

Ca semble compliqué comme çà, mais vous verrez que dans la pratique c'est très simple à utiliser même si on comprend rien (cf. les différents tutoriaux sur directX). Si vous êtes impatient d'utiliser Direct3D (ou même les autres composantes de DirectX d'ailleurs), je vous conseil très fortement de commencer d'abord par lire les tutoriaux sur DirectDraw. Cela vous permettra de vous familiariser avec le COM, les bases du graphisme, et peut-être l'API Win32.



II . Le kit de développement DirectX

Le kit de développement DirectX appelé SDK DirectX est disponible gratuitement sur le site de Microsoft à l'adresse www.microsoft.com/directx rubrique "DirectX download". Dans sa version complète d'environ 140 Mo, le SDK contient toutes les librairies, plein d'exemples, et une documentation en anglais. Vous pouvez aussi télécharger séparément les librairies, les exemples ou les documentations. Le SDK 8 ne contient pas de documentation sur DirectDraw. A l'heure ou j'écris ces lignes, vous pouvez toujours télécharger le SDK 7 pour avoir une documentation de DDraw et plus de codes sources (rubrique "DirectX support highlights", je crois) .

Les librairies de ce SDK sont compilées pour Visual C++ et Visual Basic. Pour avoir les librairies pour le compilateur Borland, vous devez vous rendre dans une autre section du site de Microsoft, rubrique "DirectX" puis rubrique "DirectX support highlights" puis "downloadable Files" puis "DirectX developer downloads". Vous y trouverez aussi (si la page n'a pas été remise à jour depuis) le SDK 7a (utile pour les exemples en Direct draw). Pour les autres compilateurs renseignez vous auprès de leurs éditeurs/développers.

Le SDK complet contient également le run-time de DirectX. A l'installation, vous aurez le choix entre installer la version Retail ou Debug. La version debug permet le debugage des applications mais est plus lente à l'exécution et pose parfois des problèmes. Vous pouvez facilement revenir à la version Retail dans le panneau de configuration.

Si vous utilisez Visual C++, n'oubliez pas de lui indiquer les répertoires où vous avez installer les .h et le .lib du SDK . Allez dans le menu Tools puis option et onglet directories. Ensuite, dans le panneau "Show directories for", choisissez include files. Vous verrez apparaître la liste des répertoires où Visual cherche les headers. Ajoutez le répertoire des headers des librairies DirectX en haut de la liste (sinon Visual va utiliser les vielles librairies DirectX déjà présentes dans le compilateur). Faite de même pour les .lib.
Quand vous créez un projet, n'oubliez pas non plus de linker les librairies que vous utilisez à votre projet (menu project puis setting et onglet link).
Ces deux opérations sont expliquées dans la documentation du SDK (dossier Introduction).

Vous pouvez compiler des programmes qui utilisent les fonctions des anciennes versions de DirectX avec un SDK récent (exemple: Fonction DirectX 3 avec SDK DirectX 8). Mais si vous voulez par exemple que vos programmes tournent sur des machines où n'est installer que la version 3 de DirectX alors que vous avez le SDK 8 (c'est souvent le cas pour des applications pour Windows NT 4), vous devez ajouter ces lignes au début de vos programmes (ex. pour Direct3D):


#ifndef DIRECT3D_VERSION
	#define DIRECT3D_VERSION        0x0300
#endif  	//DIRECT3D_VERSION







Le 3 dans la suite de caractères 0x0300 est le numéro de la version souhaitée. Elle peut être remplacée par la valeur de votre choix.
Remplacez DIRECT3D_VERSION par DIRECTINPUT_VERSION pour DirectInput et de même pour les autres composantes DirectX.




Version originale: Avril 2001
Dernière mise à jour: Octobre 2003
Par Grégory Smialek
www.texel.fr.fm