Surface, texture et flux video

Signaler
Messages postés
15
Date d'inscription
jeudi 23 septembre 2004
Statut
Membre
Dernière intervention
5 avril 2005
-
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
-
Bonjour,

Voila mon probleme.

Je cree une texture avec CreateTexture(). Ensuite je fait texture->getsurfacelevel pour avoir une surface valide et j'utilise D3DXLoadSurfaceFromMemory() pour charger une image dans une surface a partir d'une image en memoire en gerant la couleur de transparence.

Ensuite je superpose cette surface sur des textures et quand je fait device->present() ma surface met du noir la ou j'avais ma couleur de transparence verte et je ne vois pas les textures qui sont en "dessous".

Je me doute que a la creation de ma surface, elle est par defaut noire et que la couleur de transparence est bien prise en compte mais que cela reste confinée a la surface engendree par le getsurfacelevel.

Disons que je m'exprime mal et que ce que je voudrais realiser c'est une une fonction de type D3DXLoadSurfaceFromMemory mais en n'utilisant pas une surface mais une texture (ce serait tellement plus simple si D3DXCreateTextureFromMemory existait).

Est ce que quelqu'un voit comment je pourrais creer une texture a partir d'un "LPCVOID pSrcMemory" (donc sans donner le nom d'un fichier) ou bien comment mettre une surface dans une texture (c'est moins propre mais bon...).

Ah oui, la finalite de tout ca c'est de mettre une image par dessus un flux video avec gestion de a transparence et tout le toutim donc il est fort problable que vous ayez mieux a proposer.

Merci
Fenrhyr

14 réponses

Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Euuh...dsl je connais rien à DirectX, moi c'est plutôt OpenGL, mais si tu veux j'ai déposé une source contentant un lecteur vidéo, si ça peut te servir...tu peux toujours adapter ;) (auquel cas ça m'intéresserait de voir à quoi ressemblerait la version DirectX :)).

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Messages postés
15
Date d'inscription
jeudi 23 septembre 2004
Statut
Membre
Dernière intervention
5 avril 2005

hmm... oui mais non ^^. Je connais rien à OpenGL (si peu de temps pour tant de choses à faire). Le flux video de ma caméra j'arrive à l'avoir.

Ce que je cherche c'est comment afficher une image par dessus avec des textures et des surfaces, de la transparence et le l'alpha, c'était peu être pas très clair dans le premier post (il était tard, j'étais fatigué, mon lemming a deux doigts du suicide, etc etc etc)...

Des idées ?

Fen'
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Ben, en tous cas dans mon lecteur vidéo je la lis à partir d'une texture;
ce que je peux te conseiller, c'est d'utiliser une texture pour lire ta vidéo, et tu plaques cette texture sur un rectangle sur le plan Z=0 (histoire de voir ta vidéo en 2D ;)).
Ensuite, ben si tu veux mettre une autre texture par dessus, tu peux le faire via du multitexturing par exemple, ou en appliquant ton autre texture sur un rectangle situé un chouilla au-dessus de celui qui utilise la texture de la vidéo (ou sinon tu vires le test de profondeur et tu dessines les 2 en Z=0, c'est plus propre ^^).

Je sais pas si je suis vraiment clair...

C'est pour quel genre de projet? ;)

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Messages postés
15
Date d'inscription
jeudi 23 septembre 2004
Statut
Membre
Dernière intervention
5 avril 2005

Le projet c'est de recuperer le flux video de 2 camera et de mettre des donnees par dessus.

La video texturee multi-texturee (d'une camera pour l'instant), je l'ai deja en z=0 comme tu l'avais suggere.

Le probleme c'est les donnees. Elles sont "stockees" en temps reel dans une image en memoire et non en dur dans un .bmp par exemple (logique puisqu'elle change en temps reel). Donc il faut que j'arrive mettre cette image dans une texture a partir d'une donnee en memoire et môssieur microsoft n'a a priori pas juge utile de faire cette fonction. :dissapprove)

Donc la ca fait deux jours que je cogite en utilisant mon stock de ruses de sioux pour y arriver... sans succes bien sur.

Pour info, mon predecesseur avait fait un truc en openGl qui fonctionnait mais avec un frame rate impossible. On m'a dit de reprendre a 0 avec DX (ce qui sous entend, pas la peine de me demander a quoi ressemble ce code ^^).

Fen'
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Hmm...je suis presque sûr que c'est possible de charger depuis des données en mémoire, c'est plus que logique je trouve...

Enfin si jamais t'y arrives pas tu peux toujours le faire en OpenGL hein lol :p
Dans ce cas-là je pourrais t'aider :p

Ah non attends, je viens de faire une recherche sur Google en...allez va 20 secondes, et j'ai trouvé cette fonction : D3DXCreateTextureFromFileInMemory

Ça devrait être ça non?

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Messages postés
15
Date d'inscription
jeudi 23 septembre 2004
Statut
Membre
Dernière intervention
5 avril 2005

Déjà essayé... une belle texture blanche au final... ?-)

Fen'
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Hmm...je suppose que tu dois avoir la même limitation qu'avec OpenGL : ta texture doitsûrement être obligée d'avoir des côtés puissances de 2 (32x32, 64x32, 128x128...), ce qui n'est certainement pas le cas de ta vidéo ^^

Il doit y avoir une astuce je pense, comme avec OpenGL (un équivalent de gluScaleImage quoi), qui utilise des octets de "bourrage"...

