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 :

Probleme de LockRect sur le BackBuffer


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 12
    Par défaut Probleme de LockRect sur le BackBuffer
    Bonjour,

    Sur une variuation de prise de "screenshot", je souhaite recuperer le backbuffer et le manipuler dans une version Bitmap (gdi+).

    Pour cela je fais : (c du dx8 pour des raisons qui ne sont pas de mon fait)

    IDirect3DSurface8* buf;
    g_pd3dDevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &buf)))

    D3DLOCKED_RECT rect;
    buf->LockRect(&rect,NULL,0);
    buf->UnlockRect();
    Gdiplus::Bitmap* uneImage = new Gdiplus::Bitmap(......)
    buf->Release();

    Le probleme est que le rect apres le LockRect ne contient rien et que j'en ai besoin pour créer mon Bitmap via Gdi+.

    J'ai lu qq part que le backBuffer pour etre lock je devait mettre D3DPRESENTFLAG_LOCKABLE_BACKBUFFER dans les Flags du D3DPRESENT_PARAMETERS mais ca ne change rien que je le fasse ou pas

    Qq'un aurait une idée ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    Par défaut
    Citation Envoyé par FTrevisan
    IDirect3DSurface8* buf;
    g_pd3dDevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &buf)))

    D3DLOCKED_RECT rect;
    buf->LockRect(&rect,NULL,0);
    buf->UnlockRect();
    Gdiplus::Bitmap* uneImage = new Gdiplus::Bitmap(......)
    buf->Release();
    Il est où l'interet de lock et d'unlock direct ensuite ton rectangle ? Parceque la ton rect si tu l'utilises dans ta création de bitmap c'est évident qu'il pointeras sur rien.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    D3DLOCKED_RECT rect;
    buf->LockRect(&rect,NULL,0);
    Gdiplus::Bitmap* uneImage = new Gdiplus::Bitmap(......);
    buf->UnlockRect();
    buf->Release();
    Me semble plus logique.

  3. #3
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    C'est surtout la mauvaise façon de faire..

    la bonne manière c'est d'appeler soit getfrontbufferdata (pour récuperer le contenu de l'écran pour faire des screenshots).

    Soit GetRendertargetData (pour récuperer le contenu de n'importe quel buffer de rendu), attention à le faire de préférence sur un buffer non antialiasé/multisampled (après un stretchrect dans un second buffer non antialiasé de meme dimension par exemple si ton buffer était antialiasé au départ).

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 12
    Par défaut
    Citation Envoyé par LeGreg
    C'est surtout la mauvaise façon de faire..

    la bonne manière c'est d'appeler soit getfrontbufferdata (pour récuperer le contenu de l'écran pour faire des screenshots).

    Soit GetRendertargetData (pour récuperer le contenu de n'importe quel buffer de rendu), attention à le faire de préférence sur un buffer non antialiasé/multisampled (après un stretchrect dans un second buffer non antialiasé de meme dimension par exemple si ton buffer était antialiasé au départ).

    LeGreg
    Pourquoi je fais un GetBackBuffer ?
    Parceque c la maniere decrite dans la faq et d'autres sujets pour recuperer la surface qui m'interesse (cf http://jeux.developpez.com/faq/direc..._capture_ecran)

    Mais je vais essayer avec ce que tu me dis.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 12
    Par défaut
    Citation Envoyé par blastou
    Il est où l'interet de lock et d'unlock direct ensuite ton rectangle ? Parceque la ton rect si tu l'utilises dans ta création de bitmap c'est évident qu'il pointeras sur rien.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    D3DLOCKED_RECT rect;
    buf->LockRect(&rect,NULL,0);
    Gdiplus::Bitmap* uneImage = new Gdiplus::Bitmap(......);
    buf->UnlockRect();
    buf->Release();
    Me semble plus logique.
    Si je fais un lock/unlock c juste pour que le D3DLOCKED_RECT soit "rempli", et utilisable par Gdi+ c tout, je ne compte pas manipuler le D3DLOCKED_RECT.

    De plus, comme moi ou comme toi, ca ne change rien, g tj le meme probleme.

  6. #6
    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
    Citation Envoyé par FTrevisan
    Si je fais un lock/unlock c juste pour que le D3DLOCKED_RECT soit "rempli", et utilisable par Gdi+ c tout, je ne compte pas manipuler le D3DLOCKED_RECT.
    Après l'appel à UnlockRect les données contenues dans ton D3DLOCKED_RECT ne sont plus valides.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 12
    Par défaut
    Ok merci, ce n'etait pas mentionné dans la doc (ou alors j'ai tres mal aux yeux ) mais ca ne hcange rien à mon probleme : le D3DLOCKED_RECT n'est pas "rempli" apres le LockRect !!!

    Merci de vos aides en tout cas.

  8. #8
    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
    Par défaut
    Bonjour.

    Il faut toujours tester les valeurs de retour d'appel de fonction. Surtout quand on ne comprends pas ce qu'il se passe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buf->LockRect(&rect,NULL,0);
    Cette fonction retourne un HRESULT. Si la fonction échoue, il n'y aura rien dans le buffer. Mais avec ce code tel quel, impossible de savoir si le lock a réussit.

Discussions similaires

  1. Problème graveur ide sur mdk10
    Par Hanslip dans le forum Matériel
    Réponses: 40
    Dernier message: 26/10/2004, 13h17
  2. Problème de BOOT sur CD pour une installation d'une DEBIAN
    Par black is beautiful dans le forum Debian
    Réponses: 7
    Dernier message: 22/09/2004, 21h15
  3. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26
  4. [C#] problème si clic sur "précédent"
    Par moimoimoi dans le forum ASP.NET
    Réponses: 13
    Dernier message: 11/03/2004, 15h30
  5. probleme d'installation sur d'autres postes
    Par VBkiller dans le forum Composants VCL
    Réponses: 4
    Dernier message: 18/09/2002, 18h14

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