fichier DDS calcule taille

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: fichier DDS calcule taille

Message par case »

peut tu mettre le fichier en téléchargement ?

a mon avis tu as la réponse dans ta question.

l'entête de donne la taille d'une image pas de tout le fichier, pour arriver a la seconde image tu ajoute la taille de la première image a l'offset etc pour chaque image, reste a voir si il y a une nouvelle entête a chaque image de 128x128 pour connaitre la taille de l'image suivante

il te donne 128 de largeur car ton image fait 128x128 mais il y en a 6

128x6 = 768
ImageImage
bebou007
Messages : 79
Inscription : dim. 06/mars/2005 20:18

Re: fichier DDS calcule taille

Message par bebou007 »

oui bien sur la voila par contre il n'y a pas d'entête pour les autre image elle sont coller a la suite

voila l'image

http://bebou007.free.fr/image0-43008-49280-.dds

merci encore pour ton aide

49280 c'est la taille du fichier

donc 8192*6=49152

49152+128 de l'entête =49280

comment savoir si il y a plusieurs image?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: fichier DDS calcule taille

Message par djes »

Dans la doc c'est marqué, par exemple pour un mapping d'environnement cubique, tu as plusieurs faces (l'environnement est une sorte de grosse boîte texturé qui englobe le monde 3d). Il faut prendre en compte les quelques cas particuliers comme celui-là.
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: fichier DDS calcule taille

Message par case »

faut chercher du coté du flags ou du ddscapd pour voir si c'est un environement maping cubic etc... je suppose qu'il y a un bit pour l'indiquer
ImageImage
bebou007
Messages : 79
Inscription : dim. 06/mars/2005 20:18

Re: fichier DDS calcule taille

Message par bebou007 »

ah ok je voie c'est une skybox par contre pour les flag j'ai pas trop compris

si non y a sa comme info

"DDS ",
(256, 256),
(linearsize=32768),
(pixel format=DXT1), 128 bytes
(TEXTURE, LINEARSIZE, COMPLEX, MIPMAP, CUBEMAP, POSITIVEX, NEGATIVEY, POSITIVEZ, FOURCC)
256-by-256 positive x main image 32768 bytes
128-by-128 positive x mipmap image 8192 bytes
64-by-64 positive x mipmap image 2048 bytes
32-by-32 positive x mipmap image 512 bytes
16-by-16 positive x mipmap image 128 bytes
8-by-8 positive x mipmap image 32 bytes
4-by-4 positive x mipmap image 8 bytes
2-by-2 positive x mipmap image 8 bytes
1-by-1 positive x mipmap image 8 bytes
256-by-256 negative y main image 32768 bytes
128-by-128 negative y mipmap image 8192 bytes
64-by-64 negative y mipmap image 2048 bytes
32-by-32 negative y mipmap image 512 bytes
16-by-16 negative y mipmap image 128 bytes
8-by-8 negative y mipmap image 32 bytes
4-by-4 negative y mipmap image 8 bytes
2-by-2 negative y mipmap image 8 bytes
1-by-1 negative y mipmap image 8 bytes
256-by-256 positive z main image 32768 bytes
128-by-128 positive z mipmap image 8192 bytes
64-by-64 positive z mipmap image 2048 bytes
32-by-32 positive z mipmap image 512 bytes
16-by-16 positive z mipmap image 128 bytes
8-by-8 positive z mipmap image 32 bytes
4-by-4 positive z mipmap image 8 bytes
2-by-2 positive z mipmap image 8 bytes
1-by-1 positive z mipmap image 8 bytes


donc dans notre cas 128*128 c'est bien 8192 bytes

sa correspondrais donc a

2 image positive x mipmap image
2 image positive y mipmap image
et
2 image positive z mipmap image

les 6 image d'un cube
bebou007
Messages : 79
Inscription : dim. 06/mars/2005 20:18

Re: fichier DDS calcule taille

Message par bebou007 »

http://bebou007.free.fr/Downloads.zip

j'ai trouver un code c++ pour charger une dds mais je capte pas grand chose
bebou007
Messages : 79
Inscription : dim. 06/mars/2005 20:18

Re: fichier DDS calcule taille

Message par bebou007 »

salut bon après quelque repos je reviens a la charge en fait il me faut juste trouver la taille du fichier en récupérant les info dans l'entête

pour le moment j'ai un peut compris comment les flag etait enregistrer mais j'ai 2-3 question


entete d'un fichier dds

Code : Tout sélectionner

44 44 53 20 7C 00 00 00 07 10 08 00 80 00 00 00
80 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00
04 00 00 00 44 58 54 31 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 08 10 00 00
00 FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00
voici la première partie qui m'intéresse "07 10 08" sur la premiere ligne

voici a quoi peut correspondre les flag

Code : Tout sélectionner

DDSD_CAPS	0x00000001
DDSD_HEIGHT	0x00000002
DDSD_WIDTH	0x00000004
DDSD_PITCH	0x00000008
DDSD_PIXELFORMAT	0x00001000
DDSD_MIPMAPCOUNT	0x00020000
DDSD_LINEARSIZE	0x00080000
DDSD_DEPTH	0x00800000
donc les valeur sont en hexa le dernier byte correspond au premier bit

example "07" correspond a DDSD_CAPS+DDSD_HEIGHT+DDSD_WIDTH qui sont obligatoire 01+02+04=07
si on avais ajouter le flag DDSD_PITCH sa aurais donner 0F

ensuite le deuxieme bit "10" qui correspond a DDSD_PIXELFORMAT qui et lui aussi obligatoire

puis "08" qui correspond donc au flag DDSD_LINEARSIZE
si on avait ajouter le flag DDSD_MIPMAPCOUNT sa aurais donner 0A=08+02
et si on avias en plus ajouter le flag DDSD_DEPTH sa aurais fait 8A=08+02+80

mon probleme comment trouver simplement quel flag et dans le bit sélectionner sans avoir a prédéfinir toute les possibilité de flag selond le resultat

pour le moment j'aimerai trouver sa merci pour votre aide
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: fichier DDS calcule taille

Message par case »

ces flags indiquent la présence d'un champ valide du type concerné

par exemple si le flag
DDSD_CAPS 0x00000001

est a 1 il y a un champ DDS_CAPS valide dans le header

il faut que tu pense en binaire en fait :)
le DWORD dwFlags est un nombre 32 bits

