fichier DDS calcule taille
Re: fichier DDS calcule taille
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
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
Re: fichier DDS calcule taille
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?
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?
Re: fichier DDS calcule taille
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à.
Re: fichier DDS calcule taille
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
Re: fichier DDS calcule taille
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
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
Re: fichier DDS calcule taille
http://bebou007.free.fr/Downloads.zip
j'ai trouver un code c++ pour charger une dds mais je capte pas grand chose
j'ai trouver un code c++ pour charger une dds mais je capte pas grand chose
Re: fichier DDS calcule taille
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
voici la première partie qui m'intéresse "07 10 08" sur la premiere ligne
voici a quoi peut correspondre les flag
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
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 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
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
Re: fichier DDS calcule taille
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
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
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)
Code : Tout sélectionner
Procedure isbit(valeur,bit)
ProcedureReturn (valeur & 1<< (bit-1))>>(bit-1)
EndProcedure
Re: fichier DDS calcule taille
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
pourquoi la valeur les flag sont a l'envers de la valeur hexa lue? merci si non j'ai compris pour les flag
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
Re: fichier DDS calcule taille
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
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")
Re: fichier DDS calcule taille
ok merci je comprend mieux