PDA

Voir la version complète : Collision Pixel Perfect C#/Direct3D


CPPTryer
19/11/2005, 18h22
Salut tout le monde,
Depuis peu je m'essaye donc à C#/Direct3D.
Et la pour un test de collision, j'ai besoin d'utiliser le Pixel Perfect, mais avec les Sprite Direct3D et les Textures, je sais pas trop comment m'y prendre.
En fait faudrait que je puisse donc récupérer la couleur d'un pixel, mais je ne vois pas cette attribut a la classe Texture:00000012: Une piste ?:00000023:
Par ailleurs, s'auriez-vous si il est possible de faire des masques comme en C++ en C#
Merci d'avance @+++

Lenolian
19/11/2005, 18h47
1) La méthode LockRectangle de la classe Texture te retourne les données de ta texture. Tu peut à partir de la construire un objet Bitmap et récupérer les pixel grâce à GetPixel.

Texture tex = new Texture(/* */);

GraphicsStream stream = tex.LockRectangle(0,LockFlags.ReadOnly);

Bitmap bmp = new Bitmap(stream);

int pixel = bmp.GetPixel(x,y);

2) oui bien sur (même syntaxe).

CPPTryer
19/11/2005, 19h39
Salut, merci d'avoir répondu, j'ai fait comme tu m'as dit à savoir :
(dans InitializeGraphics)

texture1 = TextureLoader.FromFile(device, "image1.tga");

GraphicsStream gs = texture1.LockRectangle(0, LockFlags.ReadOnly);
Bitmap bt = new Bitmap(gs);
if (bt.GetPixel(1, 1) == Color.Transparent)
MessageBox.Show("Le 1er pixel est transparent");
texture1.UnlockRectangle(0);

Il compile mais à l'éxécution il met : "Le paramètre n'est pas valide."
pour cette ligne la : Bitmap bt = new Bitmap(gs);
Je ne sais pas quelle surchage utiliser:00000017:
Vous qui vous y connaissez mieu... un conseil ?
Bonne soirée

grob1212
21/11/2005, 09h15
1) La méthode LockRectangle de la classe Texture te retourne les données de ta texture. Tu peut à partir de la construire un objet Bitmap et récupérer les pixel grâce à GetPixel.


Sans connaitre la détection 2D "pixel perfect", est-ce que le verrouillage de surface n'introduit pas une chute de performance dans ce cadre ?

Lenolian
21/11/2005, 09h44
Sans connaitre la détection 2D "pixel perfect", est-ce que le verrouillage de surface n'introduit pas une chute de performance dans ce cadre ?

Forcément mais bon y'a pas vraiment d'autre moyen de récupérer les données située en mémoire vidéo que de passer par un Lock. Avec les bons flags ça ne devrait pas poser de problème (NoSystemLock,ReadOnly...).

Il compile mais à l'éxécution il met : "Le paramètre n'est pas valide."
pour cette ligne la : Bitmap bt = new Bitmap(gs);
Je ne sais pas quelle surchage utiliser

C'est sans doute parceque le bitmap attend un flux avec header et données. le GraphicsStream ne contient que les données.

Tu peut essayer de te passer du bitmap en travaillant directement avec un tableau représentant tes données.

Texture tex = new Texture(/* */);
int[] data = tex.LockRectangle(typeof(int),0,LockFlags.ReadOnly);

pixel = data[(y*tex.Width)+x]; // pixel de coordonnées (x,y);

Ou alors plus rapide mais utilisant du code unsafe :

Texture tex = new Texture(/* */);
GraphicsStream gs = tex.LockRectangle(0,LockFlags.ReadOnly);

unsafe
{
int* ptr = (int*)gs.InternalDataPointer;
int pixel = *(ptr + (y*tex.Width) + x); // pixel de coordonnées (x,y);
}

Loulou
21/11/2005, 10h11
Sans connaitre la détection 2D "pixel perfect", est-ce que le verrouillage de surface n'introduit pas une chute de performance dans ce cadre ?
Conserver une copie en mémoire système peut être une bonne idée dans ce cas, sauf si on est limité au niveau de la mémoire.

grob1212
21/11/2005, 14h50
Est-ce que le but du test de collision est simplement de savoir si 2 sprites ont au moins 1 pixel en commun ? Parce que dans ce cas, je pense que la carte graphique est capable de fournir ce résultat sans nécessiter d'intervention du CPU (via occlusion culling et stencil par exemple). Qu'en pensez-vous ?