2013-06-15 5 views
1

Je suis en train de convertir un tableau 2D en DDS et l'enregistrer dans un fichier. Le tableau est plein de structures de couleur (chacune ayant une composante rouge, verte, bleue et alpha). Une fois le tableau au format correct, je suis sûr que l'enregistrer dans la partie fichier ne sera pas un problème. Je vais bien soit utiliser une lib pour cela (tant que sa licence me permet de l'utiliser dans un projet à source fermée et fonctionne sur Linux et Windows) ou le faire manuellement, si je peux trouver une belle ressource expliquant comment le faire.Création DirectDraw surface à partir de zéro en C++

Si quelqu'un peut me diriger dans la bonne direction, je l'apprécierais vraiment.

Répondre

2

Dans DirectDraw, vous pouvez créer une surface à partir des données en mémoire, en mettant en place certains champs dans la structure DDSURFACEDESC et le passage à la méthode CreateSurface de l'interface IDirectDraw.

Vous devez d'abord dire DirectDraw quels champs de la structure DDSURFACEDESC contiennent les informations correctes en définissant le champ dwFlags à l'ensemble des drapeaux suivants: DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_LPSURFACE | DDSD_PITCH. Oh, et cela ne fonctionne que pour les surfaces de mémoire système, il est donc probablement nécessaire d'ajouter l'indicateur DDSCAPS_SYSTEMMEMORY dans le champ ddsCaps.dwCaps (si DirectDraw ne le fait pas par défaut).

Ensuite, vous spécifiez l'adresse du début de votre tableau de données de pixels dans le champ lpSurface. Si votre tampon est continu, réglez simplement le lPitch sur 0. Sinon vous réglez la hauteur correcte (la distance en octets entre les débuts de deux lignes de balayage suivantes).

Réglez le format de pixel correct dans ddpfPixelFormat champ, avec la profondeur de bit correct dans dwRGBBitCount et masques RVB dans dwRBitMask, dwGBitMask et dwBBitMask.

Définissez ensuite lXPitch sur le nombre d'octets de votre pixel (3 pour RGB). Cela dépend du format de pixel que vous utilisez.

Passez ensuite la structure remplie dans CreateSurface et voyez si cela fonctionne. Lorsque vous créez la surface de cette façon, gardez à l'esprit que DirectDraw ne gérera pas lui-même son tampon de données et ne libérera pas cette mémoire lorsque vous appellerez Release sur votre surface. Vous devez libérer cette mémoire quand elle n'est plus utilisée par la surface. Si vous souhaitez que ces données de pixels soient placées dans la mémoire vidéo, vous devez créer une surface hors écran de la manière habituelle, puis la verrouiller, copier vos pixels dans la mémoire vidéo de votre propre mémoire tampon (vous trouvera son adresse dans le champ lpSurface, et n'oubliez pas de prendre le lPitch en compte!), puis déverrouillez-le.

Questions connexes