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.
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.
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.
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).
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...
- En mode plein écran
- En mode fenêtré
- 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 surface primaire, back buffer ou offscreen
- 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
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:
Et un programme les utilisant:
Et un programme les utilisant:
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.