JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Probleme mit GetFrontBufferData

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 24.02.2008, 21:27    Titel: Probleme mit GetFrontBufferData Antworten mit Zitat

Hi,

mein Problem liegt darin begründet, dass ich die Daten des Frontbuffers nicht abrufen kann.
Das ganze will ich deshalb, weil ich einen Screenshot machen möchte.
Ansich "funktioniert" die Funktion "GetFrontBufferData" nur erhalte ich ein schwarzes Bild. Prüfe ich sodann den Rückgabewert so stelle ich fest, das es sich um einen Fehlerwert handelt.
Auch habe ich schon in der DirectX-Dokumentation nachgeschaut, da es ja sein könnte das ich etwas übersehen habe.

Ich hoffe ihr könnt mir behilflich sein

CPP:
BOOL CDirect3D::CreateScreenshot(LPCTSTR lpFileName)
{
   /*Lokale_Variablen*/
   LPDIRECT3DSURFACE9 lpD3DSurface9;  /*Temporäre_Surface*/

   /*Create_Surface*/
   if(FAILED(m_hRes = m_lpD3DDevice9->CreateOffscreenPlainSurface(1280, 1024       ,
                                                                 D3DFMT_A8R8G8B8  ,
                                                   D3DPOOL_SYSTEMMEM,
                                                   &lpD3DSurface9   ,
                                                   NULL)))
   {
      /*Fehler_Meldung/Programm_Beenden*/
      return(ErrMsg("Fehler beim Anlegen der Offscreen_Surface",
                   "Direct3DDevice9_CreateOffscreenPlainSurface_CreateScreenshot_Fehler",
                 m_hRes));
   }

   /*Frontbuffer_Data*/
   if(FAILED(m_hRes = m_lpD3DDevice9->GetFrontBufferData(0, m_lpD3DSurface9)))
   {
      /*Fehler_Meldung/Programm_Beenden*/
      return(ErrMsg("Fehler beim Abrufen der Daten des Frontbuffers",
                   "Direct3DDevice9_GetFrontBufferData_CreateScreenshot_Fehler", m_hRes));
      
   }
   /*Create_Screenshot*/
   if(FAILED(m_hRes = D3DXSaveSurfaceToFile(lpFileName   ,
                                           D3DXIFF_BMP  ,
                                  lpD3DSurface9,
                                  0            ,
                                  NULL)))
   {
      /*Fehler_Meldung/Programm_Beenden*/
      return(ErrMsg("Fehler beim Speichern des Screenshots",
                   "D3DX9_D3DXSaveSurfaceToFile_CreateScreenshot_Fehler", m_hRes));
   }

   /*Release_Surface*/
   if(FAILED(m_hRes = lpD3DSurface9->Release()))
   {
      /*Fehler_Meldung/Programm_Beenden*/
      return(ErrMsg("Fehler beim Freigeben der Surface",
                   "Direct3DSurface9_Release_CreateScreenshot_Fehler", m_hRes));
   }
   lpD3DSurface9 = NULL    ;

   /*Programm_Beenden*/
   return(TRUE);

_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 24.02.2008, 22:27    Titel: Antworten mit Zitat

du sagst, es handelt sich um einen fehlerwert,
Arrow welchen?
Arrow was beschreibt er?
Arrow was steht in der Hilfe dazu?
Arrow was sagt dir die debug-ausgabe von DX (wenn nicht vorhanden: Systemsteuerungen -> DirectX Control Panel -> Debug aktivieren)

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 24.02.2008, 22:39    Titel: Antworten mit Zitat

Um welchen Fehlerwert es sich handelt, kann ich leider nicht sagen, da er nicht ausgegeben wird.
Lediglich weiß ich darüber bescheid, dass es einen Fehlerwert geben muss, da die if-Anweisung ausgeführt wird, also FAILED anschlägt.
Das Programm lässt sich darüber hinaus ausführen, möchte ich aber, mittels F1, einen Screenshot machen, so erhalte ich die Nachricht, die ich selbst mittels der Funktion "ErrMsg()" geschrieben habe, also eine MessageBox öffnet sich:

CPP:
BOOL ErrMsg(LPCTSTR ErrMsg, LPCTSTR ErrTitle, HRESULT hRes,  HWND hWnd)
{
   /*Lokale_Variablen*/
   string DxErr;

   /*Error_Description*/
   DxErr = DXGetErrorDescription9(hRes);
   /*Trace_Error*/
   DXTRACE_MSG(DxErr.c_str());

   /*Fehler_Meldung*/
   MessageBox(hWnd, ErrMsg, ErrTitle, MB_OK);
   /*Programm_Beenden*/
   return(FALSE);
}/*ErrMsg_Funktion*/

_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 25.02.2008, 13:50    Titel: Antworten mit Zitat

Hi, bei Problemen mit DirectX solltest du DirectXers Tip hier unbedingt berücksichtigen, das ist sehr sehr nützlich!

Zitat:
was sagt dir die debug-ausgabe von DX (wenn nicht vorhanden: Systemsteuerungen -> DirectX Control Panel -> Debug aktivieren)


Das DX ControlPanel ist bei neueren SDK versionen aber im SDK Installationsverzeichniss zu finden und nicht mehr in der Systemsteuerung.

Meine Vermutung zu deinem Problem ist aber dennoch folgende:

Deine Surfacegrössenangabe ist nicht korrekt:
Zitat:
For windowed mode, the size of the destination surface should be the size of the desktop. For full-screen mode, the size of the destination surface should be the screen size.


Dies ist aber auch nur eine Vermutung. Als persönlicher Tip würde ich dir aber empfehlen deine Screenshotfunktion zu überdenken, GetFrontBufferData hat schon diverse Nachteile, zB das du den ganzen sichtbaren bereich bekommst und nicht nur den Fensterausschnitt.

Nutze doch zB GetBackBuffer mit D3DXSaveSurfaceToFile.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 25.02.2008, 21:18    Titel: Antworten mit Zitat

Zitat:

Nutze doch zB GetBackBuffer mit D3DXSaveSurfaceToFile.

Danke, hat funktioniert.

Zitat:

Das DX ControlPanel ist bei neueren SDK versionen aber im SDK Installationsverzeichniss zu finden und nicht mehr in der Systemsteuerung.

War auch sehr verwundert, als ich unter Systemsteuerung keinen DX-Eintrag fand. Danke

Zitat:

Deine Surfacegrössenangabe ist nicht korrekt:
Zitat:
For windowed mode, the size of the destination surface should be the size of the desktop. For full-screen mode, the size of the destination surface should be the screen size.

Dachte ich mir auch, zu anfangs. Doch als ich - mehrmals - die Größenverhältnisse geändert hatte, tat sich auch nichts.
_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum