comment fait on pour recuperer le code couleur d'un point d'une surface LPDIRECT3DSURFACE8 ???
comment fait on pour recuperer le code couleur d'un point d'une surface LPDIRECT3DSURFACE8 ???
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.
j'ai repris un de tes codes sur le forum loulou24, mais aec mon programme ce code plante :
le programme plante a cause de cette ligne :
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();
est-ce que quelqu'un serait d'ou ca vient???
Code : Sélectionner tout - Visualiser dans une fenêtre à part Pointeurs_Textures[ 1 ]->PSurface->LockRect(&LockRect, NULL, 0);
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 ?
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......
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.
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????
C'est un tableau, donc si tu accèdes au second élément il faut qu'il y en ait au moins deux.que veux tu dire par pointeur_texture ne contient qu'un element, en quoi sa aurait de l'influence sur le programme????
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 ?il y a rien au niveau debugger, il y a aucune erreur ni warning....
ca y est j'ai utiliser le debugger, il me dit qu'il y a une violation d'acces, et voici la ligne :
Voila ce que donne le debugger :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Bits[x + y * Pitch] = RGB(255,255,255);
aurais-tu une idee d'ou ca peux venir????
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
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).
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????
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.
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 );
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é .
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????
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.
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.
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); } }
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
j'ai trouver d'ou venait mon probleme :
j'ecrivais donc en memoire au lieu de lire en memoire.....
Code : Sélectionner tout - Visualiser dans une fenêtre à part Bits[x + y * Pitch] = RGB(255,255,255);
ce qui fait que la texture etait donc marqué dirty et il fallait donc que je l'update.....
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager