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 :

Utiliser une image DirectX avec GDI?


Sujet :

DirectX

  1. #1
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Par défaut Utiliser une image DirectX avec GDI?
    Bonjour
    Je souhaite généré une image (2D/3D) en utilisant un renderer DirectX puis rajouter les overlays (par exemple: texte, lignes, etc...) en utilisant GDI (pour limiter le problème de pixelisation des polices si j'effectuais l'ensemble avec DirectX), dans le but d'imprimer le tout (en utilisant l'API de Windows).
    La difficulté principale vient du fait que j'aimerai effectué ce rendu DirectX dans une résolution supérieure à celle de mon écran (RenderTarget?) afin de pouvoir obtenir une qualité. Qqn peut-il me conseiller, je ne suis pas encore à l'aise avec DirectX. Merci d'avance

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il faut effectivement que tu crées une render target de la taille voulue. Il n'y a rien de vraiment compliqué, et la doc est suffisamment bavarde à ce sujet.

  3. #3
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Par défaut
    Merci. Oui, j'ai deja trouve de la doc concernant un Rendertarget, mais pas sur comment faire l'interface entre ce Rendertarget et une entrée utilisable pour GDI. Si qqn un pseudocode (ou même des mots clefs, qui puissent me faire avancer). Merci pour cette aide si rapide.

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si c'est pour imprimer je suppose que tu n'as plus besoin de DirectX une fois ton rendu effectué ? Donc le plus simple serait peut-être de récupérer la contenu de la render target en mémoire et de gérer comme bon te semble ensuite, non ?

    Dans le cas contraire, il y a IDirect3DSurface9::GetDC qui pourrait t'intéresser.

  5. #5
    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 : 51
    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

  6. #6
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Par défaut
    Citation Envoyé par Laurent Gomila
    Si c'est pour imprimer je suppose que tu n'as plus besoin de DirectX une fois ton rendu effectué ? Donc le plus simple serait peut-être de récupérer la contenu de la render target en mémoire et de gérer comme bon te semble ensuite, non ?
    Tout a fait. Pour avoir une qualité d'impression suffisante, il faut que j'effectue le rendering dans une RenderTarget ayant une résolution assez élevée (ex: 2000 x 2000). Une fois cela fini, je transfere le contenu dans un buffer géré par GDI, j'y rajoute mes informations et j'envoie à l'impression. Si j'ajoute les informations directement avec DIRECTX, alors je vais avoir un problème pour l'impression du texte, donc la résolution ne sera pas adapté. Alors qu'avec GDI, ce problème est évité (l'impression d'une primitive texte est gérée directement, afin de s'adapter à la taille et résolution de l'impression).
    Donc tout cela, c'est ce que je veux faire. Sauf que je n'arrive pas (encore) à trouver comment gérer cela entre DirectX et GDI.

  7. #7
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Par défaut
    Citation Envoyé par moldavi
    Merci. Je l'avais déjà lu. Il ne traite qu'indirectement de ce qui m'intéresse (pas de mélange entre DirectX et GDI et on travaille toujours avec une résolution égale à celle de l'écran).

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je suppose donc que le plus simple, si tu disposes déjà de ce qu'il faut côté GDI pour recevoir ton image, sera de récupérer le HDC de ta render target et d'en faire un blit vers ton HDC perso (ou bien de faire la copie à la main).
    Qu'est-ce qui te pose problème exactement ?

  9. #9
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Par défaut
    Désolé pour ce long silence, j'ai malheureusement été occupé par un autre projet. Je peux désormais me préoccuper exclusivement de cette histoire de directx.
    Ce qui me pose problème, c'est le fait que je ne trouve aucune doc concernant cette recuperation de HDC pour une render target. Donc si qqn a un lien, ou simplement un pseudo-code de la chose, je suis plus qu'intéressé.
    Merci

  10. #10
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Par défaut
    J'utilise actuellement la solution suivante:
    using (Surface s = m_device.GetRenderTarget(0)){
    GraphicsStream g = s.LockRectangle(LockFlags.ReadOnly);
    backbuffer = g.InternalData;
    s.UnlockRectangle();
    }

    J'obtiens ainsi un inptr (backbuffer) qui devrait pointer vers mon image directx. Le probleme, c'est que je n'arrive pas a creer une image gdi avec cela.
    Qqn a-t'il une idee? D'avance merci

  11. #11
    Membre confirmé Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Par défaut
    Salut,

    Je ne sais pas si ca peut t'aider mais j'utilise cette méthode pour obtenir un pointeur vers une image de type Bitmap (ou autre) en mémoire à partir du backbuffer

    - Tu crées une surface avec CreateOffscreenPlainSurface(...)
    - Tu récupéres le pointeur sur la surface du BackBuffer avec GetBackBuffer(...)
    - Tu copies les données de la surface du backbuffer vers la surface créé avec
    GetRenderTargetData(...)
    - Enfin tu utilises D3DXSaveSurfaceToFileInMemory qui te donne un D3DXBUFFER sur l'image Bitmap crée (Bitmap ou autre...)
    - A l'aide de sa méthode GetBufferPointer() tu obtiens le pointeur sur l'image Bitmap et sa taille avec GetBufferSize()

    Méthode qui ne marche qu'avec des backbuffers non multisamplés a cause du GetRenderTargetData(...).

    Pour les multisamplés faut passer par D3DXLoadSurfaceFromSurface(...)
    qui est plus lent...

    J'imagine que ca doit être simple ensuite de manipuler cette Bitmap en mémoire avec le GDI.

    Antoine.

  12. #12
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Par défaut
    Bin non, justement, ce n'est pas facile. Je ne sais justement pas comment gerer mon image issu de DirectX dans un GDI. Existe-il un moyen de copier un tableau dans une structure GDI?

Discussions similaires

  1. Utiliser une image de marqueurs avec cvWatershed
    Par SteveM dans le forum OpenCV
    Réponses: 0
    Dernier message: 09/11/2009, 17h14
  2. Réponses: 6
    Dernier message: 15/11/2007, 13h31
  3. Utiliser une image pour un événement avec swing/awt
    Par Tavarez59 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 23/03/2007, 10h39
  4. Réponses: 7
    Dernier message: 24/01/2007, 11h09
  5. Charger et afficher une image jpg avec les mfc
    Par glop - pas glop dans le forum MFC
    Réponses: 3
    Dernier message: 11/02/2004, 19h59

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