DirectDraw

 

 

 

C'est quoi DirectDraw ?

DirectDraw est une bibliothèque de DirectX permettant le rendu d'images 2D. Cette API utilisera l'accélération matériel si celle-ci est disponible.

Il est à noter que l'on peut fort bien faire l'équivalent de la 2D avec des fonctions 3D avec en plus les fonctions supplémentaires de la 3D qui n'existent pas dans DirectDraw, il suffit d'oublier l'axe Z.

Image non trouvée ! DirectDraw n'existe plus à partir de DirectX version 8. Tout se trouve maintenant dans DirectGraphic qui gère aussi la 3D.

Si vous avez des problèmes de compilation avec d'anciens programmes, et pour pouvoir les faire fonctionner, il faut d'abord définir DIRECTDRAW_VERSION avec le numéro de version (Ex.: #define DIRECTDRAW_VERSION 0x0300)..

 

Les normes de développement

Pour développer en C/C++ sous Windows, il y a quelques normes à respecter.

Remarques sur les fonctions Windows.

 

Solution technique utilisée

La solution utilisée par DirectDraw est similaire aux solutions graphiques ayant existées sur différentes machines comme Atari ST, Commodore:

La mémoire vidéo utilisée pour afficher une image à l'écran se nomme primary buffer ou surface primaire. Tous accès à la mémoire de la primary buffer implique une modification immédiate du dessin visible à l'écran. Travailler directement sur le primary buffer est à éviter, car vous risquer fort d'avoir un effet de scintillement (suivant la vitesse de votre code qui maj dans la mémoire et le balayage écran).On dessine donc de préférence dans un écran logique càd un écran qui n'est pas affiché sur le moniteur. Cette écran logique se nomme sous DirectX un back buffer et se trouve dans la mémoire vidéo de la carte. Le Back buffer est associé au primary buffer càd l'écran.

Lorsque le travail sur le dessin est terminé, vous transferez celui-ci sur l'écran physique (soit le moniteur ou encore appelé surface primaire ou primary buffer comme déjà indiqué). Il existe deux solutions:

  • Ce transfert se fait en utilisant le flipping pour échanger les pointeurs mémoire de la primairy buffer et celui du back buffer.
  • Où en utilisant le blitting permettant d'effectuer des transferts d'images de mémoire à mémoire.

Image non trouvée !Le blitting permettant de faire des transferts de mémoire à mémoire. Mémoires nommées "surface" sur directX, il sera dès lors possible de copier dans des surfaces intermédiaires vos images pour une réutilisation ultérieure. Ces surfaces étant hors de la mémoire vidéo (primary surface) affichée, celles-ci seront nommées surfaces "offscreen" car ces surfaces ne seront jamais visibles directement à l'écran. Ces surfaces offscreen vont permettre de stocker, par exemple, des sprites ou le décor du fond.

Image non trouvée !Il est bien plus rapide d'échanger deux pointeurs (flipping) que de transférer tout le contenu mémoire de l'un vers l'autre (blitting). Mais dans certains cas, le flipping ne sera pas disponible (par exemple en mode fenêtré, où il y a d'autres applications qui utilisent aussi la mémoire destinée à l'affichage sur l'écran !). Dans ce cas, le back buffer sera remplacé par une surface offscreen et les transferts se feront par le blitting. Tout cela sera expliqué en partie lors de la création d'une surface.

 

DirectDraw comprend cinq composants de bases ou interfaces qui sont:

  • IDirectDraw qui fournit l'accès à DirectDraw et permet la création de divers objets directDraw.
  • IDirectDrawClipper qui maintient une liste de rectangles de clipping.
  • IDirectDrawSurface pour gérer les surfaces système ou vidéo permettant de dessiner une image.
  • IDirectDrawPalette pour gérer les objets servant à stocker une palette de couleurs.
  • IDirectDrawVideoPort pour gérer les objets permettant la gestion de la vidéo en direct (affichage de captures vidéo ou de la télévision).

 

Image non trouvée !Souvent les développeurs indiquent leurs fonctions Direct Draw en commençant par DD comme par exemple DDLoadBitmap pour une fonction chargeant un bitmap sur une surface Direct Draw. J'utiliserai aussi ce principe ici...

 

Création d'une fenêtre

  • En mode plein écran
  • En mode fenêtré

Initialiser DirectDraw

  • Initialisation DirectDraw
  • Niveau de coopération suivant le mode plein écran ou fenêtré
  • Changement/énumération résolution écran

Gérer les codes erreurs dans DDraw

Création de surfaces

  • Création de surface primaire, back buffer ou offscreen

Utilisation des surfaces

  • Utiliser les surfaces
    • Utilisation du GDI sur les surfaces
    • Utilisation directe de la surface pour dessiner
    • Blitting - Copier une image d'une surface à une autre (peut faire office de sprite !)
  • Le Clipping
  • Le Flipping - Echanger les écrans logique et physique + petit retour sur création de surface pour n back buffer

Détruire les surfaces et l'interface direcdraw

  • La méthode Release
  • Pseudo fonction DXRelease fait maison

Image non trouvée !Il faudra détruire les surfaces avant de détruire l'interface DirectDraw lorsque vous voudrez mettre fin au programme.

 

Voici un fichier qui rassemble les différentes fonctions étudiées:

Dx5 :Image non trouvée !

Et un programme les utilisant:

Image non trouvée !

Dx7 :Image non trouvée !

Et un programme les utilisant:

Image non trouvée !

 

Vous pourrez vous aussi enrichir les différents fichiers en ajoutant par exemple des fonctions de traçage de droites, ...

 

Plus de détails chez Microsoft: Lien Microsoft pour Direct Draw de Direct X 7 ou Lien pour DirectDraw de DirectX 9.

Sinon, il y a des exemples et de la documentation dans les sdk livrés par Microsoft.