en binaire zero en 32 bit ca s'ecrit
00000000000000000000000000000000
DDSD_CAPS 0x00000001
sur le mot 32 bit serait a droite
00000000000000000000000000000001

si ce bit est a 1 il y a une description DDSD_CAPS dans ton fichier

voila donc chacun des flags documentes correspond a un bit sur ce même mot

pour tester la presence de DDSD_MIPMAPCOUNT 0x00020000
qui s'ecrit
00000000000000100000000000000000 en binaire
tu as juste a regarder le bit 18 de ton long si il est a 1 ou a 0 pour savoir si il y a un champ valide DDSD_MIPMAPCOUNT

pour lire un bit particulier d'une variable tu dois utiliser un masque binaire et faire un ET logique si ta valeur est a zero le bit est a zero , sinon il est a 1

Code : Tout sélectionner

Procedure isbit(valeur,bit)
ProcedureReturn (valeur & 1<< (bit-1))
EndProcedure

;1 = 00000001
Debug isbit(1,1)
Debug isbit(1,2)
;2 = 00000010
Debug isbit(2,2)
Debug isbit(2,0)
;9 = 00001001
Debug isbit(9,1)
Debug isbit(9,2)
Debug isbit(9,3)
Debug isbit(9,4)
si la procédure renvoi 0 le bit est a zero ,sinon il est a 1 la valeur renvoyée varie selon le bit testé il est possible de renvoyer 0 ou 1 mais cela implique une operation binaire suplémentaire

Code : Tout sélectionner

Procedure isbit(valeur,bit)
ProcedureReturn (valeur & 1<< (bit-1))>>(bit-1)
EndProcedure
ImageImage
bebou007
Messages : 79
Inscription : dim. 06/mars/2005 20:18

Re: fichier DDS calcule taille

Message par bebou007 »

ok merci j'ai tous compris par contre j'ai du changer 2 trois truc

par contre se que je comprend pas c'est pk il ont mit en valeur pour le DDSD_CAPS 0x00000001 alors que dans winhex la valeur hexa et 07 10 0A 00

le 07 correspond a 1+2+4
donc flag caps+height+width

10 correspond a DDSD_PIXELFORMAT 0x00001000

et 0A correspond a MIPMAPCOUNT+LINEARSIZE

Code : Tout sélectionner

DDSD_CAPS   0x00000001
DDSD_HEIGHT   0x00000002
DDSD_WIDTH   0x00000004
DDSD_PITCH   0x00000008
DDSD_PIXELFORMAT   0x00001000
DDSD_MIPMAPCOUNT   0x00020000
DDSD_LINEARSIZE   0x00080000
DDSD_DEPTH   0x00800000
pourquoi la valeur les flag sont a l'envers de la valeur hexa lue? merci si non j'ai compris pour les flag
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: fichier DDS calcule taille

Message par case »

parce-que le pc a un processeur little endian ce qui signifie que le processeur ecrit les valeurs de l'octet de poids faible vers l'octet de poids fort
l'octet de poids faible c'est le dernier dans un mot.

donc quand tu lis octet par octet tu lis d'abord la fin du mot long c'est ce qui se passe avec winhex qui lui lis octet par octet ton fichier

donc si tu prends ta valeur hexa 000A1007 en memoire elle est stockée 07100a00

essaie ce code tu vas comprendre

Code : Tout sélectionner

a.l=$000A1007 
debug "lecture octet par octet"
Debug RSet(Hex(PeekB(@a)),2,"0")      
Debug RSet(Hex(PeekB(@a+1)),2,"0")  
Debug RSet(Hex(PeekB(@a+2)),2,"0")  
Debug RSet(Hex(PeekB(@a+3)),2,"0")  
debug "lecture mot long"
Debug RSet(Hex(PeekL(@a)),8,"0")
ImageImage
bebou007
Messages : 79
Inscription : dim. 06/mars/2005 20:18

Re: fichier DDS calcule taille

Message par bebou007 »

ok merci je comprend mieux
Répondre