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

Anonymous

unregistriert

1

02.09.2003, 10:51

Zwei Fragen zu DirectX (Speichern / Schatten)

Hallo David,

erstmal Gratulation zu deinem Buch. Es hat mir den Einstieg in DirectX wirklich sehr erleichtert. Trotzdem hätte ich noch Fragen:

1.) Eine gerenderte Szene soll in eine Datei geschrieben werden. Wie könnte man das am besten lösen?

2.) In meiner Szene existieren verschiedene Objekte, unter anderem ein Spotlicht. Vor dieses Spotlicht soll man verschiedene Formen anordnen können, die dann entsprechend Schatten auf andere Objekte werfen. Auf diese Art soll eine Art geometrischer Diaprojektor realisiert werden. Was ist deiner Meinung nach der erfolgversprechenste Ansatz?

MfG
Troubleshooter

2

02.09.2003, 15:56

1) Ich nehme an das du das sichtbare Bild z.B. als BMP Speichern möchtest. In diesem Fall schau dir mal die Funktion D3DXSaveSurfaceToFile an. Wenn du deine Geometrichen Daten speichern möchteste, must du wohl selber Hand anlegen und deine Vertice Transformieren. Da du sonst nett die Transformierten Vertexdaten bekommst.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

3

02.09.2003, 16:48

Hallo,

ich will den Inhalt eines Device in einer Bitmap speichern. Die angegebene Funktion habe ich nicht gefunden. Sprache ist C#.

Mittlerweile habe ich herausgefunden, dass man den Inhalt des Backbuffer holen kann und dann ein Objekt Graphics erhält, das man ja dann (theoretisch) einfach in eine Datei schreiben kann. Mein Programmcode dazu sieht folgendermaßen aus:

Device dev = new Device(0, DeviceType.Hardware, target, CreateFlags.SoftwareVertexProcessing, presParams);
renderDevice (dev);
Surface backBuffer = dev.GetBackBuffer(0,0,BackBufferType.Mono);
Graphics gr = backBuffer.GetGraphics();
Bitmap img = new Bitmap (this.Width, this.Height, gr);
img.Save ("d:\test.bmp", System.Drawing.Imaging.ImageFormat.Bmp);

Leider scheitert der letzte Befehl (warum auch immer)


Hat jemand eine Idee?


Troubleshooter

Lephro

Frischling

Beiträge: 66

Wohnort: Dortmund

Beruf: Schüler

  • Private Nachricht senden

4

02.09.2003, 23:02

Hmmm

das könnte daran liegen das die Datei garnicht existiert. Ich glaube nämlich das er keine neue Datei anlegt (fals keine vorhanden ist) deswegen scheitert der letzte Befehl warscheinlich auch !

DarthB

Treue Seele

Beiträge: 265

Beruf: Schüler

  • Private Nachricht senden

5

02.09.2003, 23:47

Um das von Hand zu machen solltest du dir die Methoden:
lpDevice->GetFrontBufferData()
lpSurface->LockRect()
in der SDK Doku anschauen (so kommst du an die Daten.)
Danach schaust du dir an wie das Bitmap Fileformat aufgebaut ist. (Hab da jetzt keine Ahnung)
Machst dir ne Struktur für den Header und gegebenenfalls eine für die einzelnen Pixel.
Dann muss du die Einzelnen Pixel aus der Surface in einem Array der Bitmap Struktur für einzele Pixel speichern und deine Header Struktur mit Daten füllen.
Dann öffnest/erstellst du ne neue Datei mit fopen() mit fwrite schreibst du dir erst den Header in die Datei und dann jeden Pixel. Fertig ist das Bitmap und fclose nicht vergessen.

P.S.
Muss mir unbedingt mal Filestreams anschauen! ;)

Ciao DarthB :huhu:

Anonymous

unregistriert

6

03.09.2003, 09:23

Hallo,

schon mal vielen Dank für die vielen Antworten. Vielleicht muss ich mein Problem mal etwas genauer erläutern ;)

Ich habe eine Form mit mehreren Devices, die sich alle dieselbe Szene aus unterschiedlichen Perspektiven ansehen. Nun soll man in jedem Device ein Bitmap generieren können, uU. in einer anderen Auflösung.

Dazu habe ich eine eigene Methode. In dieser wird ein neues Device erzeugt, das die gewünschte Auflösung hat. In dieses wird die Szene aus der Sicht der entsprechenden Kamera gerendert. Nun soll von diesem Device der Inhalt in eine Datei geschrieben werden.

Die Idee mit dem FrontBuffer scheidet damit schon mal aus, da im Frontbuffer der ganze Bildschirminhalt steht und nicht nur das einzelne Fenster (?) . Bleibt also der BackBuffer. Wenn man bei den PresentParameters das PresentFlag auf LockableBackBuffer setzt, kann man den locken und damit auch eigentlich auf die Daten zugreifen. Folgende zwei Zeilen sollten einen Stream liefern, der die Daten enthält:

Surface backBuffer = dev.GetBackBuffer(0,0,BackBufferType.Mono);
GraphicsStream gs = backBuffer.LockRectangle (LockFlags.ReadOnly);

Leider scheint in diesem Stream nicht das gewünschte drinzustehen. Zum einen hat er eine Länge von 2147483647, was bei einer Auflösung von 517x835 etwas viel sein dürfte. Der Backbuffer hat das Format R5G6B6, was ja bedeutet, dass 16 Bit bzw. 2 Byte für ein Pixel stehen. Bei einem komplett schwarzen Device sollten also alle Pixel 0 sein. Das ist aber auch nicht der Fall.

Weiß also jemand, ob

1.) der Ansatz über BackBuffer und GraphicsStream ein erfolgversprechender ist, und falls ja,
2.) wie der GraphicsStream ausgelesen werden muss bzw. welches Format er hat (Header, Daten etc ?).

Troubleshooter

Anonymous

unregistriert

7

03.09.2003, 11:33

Hallo nochmal.

Das Problem hat sich erledigt, es funktioniert jetzt (scheinbar).

Falls jemanden die Lösung interessiert: Der Backbuffer muss Lockable sein, dann kann man sich mit getBackBuffer() ihn holen und mit der statischen Methode SurfaceLoader.Save() abspeichern.

Troubleshooter

Werbeanzeige