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 :

animation 3D sur fond transparent


Sujet :

DirectX

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut animation 3D sur fond transparent
    Bonjour,

    Je suis débutant sur l'utilisation de DirectX et je suis actuellement en train de travailler sur un moteur en C++ qui affiche actuellement des petites animations 3D (DirectX 8) dans des fenêtres standards de windows. La création des fenêtre se fait donc de la manière la plus classique (CreateWindowEx, ShowWindow...). J'aimerais à présent pouvoir supprimer la fenêtre et le fond afin que l'animation s'affiche directement par dessus le bureau, de la même manière que les animations des compagnons d'office par exemple, mais avec des animations direct3D.

    J'ai vu sur des forums qu'il était possible de spécifier une couleur transparente, pour par exemple faire des fenêtres qui ne sont pas carrées, en créant une fenêtre de type WS_EX_LAYERED et en spécifiant une couleur et une transparence avec SetLayeredWindowAttributes. Problème, cette méthode ne semble pas fonctionner avec des animations 3D, car en plus de laisser la couleur du fond, j'ai une occupation processeur à 100% et un affichage qui fait des bandelettes noires, comme un écran qui a du mal à se synchroniser...

    J'ai poussé la recherche un peu plus loin, et en regardant les exemples fournis avec visual studio, il y a une petite application DirectX (mosquito) qui affiche des bitmaps successifs sur le bureau d'un moustique. Ce n'est pas une animation 3D, mais cet exemple m'a interpelé car il utilise une autre méthode, qui ne fait appel qu'à DirectX semble-t-il, et qui pourrait donc peut être être compatible avec mon animation 3D. L'idée semble de créer une fenêtre overlay qui prend en charge la transparence, mais n'ayant aucune connaissance dans le domaine, je ne sais pas si c'est la bonne méthode et encore moins s'il est réellement possible d'atteindre mon objectif, ni même comment...

    Je voulais donc savoir si qqun avait déjà planché sur le problème et avait des directions à me donner ou bien des exemples pour intégrer une animation 3D en transparence dans windows ?

    merci pour votre aide !

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Salut.

    Intéressant ce que tu veux faire. C'est vrai qu'avec directx, je ne sais plus quelle version, on pouvait faire de l'overlay sur le bureau, mais avec directdraw, donc en 2D.

    Pour le faire en 3D, je verrais bien cette astuce, mais je n'ai jamais essayé:

    Tu peux utiliser le desktop pour l'affichage de ton application 3D. Tu récupères l'image qui est utilisé par le bureau et tu l'utilises comme fond de l'application 3D. Un inconvénient de cette méthode, si elle est réalisable, c'est que ton animation se trouvera derrière les icônes du bureau et pas devant, mais c'est peut-être le but recherché.

    Une autre astuce serait de créer un desktop virtuel, mais bon là y a du travail.

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse, effectivement l'overlay directdraw est bien mais l'exemple est effectivement pour la 2D et je ne sais pas comment faire pour la 3D...

    Je voulais préciser, l'animation peut être sur le bureau comme devant une autre application (comme powerpoint), donc le fond peut être animé, il est donc vraiment nécessaire d'avoir un fond transparent...

    Si tu as d'autres idées, je suis preneur !

  4. #4
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Dans le livre DirectX "Micro Application":

    "Le support des surfaces overlays est exclusivement assuré par le matériel, sans émulation possible via DirectDraw. Il est de plus utopique aujourd'hui de penser que DiretX Graphics, nouveau composant de DirectX, permettra un jour de l'émuler; cela ne me semble pas entrer parmi les priorités de l'équipe de développement DirectX. La version 8.1 actuelle n'intègre toujours pas cette spécificité."
    A toi de vérifier, avant de te lancer si les nouvelles versions de DirectX prennent en charge l'émulation.

    Sinon ce sera de la bidouille, pas évidente à mettre en place, à cause des problème de focus, de fenêtre premier plan, de couleur de transparence, etc...

    Par contre pour le DirectX à venir et Vista, il est possible qu'il y ait une prise en charge. M'a vaguement semblé entendu parler d'environnement 3D pour le bureau...

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je risque donc en effet d'avoir des difficultés à intégrer un élément Direct3D... Je viens de migrer l'application sous DirectX 9 et elle fonctionne, mais DirectX 9 ne semble pas apporter plus de possibilités à ce niveau. Il y a peut être une solution autre que l'overlay, qui me semble plutôt destiné à des applications vidéos type dvd et pour incruster des bitmaps par exemple. Pourtant, je sais que ce que je recherche est possible car j'ai déjà vu des applications qui affichaient des bonhommes en 3D en transparence, et ce, que ce soit sur le bureau ou sur une fenêtre d'une application (powerpoint, internet explorer, etc...). C'est exactement le genre de choses que j'aimerais pouvoir faire... mais j'ai un peu du mal à trouver une piste de travail, d'autant plus que mes connaissances sur directX sont très limitées !

    En ce qui concerne windows vista, effectivement, aero permet d'avoir un bureau en 3D, calculé vectoriellement, donc ce type d'application devrait être facile à faire. Mais windows vista n'est pas encore sorti, on ne sait pas non plus quand il sortira, et on ne sait pas si les nouvelles fonctions seront réellement faisables avec une carte vidéo directX 9. Il faut également que l'application puisse tourner sur une petite configuration comme mon portable (chipset intel...) qui ne pourrait donc pas faire tourner vista. De plus j'ai besoin de trouver une solution assez vite, ce qui fait que windows vista n'est vraiment pas envisageable...

    Merci en tous cas pour l'info à propos des surfaces overlay !

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 38
    Points : 64
    Points
    64
    Par défaut
    Ca tue un peu les perfs mais tu peux blitter avec transparence le contenu de ton frame buffer sur le bureau.

    Tu fais ton rendu, tu récupères ta surface (ton frame buffer) tu l'affiches avec une color key ou une transparence alpha sur ton bureau comme une simple image 2D.

    Alexis.

  7. #7
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Et comment cela se fait techniquement ? J'ai effectivement mon rendu que j'affiche normalement dans une fenêtre classique, mais tu sembles signifier qu'il est possible d'écrire directement l'objet dans la zone mémoire contenant l'image déjà présente à l'écran ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Mars 2006
    Messages : 143
    Points : 112
    Points
    112
    Par défaut
    utilise les fonctions LockRect() et UnlockRect() pour écrire directement dans la mémoire vidéo

    exemple du sdk d3d9 pour modifier directement une texture en mémoire, pour une surface c'est la même fonction

    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
    // Initialize the alpha channel
    int  yGrad, xGrad;
    D3DLOCKED_RECT lockedRect;
     
    if(SUCCEEDED(pTexture->LockRect(0, &lockedRect, NULL, D3DLOCK_DISCARD ))
    {
    	m_pRGBAData = new DWORD[128*128];
    	if( m_pRGBAData != NULL )
    	{
    		for( DWORD y=0; y < m_dwHeight; y++ )
    		{	
    			DWORD dwOffset = y*m_dwWidth;
    			yGrad = (int)(((float)y/(float)m_dwWidth) * 255.0f);
     
    			for( DWORD x=0; x < m_dwWidth; x )
    			{
    				xGrad = (int)(((float)x/(float)m_dwWidth) * 255.0f);
     
    				DWORD b = (DWORD)(xGrad + (255 - yGrad))/2 & 0xFF;
    				DWORD g = (DWORD)((255 - xGrad) + yGrad)/2 & 0xFF;
    				DWORD r = (DWORD)(xGrad + yGrad)/2 & 0xFF;
    				DWORD a = (DWORD)(xGrad + yGrad)/2 & 0xFF;
     
    				lockedRect.pBits[dwOffset+x] = ((a<<24L)+(r<<16L)+(g<<8L)+(b));
    				x++;
    			}
     
    			pTexture->UnlockRect(&lockedRect);
    		}
    	}
    }

  9. #9
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je réup le sujet car je n'ai toujours pas trouvé de solution au problème, il semble que je me sois mal exprimé sur la problématique.

    En tant normal donc je crée mon mesh et je fais le rendu sur un fond avec transparence, et ce dans une fenêtre windows (classique, jusque là pas de problème).

    Le truc c'est que je voudrais me débarasser de la fenêtre ou alors la rendre complètement transparente, ainsi que son fond. Quand j'essaie en créant une fenêtre WS_EX_LAYERED à la place de WS_EX_APPWINDOW (dans CreateWindowEx) et que je fais par exemple :
    SetLayeredWindowAttributes(_hWnd, 0, 100, 0x02);

    Cela marche lorsque je ne mets pas d'animation 3D (le fond est transparent). Par contre dès que je mets la boucle de rendu qui exécute _pD3DDevice->Present (NULL, NULL, NULL, NULL); pour afficher le personnage, mon écran se met à faire des stries qui naviguent du haut vers le bas. De plus le processeur est occupé à 100% ce qui revient quasiment à planter le PC.

    J'ai également essayé de récupérer le hwnd d'une autre fenêtre par exemple. Là j'arrive à écrire sur le bureau par exemple pour faire le rendu, mais toute la fenêtre de l'animation est mise dans un carré noir, et n'est donc pas transparente. De plus, si je fais ça avec une fenêtre d'une application à la place du bureau, il ne se passe tout simplement rien.

    Ce que je voudrais, c'est pouvoir faire le rendu de mon personnage non pas sur un fond d'une fenêtre que je crée mais en transparence sur une fenêtre d'une autre application déjà ouverte. Et toutes les techniques citées ci-dessus, soit je ne les ai pas comprises, soit elles ne correspondent pas à cette requête.

    Merci de m'aider, je ne trouve pas de solution !!!

  10. #10
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Re.

    L'OS actuel de microsoft ne permet pas de faire ce que tu veux. Le GDI et Directxgrahics sont deux choses différentes.

    Le layering pour une fenêtre GDI fonctionne parce que l'OS le permet et qu'il propose des fonctions.

    Le reste en 3D sera de la bidouille que visiblement personne ici n'a expérimentée.

    La seule chose que je verrais de réalisable, c'est l'utilisation d'un desktop virtuel ou là tu vas gérer l'affichage de A à Z. Mais comme je l'ai dis il y a du travail...

  11. #11
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Citation Envoyé par Octopod

    Ca tue un peu les perfs mais tu peux blitter avec transparence le contenu de ton frame buffer sur le bureau.

    Tu fais ton rendu, tu récupères ta surface (ton frame buffer) tu l'affiches avec une color key ou une transparence alpha sur ton bureau comme une simple image 2D.

    Alexis.
    Citation Envoyé par addicts

    Et comment cela se fait techniquement ? J'ai effectivement mon rendu que j'affiche normalement dans une fenêtre classique, mais tu sembles signifier qu'il est possible d'écrire directement l'objet dans la zone mémoire contenant l'image déjà présente à l'écran ?
    Re.

    J'avais oublié ça. Comme le suggère Octopod, tu récupères le backbuffer ou le front buffer (cette question est régulièrement posée sur ce forum et peut-être même que la FAQ explique comment).

    Tu utilises cette frame comme une texture 2D que tu utilises avec directdraw et tu fais de l'overlay sur le bureau.

    Par contre niveau performance faut voir.

  12. #12
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Merci pour ces réponses... je vais voir si je peux le mettre en oeuvre. Pourtant j'ai déjà vu des applications 3D tourner sur fond transparent, mais peut-être étaient elles faites en openGL ?

  13. #13
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Citation Envoyé par addicts

    Pourtant j'ai déjà vu des applications 3D tourner sur fond transparent, mais peut-être étaient elles faites en openGL ?
    Salut.

    Je ne pense pas que ce soit un problème d'API mais bien un problème d'OS.

    Peux-tu me dire quelles applications tournent sur fond transparent, histoire que je jette un oeil.

Discussions similaires

  1. [Flash Pascal] Animation sur fond transparent
    Par Roland Chastain dans le forum Flash Pascal
    Réponses: 3
    Dernier message: 29/10/2014, 10h29
  2. Bavure en drawtext sur fond transparent
    Par olibara dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/03/2009, 21h39
  3. Afficher une image sur fond transparent
    Par FRED.G dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 10/07/2008, 15h22
  4. Probleme avec drawstring sur fond transparent
    Par kakrocq dans le forum Framework .NET
    Réponses: 5
    Dernier message: 23/05/2008, 23h00
  5. Réponses: 7
    Dernier message: 18/07/2007, 15h52

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