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 :

Méthode DirectX D3DXSaveSurfaceToFileInMemory


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut Méthode DirectX D3DXSaveSurfaceToFileInMemory
    Bonjour,

    Je souhaite effectuer la copie d'une portion du backbuffer dans un buffer.
    J'utilise la syntaxe :

    hResult = D3DXSaveSurfaceToFileInMemory(pBitmapBuffer,D3DXIFF_BMP,backbuffer,NULL,&dest);

    backbuffer et dest sont correctement initialisés.
    Malgré tout la méthode me renvoie une erreur à l'exécution.

    Merci pour votre aide ...

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    Et pour info, D3DXSaveSurfaceToFile("d:\\sav.bmp", D3DXIFF_BMP, backbuffer, NULL, &dest)

    fonctionne

  3. #3
    Membre confirmé
    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
    Par défaut
    quelle est la valeur de hr lors de l'erreur ?


    cette macro permet d'avoir un retour plus détaillé en cas d'erreur sur hr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    #define VerifHR(x) { hr = (x); if( FAILED(hr) ) { DXUTTrace( __FILE__, (DWORD)__LINE__, hr, L#x, true ); } }
    sinon j'utilise ce code
    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
    32
    33
    34
    35
    36
    37
    38
     
    void CopieEcran(IDirect3DDevice9* pd3dDevice,wchar_t* nomfichier)
    {
    	fwprintf_s(g_pDebugFile, L"-------- CopieEcran() -------- \n" );	// debug vers fichier 
     
    	HRESULT hr = NULL;
        LPDIRECT3DSURFACE9 Surface = NULL;	// Surface de destination
     
       if (DXUTIsWindowed())	// mode fenêtré
       {
            // Récupération du backbuffer
            VerifHR( pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &Surface) );
     
            // Sauvegarde de la surface dans le fichier
            VerifHR(  D3DXSaveSurfaceToFileW(nomfichier, D3DXIFF_JPG, Surface, NULL, NULL) ); 
       }
       else	// plein écran
       {
    		// la surface doit impérativement avoir les dimensions du device
            hr=pd3dDevice->CreateOffscreenPlainSurface( GetSystemMetrics(SM_CXSCREEN)
    													,GetSystemMetrics(SM_CYSCREEN)
    													,D3DFMT_A8R8G8B8
    													,D3DPOOL_SYSTEMMEM,
    													&Surface
    													,NULL
    													);
     
            // acquiert les données du front buffer
           VerifHR( pd3dDevice->GetFrontBufferData(NULL, Surface) );
     
            // Sauvegarde de l'image dans un fichier, au format JPG
            VerifHR( D3DXSaveSurfaceToFile(nomfichier, D3DXIFF_JPG, Surface, NULL, NULL) );
        }
     
        if ( Surface ) SAFE_RELEASE(Surface);
     
    	return;
    }
    pours la copie d'une zone, utiliser le viewport semble une solution

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    Merci pour votre réponse.
    L'erreur renvoyée est :

    hResult = 0x8876086c

    et je n'ai pas encore réussi à la décoder

  5. #5
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Par défaut
    Vous pouvez utiliser l'outil DirectX Error Lookup fourni avec le SDK. Dans votre cas, il retourne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    HRESULT: 0x8876086c (2289436780)
    Name: D3DERR_INVALIDCALL
    Description: Invalid call
    Severity code: Failed
    Facility Code: FACILITY_D3D (2166)
    Error Code: 0x086c (2156)

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    Merci

    InvalidCall vraiment je ne comprends pas

    dest est bien inclus dans l ecran qui fait 800 x 600

    dest = {top=0x0000012c bottom=0x00000155 left=0x000001c2 right=0x000001e7}

    il y a necessairement une erreur dans un coin ...

Discussions similaires

  1. Méthode DirectX D3DXLoadSurfaceFromSurface
    Par mulfycrowh dans le forum DirectX
    Réponses: 0
    Dernier message: 25/02/2010, 09h27
  2. Directx ou opengl
    Par scorpiwolf dans le forum DirectX
    Réponses: 13
    Dernier message: 07/02/2003, 08h29
  3. OpenGL ou DirectX
    Par Nadir dans le forum DirectX
    Réponses: 6
    Dernier message: 02/05/2002, 12h48
  4. Documentation DirectX dans C++Builder 3
    Par srvremi dans le forum DirectX
    Réponses: 1
    Dernier message: 26/04/2002, 09h59

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