Essaye déjà pour tester en créant toi-même une texture carrée de dimensions 2x2 et contenant un cadrillage noir et blanc, juste pour voir si ta texture reste blanche. Si ça marche on pourra alors aviser ;)

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Messages postés
15
Date d'inscription
jeudi 23 septembre 2004
Statut
Membre
Dernière intervention
5 avril 2005

Mon pere dit toujours: "quand on est pas fort, il faut etre malin".

Alors je l'ecoute ^^. J'ai change d'orientation d'affichage. Plutot que de charger une texture depuis un unique truc en memoire, je vais charger des bmp du disque et faire style que c'est pas vrai par d'habiles effets de trompe-l'oeil en bougeant tout ca dymaniquement.

On va voir si ca marche comme ca.

En ce qui concerne la taille des textures, je ne m'en suis jamais occupe alors ca me parait hautement improbable que toutes celles que j'ai manipule etaient des puissances de 2

Fen'
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Là t'as dit 2 trucs qu'il fallait pas lol :

- "Plutot que de charger une texture depuis un unique truc en memoire, je vais charger des bmp du disque et faire style que c'est pas vrai par d'habiles effets de trompe-l'oeil en bougeant tout ca dymaniquement." -> mauvaise idée : tu vas devoir ouvrir/lire/fermer un fichier sur le disque dur au moins (strict minimum...) 10 fois par secondes. Rajoute en plus que les fichiers sont gros : ce sera trop lent (j'ai déjà essayé ;)).

-"En ce qui concerne la taille des textures, je ne m'en suis jamais occupe alors ca me parait hautement improbable que toutes celles que j'ai manipule etaient des puissances de 2" -> là tu confonds l'image (le fichier BMP par exemple) et la texture. La texture est stockée dans ta carte graphique, et est crée à partir de l'image. A moins que tu aies une carte graphique bien récente qui supporte OpenGL 1.5, ce qui est tout de même assez rarement le cas, à ton "insu", la fonction de DirectX qui crée la texture à partir de ton image l'a crée avec des côtés puissances de 2.
Même si ton image n'a pas des dimensions de la forme 2^n, c'est pas grave : DirectX utilise des octets de "bourrage"; en gros, il laisse certaines parties de la texture vides, dans la mémoire de ta carte (enfin vides...disons remplies avec du blanc, noirou chais pas quoi).

Ta fonction qui crée ta texture à partir d'un fichier fait ça, mais pas D3DXCreateTextureFromFileInMemory à mon avis (beurk qu'est-ce qu'ils sont longs ces noms de fonctions en DirectX :S).

Enfin, rien ne t'empêche de faire le petit test de la texture en damier dont je te parlais non?

Dans tous les cas c'est toi qiu vois...

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Messages postés
15
Date d'inscription
jeudi 23 septembre 2004
Statut
Membre
Dernière intervention
5 avril 2005

Alors... ^^

"mauvaise idée : tu vas devoir ouvrir/lire/fermer un fichier sur le disque dur au moins (strict minimum...) 10 fois par secondes. Rajoute en plus que les fichiers sont gros : ce sera trop lent (j'ai déjà essayé ;))."

Pour ca je comptais faire une fonction qui me charge les donnees de mon bmp dans un fichier (nom, largeur, hauteur et cle numerique), et au moment de charger un bmp je regarde dans mon fichier pour voir s'il n'a pas deja ete charge. si oui pas la peine de le recharger.

Pour la taille des textures, comme de l'image ^^, je n'ai jamais pense a faire du 2 puissance n...

Pour la texture en damier, j'ai pas vraiment le temps (j'ai un maitre de stage tyranique ! ^^) et on m'a demande d'essayer avec VMR9 maintenant (soyons fous). Mais je pense quand meme que c'est reculer pour mieux sauter, m'enfin, on me paye pas pour reflechir ^^.

Fen'
Messages postés
39
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
17 janvier 2005

salut
tt ceci minteresse... je dois saisir une vidéo est y rajouter des simbole par dessu donc si on pouvé m'aider me donner des code source ou autre ce serais cool
merci d'avance....

:-p
Messages postés
15
Date d'inscription
jeudi 23 septembre 2004
Statut
Membre
Dernière intervention
5 avril 2005

Oula, c'est vieux ca... ^^

Pour le code source, j'ai pas encore fini et je ne sais pas s'il te sera utile vu que tout a ete fait sous Qt...

Pour kammem te renseigner, VMR9 m'a semble le plus indique en terme de cout processeur pour afficher des choses par dessus une image. Le probleme c'est que tu ne peux afficher qu'UNE surface en overlay (et non pas une par symbole) Il faudra que tu fasses une grande image dans laquelle tu mets tout tes symboles (apres si les symboles doivent bouger separement ou changer de forme, mieux veut surement passer pas plusieurs textures et non VMRalphabitmap)

Pour la video, je te propose d'aller faire un tour sur CodeGuru.com, tu y trouveras des codes sources en libre service, c'est la que j'ai trouve ma base pour acquerir mon flux video.

Amuse-toi ^^
Fen'
Messages postés
39
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
17 janvier 2005

oki merci fenrhyr pour les info je faire avec ça.....

:-p
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
En cas, mon code source lecteur vidéo OpenGL permet aussi d'écrire sur la vidéo, pour peu que l'on prenne la peine de voir un peu comment ça marche...;)

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/