PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DirectX Filmchen


pajofego
2004-07-12, 20:50:59
Hallo Leute,

ich habe eine ganz kleine Rechensimulation für die GPU in DirectX geschrieben. Mit welchem Tool kann ich davon einen offline Film (mpeg oder ähnliches) machen? Gibt es evt. schon onboard tools?

Danke

Gruss pajofego

Corrail
2004-07-12, 21:12:11
Mit Adobe Premiere kannst du aus Einzelbilder einen Film basteln, wenn es das ist, was du suchst.

pajofego
2004-07-12, 21:45:02
Original geschrieben von Corrail
Mit Adobe Premiere kannst du aus Einzelbilder einen Film basteln, wenn es das ist, was du suchst.
Das weiß ich ehrlich gesagt auch nicht so ganz! ;-) Bei einigen Leuten, die nicht ihr Programm zu verfügung stellen, kann man mpeg Videos von ihren Programmen downloaden. Ich frage mich nur die ganze Zeit, wie die so ein offline rendering machen.

MeLLe
2004-07-12, 21:57:01
Per DirectShow? Keine Ahnung, ist echt ne gute Frage.
Oder man rendert halt wie beschrieben Frame für Frame (nicht time-based, damit's Timing im Film nachher stimmt) und schreibt die Frames fortlaufend in durchnummerierte Screenshot-Files, um daraus dann nen Film zu basteln.

Demi?

Demirug
2004-07-12, 22:07:04
Videos kann man mit DirectShow oder dem alten Video for Windows erzeugen. Das grössere Problem ist dabei aber eher das ganze zeitlich korrekt zu bekommen. Wenn man die Engine selbst programmiert hat get das noch einigermassen einfach wenn man eine eigene von der PC-Uhr entkoppelte Rendertime hat. Diese dann einfach nach jedem Frame um die Dauer eines Frames im Video vorstellen. Dann wieder einen Frame rendern. Das ganze aus dem Framebuffer kopieren und dann an das Video anfügen.

pajofego
2004-07-12, 22:48:54
Original geschrieben von Demirug
Videos kann man mit DirectShow oder dem alten Video for Windows erzeugen. Das grössere Problem ist dabei aber eher das ganze zeitlich korrekt zu bekommen. Wenn man die Engine selbst programmiert hat get das noch einigermassen einfach wenn man eine eigene von der PC-Uhr entkoppelte Rendertime hat. Diese dann einfach nach jedem Frame um die Dauer eines Frames im Video vorstellen. Dann wieder einen Frame rendern. Das ganze aus dem Framebuffer kopieren und dann an das Video anfügen.

...mmh, mit DirectShow kenne ich mich ja überhaupt nicht aus! Wie ist das denn zu verstehen? Läuft DirectShow mit während meines rendering und erstellt ein Video von meiner Ausgabe, oder muss ich ggf. meine Texturen mit z.B. D3DXSaveTextureToFile speichern und dann zu einem Video zusammenbauen?

Noch'ne Frage: Gibt es evt. irgendwo im www ein Sample für mein Problem?

Danke.

MeLLe
2004-07-13, 06:16:05
Also entweder du nimmst gleich fraps (http://www.fraps.com/), oder aber, Plan B ;), du schaust mal hier (http://msdn.microsoft.com/library/en-us/directx9_c/directX/htm/directshow.asp) oder hier (http://www.codeproject.org/audio/avigenerator.asp) nach ...

pajofego
2004-07-13, 09:08:29
Original geschrieben von MeLLe
Also entweder du nimmst gleich fraps (http://www.fraps.com/), oder aber, Plan B ;), du schaust mal hier (http://msdn.microsoft.com/library/en-us/directx9_c/directX/htm/directshow.asp) oder hier (http://www.codeproject.org/audio/avigenerator.asp) nach ...

Cool und danke! Werde mir das gleich alles mal genauer ansehen. Da wird bestimmt etwas dabei sein!

pajofego
2004-09-27, 15:18:59
Hallo Leute,

nachdem ich etwas unglücklich was mit dem Umgang mit dem Programm fraps anbetraf, habe ich mich in das weite www umgetrieben, um nach einer Lsg. meines Problems zu suchen. Ich habe feststellen müssen, dass das speichern des screens als bmp file und das Zusammenlegen zu einem Filmchen mit pjBmp2Avi (http://www.divx-digest.com/software/bmp2avi.html) echt supereinfach ist und ziemlich schnell geht. Das Progrämmchen kann auch das ganze gleich z.B. zu in MPEG-4 komprimieren. Also unten habe ich mal den Teil von meinem Source gepostet um den Inhalt des Screens abzuspeichern. Welche Frameraten ihr wählt und etc. müsst ihr noch definieren alles andere geht echt supereinfach!

Vielleicht braucht es ja einer von euch auch!:smile:

Gruss pajofego




//-----------------------------------------------------------------------------
// Name: ScreenGrab()
// Desc: Saving a screen Shot in DirectX Graphics
//-----------------------------------------------------------------------------
HRESULT clTerrain::ScreenGrab(char *fileName, LPDIRECT3D9 pD3DC)
{
HRESULT hr;

// Get display dimensions
D3DDISPLAYMODE h_mode;
//if (FAILED(hr = this->m_pd3dDevice->GetDisplayMode(0, &h_mode)))
// return hr;

// get adapter number and device window
D3DDEVICE_CREATION_PARAMETERS dcp;
if (FAILED(hr = this->m_pd3dDevice->GetCreationParameters(&dcp)))
return hr;

if (FAILED(hr = pD3DC->GetAdapterDisplayMode(dcp.AdapterOrdinal, &h_mode)))
return hr;

// Create the image surface to store the front buffer image
// Note that call to GetFrontBuffer will always format to A8R8G8B8 !!!
LPDIRECT3DSURFACE9 h_surf;
if (FAILED(hr = this->m_pd3dDevice->CreateOffscreenPlainSurface(h_mode.Width, h_mode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &h_surf, NULL)))
return hr;

// Read the front buffer into the image surface
if (FAILED(hr = this->m_pd3dDevice->GetFrontBufferData(0, h_surf)))
{
SAFE_RELEASE(h_surf);
return hr;
}
else
{
// get the rectangle into which rendering is drawn
// it's the client rectangle of the focus window in screen coordinates
RECT rc;
GetClientRect(dcp.hFocusWindow, &rc);
ClientToScreen(dcp.hFocusWindow, LPPOINT(&rc.left));
ClientToScreen(dcp.hFocusWindow, LPPOINT(&rc.right));

// Write the entire surface to the requested file
hr = D3DXSaveSurfaceToFile(fileName, D3DXIFF_BMP, h_surf, NULL, &rc);
SAFE_RELEASE(h_surf);
return hr;
}
}