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 :

recuperer la couleur d'un point


Sujet :

DirectX

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 140
    Points : 76
    Points
    76
    Par défaut recuperer la couleur d'un point
    comment fait on pour recuperer le code couleur d'un point d'une surface LPDIRECT3DSURFACE8 ???

  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
    Tout est dans la doc du SDK : tu la verrouilles via LockRect, tu récupères un pointeur sur ses bits, tu vas chercher le pixel qui t'interesse, puis tu déverrouilles avec UnlockRect.

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 140
    Points : 76
    Points
    76
    Par défaut
    j'ai repris un de tes codes sur le forum loulou24, mais aec mon programme ce code plante :

    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; 
    Pointeurs_Textures[ 1 ]->PSurface->LockRect(&LockRect, NULL, 0); 
    int    Pitch = LockRect.Pitch; 
    unsigned int* Bits = (unsigned int*)LockRect.pBits; // le type de Bits depend du format de la surface 
    for(int x = 0; x < 256; x++) 
    {
        for(int y = 0; y < 128; y++) 
    	{
            Bits[x + y * Pitch] = RGB(255,255,255); 
    	}
    }
    Pointeurs_Textures[ 1 ] -> PSurface->UnlockRect();
    le programme plante a cause de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pointeurs_Textures[ 1 ]->PSurface->LockRect(&LockRect, NULL, 0);
    est-ce que quelqu'un serait d'ou ca vient???

  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
    Est-ce que ta surface est correctement créée ? Est-ce qu'elle n'est pas déjà verrouillée ? Est-ce que tu n'as pas un pointeur nul quelque part ? Que dit le debugger ?

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 140
    Points : 76
    Points
    76
    Par défaut
    la surface est correctement creer car elle s'affiche et ya pas la moindre erreur avec l'affichage, elle n'est pas deja verouiller, le pointeur n'est pas nul vu qu'elle s'affiche quand j'tuilise pas ce code.......

    je c'est pas d'ou ca peut venir......

  6. #6
    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
    Les seules choses qui peuvent planter avec cette ligne, ce sont :

    - Pointeurs_Textures est vide ou ne contient qu'un élément
    - Pointeurs_Textures[ 1 ] est nul
    - Pointeurs_Textures[ 1 ]->PSurface est nul

    Essaie de voir ce que dit le debugger, ou au moins le message d'erreur.

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 140
    Points : 76
    Points
    76
    Par défaut
    il y a rien au niveau debugger, il y a aucune erreur ni warning....


    c'est une fois le programme arriver a cette ligne qu'il plante,

    il me dit le programme a rencontrer un probleme et va fermer etc.....

    je comprend pas pourtant, l'image s'affiche, c'est que le pointeur n'est ni vide, ni nul, et que la surface est bien charger...

    que veux tu dire par pointeur_texture ne contient qu'un element, en quoi sa aurait de l'influence sur le programme????

  8. #8
    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
    que veux tu dire par pointeur_texture ne contient qu'un element, en quoi sa aurait de l'influence sur le programme????
    C'est un tableau, donc si tu accèdes au second élément il faut qu'il y en ait au moins deux.

    il y a rien au niveau debugger, il y a aucune erreur ni warning....
    Erreurs et warnings ça c'est le compilo, le debugger sert justement à détecter les erreurs à l'execution, il t'indique notamment la ligne qui plante, la pile d'appels de fonctions, l'état des variables, ... Comment sais-tu que c'est cette ligne qui plante si tu n'as pas (a priori) utilisé le debugger ?

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 140
    Points : 76
    Points
    76
    Par défaut
    ca y est j'ai utiliser le debugger, il me dit qu'il y a une violation d'acces, et voici la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bits[x + y * Pitch] = RGB(255,255,255);
    Voila ce que donne le debugger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Name                  Value
    Bits                  0x00000000
      |
      ----                CXX0030   Error: expression cannot be evaluated
    Pitch                 0
    x                     0
    y                     0
    aurais-tu une idee d'ou ca peux venir????

  10. #10
    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
    Le pitch est exprimé en octets, pas en pixels. Donc si tu l'utilise comme indice dans ton tableau ça va dépasser. Il faut que tu le divises par la taille d'un pixel (donc par sizeof(unsigned int) dans ton cas).

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 140
    Points : 76
    Points
    76
    Par défaut
    Voila ce que donne le debugger :
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Name                  Value 
    Bits                  0x00000000 
      | 
      ----                CXX0030   Error: expression cannot be evaluated 
    Pitch                 0 
    x                     0 
    y                     0 
     
     
    aurais-tu une idee d'ou ca peux venir????

  12. #12
    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
    Si Bits est nul c'est que le verrouillage a échoué. Si le verrouillage a échoué c'est certainement que ta surface ne peut être verrouillée. Si ta surface ne peux être verouillée c'est que tu n'as pas spécifié qu'elle pouvait l'être dans ses flags de création .

    Montre nous comment tu crées ta surface, il faut respecter certaines conditions pour que celle-ci soit verrouillable.

  13. #13
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 140
    Points : 76
    Points
    76
    Par défaut
    au fait je fait comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (FAILED(D3DXCreateTextureFromFileEx(	PD3DDevice, Pointeurs_Textures[ ImageNumber ] -> Fichier,
    												largeur, hauteur, 1, D3DUSAGE_RENDERTARGET,
    												D3DFMT_A1R5G5B5, D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_DEFAULT,
    												0xFF000000, NULL, NULL, &Pointeurs_Textures[ ImageNumber ] -> PTexture ) ) )
     
    	Pointeurs_Textures[ ImageNumber ] -> PTexture -> GetLevelDesc( 0, &Infos );
    	Pointeurs_Textures[ ImageNumber ] -> PTexture -> GetSurfaceLevel( 0, &Pointeurs_Textures[ ImageNumber ] -> PSurface );

  14. #14
    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
    C'est marrant, vous créez tous des render target pour vos textures. Elle sert réellement de texture de rendu ?

    En tout cas tu ne peux pas créer de texture de rendu lockable (à ma connaissance), seulement des surfaces. Mais si comme je le pense tu ne veux que créer une texture "normale" et récuperer ses pixels, il faut simplement retirer D3DUSAGE_RENDERTARGET. Et n'oublie pas le flag D3DLOCK_READONLY lorsque tu lock, ça peut parfois aider.

    Potasse la doc du SDK, tout est bien expliqué .

  15. #15
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 140
    Points : 76
    Points
    76
    Par défaut
    j'ai fait ce que tu m'a dit mais maintenant quand je l'affiche, c'est pas l'image a laquel je m'attends, c'est un tas de rayures grises.....

    si j'utilise pas le code pour capturer la couleur d'une pixel, l'image s'affiche alors correctement...

    il y a quelque chose qui ne va pas dans le code????

  16. #16
    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
    Dur à dire comme ça, il faudrait essayer d'isoler le problème maintenant. Idée : ça vient peut-être du fait que tu stockes un pointeur sur les surfaces de ta texture, je ne suis pas sûr que ce genre de chose reste au même endroit en mémoire. Il faudrait donc essayer de les récupérer à chaque fois que tu en as besoin et non une seule fois au début.

  17. #17
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(int x = 0; x < 256; x++)
    {
        for(int y = 0; y < 128; y++)
       {
            Bits[x + y * Pitch] = RGB(255,255,255);
       }
    }
    ce code est incorrect puisque Pitch est TOUJOURS en nombre d'octets et la ton arithmétique des pointeurs va fonctionner en nombre d'unsigned int.

    Par ailleurs les textures allouées en mémoire vidéo ne sont pas lockable et c'est écrit explicitement dans la doc. En règle générale (à une exception près que je ne préciserai pas) les rendertarget qu'elles soient textures ou non sont en mémoire video. Le moyen de rapatrier les données des rendertarget s'appelle getRenderTargetData.
    Pour envoyer des données dans une texture qui est aussi une rendertarget, tu utilises des fonctions de blits (comme stretchrect) ou tu rends directement dedans en la settant comme rendertarget.
    Si tu n'as pas besoin de rendre des données à la volée tu utilises des textures managed, et si tu as besoin de données qui varient à chaque frame mais que tu génères sur le CPU tu utilises le flag "USAGE_DYNAMIC" à la création et seulement si le hardware le supporte. Dans ce dernier cas, tu peux écrire (et tu ne veux pas lire) directement dans la texture en utilisant les flags qui vont bien (NOOVERWRITE, DISCARD) comme tu le ferais pour des vertex buffers dynamiques.

    LeGreg

  18. #18
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 140
    Points : 76
    Points
    76
    Par défaut
    j'ai trouver d'ou venait mon probleme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bits[x + y * Pitch] = RGB(255,255,255);
    j'ecrivais donc en memoire au lieu de lire en memoire.....
    ce qui fait que la texture etait donc marqué dirty et il fallait donc que je l'update.....

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

Discussions similaires

  1. [JLabel][GradientPaint] recuperer la couleur d'un point
    Par Caster dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 28/08/2007, 16h20
  2. recuperer la couleur d'un jbutton avec getforeground()
    Par jnauche dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 12/04/2006, 13h50
  3. Couleur du pixel pointé par la sourie
    Par algerian dans le forum Windows
    Réponses: 4
    Dernier message: 16/08/2005, 18h22
  4. [TBitmap] Recuperer la couleur d un pixel
    Par DamessS dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/12/2004, 08h47
  5. [VB6] Comment récupérer la couleur d'un pixel de l'écran?
    Par Taurëndil dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 26/03/2004, 08h02

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