IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

Format des surfaces et copies vers tableau


Sujet :

DirectX

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Format des surfaces et copies vers tableau
    Bonjour,
    je suis débutant en programmation directx et je rencontre quelques difficultés à comprendre l'utilisation des surfaces et en particulier des D3DFORMAT lors de la création des surfaces.
    J'ai parcouru la doc sdk et n'ai rien trouvé qui réponde à mes interrogations. Peut-être pourrez vous m'aider.

    Ce que je cherche à faire :
    1. copier les informations contenues dans une surface D3D9 vers un tableau.
    2. modifier les valeurs dans le tableau
    3. copier le tableau vers une nouvelle surface ou éventuellement la meme surface.

    Comment je le fais :
    1. la surface a un format 3DFMT_A8R8G8B8 et un pool D3DPOOL_MANAGED
    2. mon tableau est un tableau d'entiers
    3. j'utilise lockrect/unlock comme vous l'avez expliqué dans d'autres discussions

    mes questions :
    1. le D3DFORMAT doit-il influencer le type de tableau que je vais utiliser pour le stockage des valeurs?
    2. comment naviguer dans la surface avec le pitch et la taille de la surface ?
    3. lors d'un premier essai je n'arrive pas à récuperer les info contenues dans la texture sous forme de int ou de float. Comment faire ?

    merci par avance de l'attention portée à mes questions.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    1. Ca dépend ce que tu en fais. En général on aime bien avoir un type d'entiers qui correspond au nombre de bits du format de pixels. Dans tous les cas le tableau doit être suffisamment grand pour contenir largeur x hauteur x octets_par_pixel pixels.

    2. Comme dans n'importe quel tableau, sauf que la largeur réelle est le pitch mais que toi tu ne veux récupérer que la largeur utile. De toute façon c'est expliqué dans le SDK avec du code.

    3. Corriger le code

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    'Alut.

    1. Pas forcément, tu écris ce que tu veux dans ton tableau. Mais le format de la texture va modifier la façon de lire la texture.

    2 et 3. Voici un exemple d'écriture d'une texture D3DFMT_A8R8G8B8:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    D3DLOCKED_RECT LockRect;
    if( FAILED( m_Texture->LockRect(0, &LockRect, NULL, 0) ) 
      return;
    DWORD * pdwSurfaceBuffer = (DWORD *) LockRect.pBits;
     
    ...
     
    pSurfaceBuffer[PointX + PointY*(LockRect.Pitch>>2)] = 0xffaaaaaa;
    ...
     
    m_Texture->UnlockRect(0);
    [EDIT] : Tient j'ai une question: Pourquoi le " >>2 " pour le pitch dans "PointX + PointY*(LockRect.Pitch>>2)" ?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tient j'ai une question: Pourquoi le " >>2 " pour le pitch dans "PointX + PointY*(LockRect.Pitch>>2)
    Parce que le pitch est exprimé en octets et que tu vas parcourir ton tableau DWORD par DWORD (donc 4 octets par 4 octets). Il faut donc diviser le pitch par 4 pour que ça corresponde. Par exemple pour un format 32 bits, si le pitch vaut 1024 ça ne fera que 256 pixels.

    PS : le décalage de bits pour une division c'est mal... le compilo sait très bien le faire tout seul

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    Oki doki. Merci.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Je vois, merci pour cette réponse rapide, pour le 1. et le 2. au mois ça me permet d'avancer.

    Pour le 3. voici le bout de code qui me pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    	//tableau pour création de la texture
    	int *tableau = new int[TEXSZ*TEXSZ];
    	for(int i=0;i<TEXSZ*TEXSZ;i++)
    		tableau[i]=i*2;
     
    	D3DLOCKED_RECT rect2;
    	BYTE *ptr2;
    	// creation de la texture
    	g_pD3DDevice->CreateTexture(TEXSZ,TEXSZ,0,0,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,&g_pTexture2,NULL);
    	g_pTexture2->LockRect(0,&rect2,NULL,0);
    	ptr2 = (BYTE *)rect2.pBits;
     
    	int compteur = 0;
    	for(UINT u=0;u<TEXSZ;u++) { // pour chaque ligne de la texture
    		for(UINT v=0;v<TEXSZ;v++) { // pour chaque texel de la ligne
    			memset(ptr2, tableau[compteur], sizeof(int));
    			compteur++;
    			ptr2 += sizeof(int);
    		}
     
    	}
    	g_pTexture2->UnlockRect(0);
     
     
    	//COPIE DE LA TEXTURE DANS UN TABLEAU
     
                 //tableau de destination
    	int *tableau2 = new int[TEXSZ*TEXSZ];
    	for(int j=0;i<TEXSZ*TEXSZ;i++)
    		tableau2[j]=0;
                 //fichier pour sauvegarder les valeurs
    	FILE *pFile;
    	pFile=fopen("EnterSurface.txt","wt");
     
                 D3DLOCKED_RECT rect3;
    	BYTE *ptr3;
    	// creation de la texture
    	g_pTexture2->LockRect(0,&rect3,NULL,0);
    	ptr3 = (BYTE *)rect3.pBits;
    	compteur = 0;
    	for(UINT u=0;u<TEXSZ;u++) { // pour chaque ligne de la texture
    		for(UINT v=0;v<TEXSZ;v++) { // pour chaque texel de la ligne
    			memcpy(tableau2,ptr3, sizeof(int));
    			fprintf(pFile,"(%d,%d) : %d\n",u,v,tableau2[compteur]);
    			compteur++;
    			ptr3 += sizeof(int);
    		}
    	}
    	g_pTexture2->UnlockRect(0);
    je suppose qu'avec de l'expèrience j'aurai trouvé une façon plus simple de faire tout ça mais bon...

    comme je vous l'expliquais mon but est de trouver une méthode pour récuperer les valeurs numériques de chaque pixel composant la texture.
    le problème c'est que je crée la surface avec des entiers allant de 0 à 128, mais lorsque je lis le contenu du tableau2 écrit dans un fichier j'obtient 0 pour la première case puis -842150451 pour les 63 autres.
    1. Aurai-je un problème de passage de valeur par adresse ou autre ?
    2. Est-ce lié aux types et format que j'utilise ?
    3. suis je sur la bonne voie avec ce bout de code ?
    4. toute autre info sera la bien venue.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    Comme je l'ai dit pour lire ou écrire au coordonnées PointX, PointY dans une surface:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pSurfaceBuffer[PointX + PointY*(LockRect.Pitch/4)]
    avec pSurfaceBuffer un DWORD* (car A8R8G8B8).

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut résolu!
    excellent, exactement ce que je recherchais. et c'est quand même plsu simple que mes memset et memcpy.
    désolé je n'avais pas vu le post précédent puisque j'étais en train de rédiger la réponse avec le bout de code...

    vous m'avez bien aidé tous les deux !
    encore merci et bon week end.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/10/2011, 10h15
  2. Formater des données lors d'un export vers fichier texte
    Par 1MANU1 dans le forum VBA Access
    Réponses: 1
    Dernier message: 14/11/2008, 08h29
  3. import des donnees python vers tableau
    Par tsicc dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 02/04/2008, 10h10
  4. changement de format lors d un lien vers tableau excel
    Par Lionel b dans le forum Access
    Réponses: 2
    Dernier message: 07/04/2006, 08h41
  5. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo