|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 24.02.2008, 20:27 Titel: Probleme mit GetFrontBufferData |
|
|
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 |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 24.02.2008, 21:27 Titel: |
|
|
du sagst, es handelt sich um einen fehlerwert,
welchen?
was beschreibt er?
was steht in der Hilfe dazu?
was sagt dir die debug-ausgabe von DX (wenn nicht vorhanden: Systemsteuerungen -> DirectX Control Panel -> Debug aktivieren)
Gruß DXer |
|
Nach oben |
|
|
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 24.02.2008, 21:39 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 25.02.2008, 12:50 Titel: |
|
|
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 |
|
|
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 25.02.2008, 20:18 Titel: |
|
|
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 |
|
|
|
|
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
|