Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

11.10.2008, 12:00

Screenshots machen

Hallo,
ich möchte einen Screenshot machen und ihn in eine Datei speichern.
Dazu verwende ich folgenden Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool SaveScreenshot(LPCTSTR pszFile, D3DXIMAGE_FILEFORMAT diFormat)
{
    LPDIRECT3DSURFACE9 pSurface;
    bool bResult;

    if (m_pD3DDevice->CreateOffscreenPlainSurface(m_Config.DisplayMode.Width, m_Config.DisplayMode.Height,
        D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL) != D3D_OK) return false;

    bResult = (m_pD3DDevice->GetFrontBufferData(0, pSurface) == D3D_OK);

    if (bResult) bResult = (D3DXSaveSurfaceToFile(pszFile, diFormat, pSurface, NULL, NULL) == D3D_OK);

    pSurface->Release();
    return bResult;
}


Wenn ich als Format D3DXIFF_BMP verwende, funktioniert es.
Aber mit D3DXIFF_PNG geht es nicht. Die Funktion gibt zurück, dass sie erfolgreich war, aber das png ist komplett leer (also überall transparent).
Woran könnte das liegen?

MfG,
Max

2

11.10.2008, 13:02

pszFile hat auch ".png" als Endung?
"xxx.png"?
Könnte ja sein, dass du da noch bmp stehen hast :)

3

11.10.2008, 13:48

Nein, als Endung steht korrekt .png da.

4

11.10.2008, 14:05

Ich habe jetzt mal durchgetestet:
Es funktionieren folgende Formate:
BMP, DDS, DIB, HDR, JPG, PFM und TGA.
Bei PPM wird mir ausgegeben, dass es nicht funktioniert hat - Das ist OK, denn laut der Beschrreibung der Funktion D3DXSaveSurfaceToFile geht dieses Format sowieso nicht.

Somit funktionieren also alle Formate bis auf png...
Woran könnte das nur liegen?

5

11.10.2008, 14:34

Wenn man die PNG Datei mit dem DX Texture Tool öffnet und mit "Format" / "Change Surface format" das Format von ARGB auf XRGB ändert, ist der Screenshot sichtbar.
Es scheint also, als ob D3DXSaveSurfaceToFile den Alpha-Channel nicht richtig speichert.

Ich habe per google herausgefunden, dass dieses Problem seit dem DX SDK April 2006 besteht und wie es scheint immer noch nicht behoben wurde: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=389823&SiteID=1

Aber wie kann ich das Problem nun umgehen?

Möglicherweise kann man die Surface vorher schon auf XRGB konvertieren und dann von D3DXSaveSurfaceToFile in ein png speichern lassen.
(Die Konvertierung ist nötig, da man den Frontbuffer nur per ARGB anzapfen kann)
Wie könnte man so etwas realisieren?

6

11.10.2008, 15:26

Ok, das Problem ist gelöst :D

Man muss die Surface erst nach XRGB mit D3DXLoadSurfaceFromSurface konvertieren, dann kann sie mit D3DXSaveSurfaceToFile in ein png gespeichert werden.

Das ganze ist ein Bug im DX SDK, der seit April 06 besteht und noch nicht behoben worden ist.

Werbeanzeige