JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=ee8172a4aa8eb6054424484284a4df22Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Wie krieg ich den Backbuffer in ein Surface?

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



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 18.11.2008, 18:39    Titel: Wie krieg ich den Backbuffer in ein Surface? Antworten mit Zitat

Hallo!

Ich bin ganz neu hier und will erst einmal dem Christian Rousselle ein dickes Lob aussprechen, denn ich finde das Buch >jetzt lerne ich DirectX und C++< echt gut. Ich glaube, das hier wirklich die wichtigsten Dinge, die man bei der Spieleprogrammierung benötigt, erfahren kann. Ich bin auch gleich daran gegangen und versuche nun ein eigenes Spiel zu entwickeln. Ich bin auch schon ganz gut voran gekommen, aber jetzt habe ich mich an einem Problem festgebissen: Ich will den Backbuffer in ein Surface auf der Grafikkarte kopieren, aber der wehrt sich! Das Problem ist hier im Forum schon mal aufgetaucht. 2003 schrieb einer:

Wie krieg ich den Backbuffer in ein Surface? Bin verzweifelt

Habe den Lösungsvorschlag dort gelesen, der besagt im Prinzip, das man die Anweisung >GetRenderTarget< benutzen soll, bevor man mit stretchrect den Backbuffer in ein Ziel-Surface kopiert. Diese Lösung funktioniert bei mir aber nicht. Weiß jemand Rat? Shocked
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 18.11.2008, 21:29    Titel: Antworten mit Zitat

Allgemein wäre es ganz gut, ein wenig Code zu zeigen, sowie genau zu beschreiben, was nicht funktioniert (Compilerfehler, Abstürze, es passiert einfach nix usw)
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 19.11.2008, 19:14    Titel: So sieht es aus: Antworten mit Zitat

CPP:
IDirect3DSurface9 *Hintergrund;
IDirect3DSurface9 *Vordergrund;

Grafikkarte->CreateOffscreenPlainSurface(
              BSchirmbreite,
              BSchirmhoehe,
              D3DFMT_X8R8G8B8,
              D3DPOOL_DEFAULT ,
              &Vordergrund,
              0);

Grafikkarte->CreateOffscreenPlainSurface(
              BSchirmbreite,
              BSchirmhoehe,
              D3DFMT_X8R8G8B8,
              D3DPOOL_DEFAULT ,
              &Hintergrund,
              0);
Grafikkarte->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&Hintergrund);


inline void BildschirmAktualisieren(void)
{
  if (FAILED( Grafikkarte->StretchRect(Hintergrund, 0, Vordergrund, 0, D3DTEXF_NONE) ))
      sprintf(Puffer, "StretchRect nicht geschafft");   
 else sprintf(Puffer, "StretchRect geschafft");   
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 19.11.2008, 20:14    Titel: Antworten mit Zitat

Benutzte nächstes mal Cpp Tags Wink

Und sag mal genau wie sich der Fehler äußert.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



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

BeitragVerfasst am: 20.11.2008, 17:57    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
...Und sag mal genau wie sich der Fehler äußert.
und schau ob du in der Ausgabe eine meldung findest (DirectX auf Debug-mode setzen). Normalerweise gibt DirectX hier immer ganz gute Hinweise wo der Fehler liegt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 20.11.2008, 20:28    Titel: Antworten mit Zitat

Ersteinmal Danke für die Hilfe. Um auf das Thema zu kommen: Das Programm läuft ganz normal ab, nur das mir bei Abfrage des Puffers gemeldet wird, daß die Funktion Stretchrect nicht funktioniert hat. Wenn ich mir den Inhalt der Oberfläche >Hintergrund< anzeigen lasse, sehe ich zufällige Fragmente von Bilddaten auf der Grafikkarte.

Zu Jonathan: sei mir bitte nicht böse, aber ich habe gar keine Ahnung, was cpp-tags sind. Crying or Very sad

Zu DirectXer: meinst Du, das ich die Debug Version von DirectX und nicht die Retail -Version istallieren soll? Das ist selbstverständlich der Fall - aber ich weiß nicht wie ich mir directX-spezifische Fehlermeldungen holen kann. Meinst Du das Programm >Spy<, was im DirectX-Zubehör enthalten ist?
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: 21.11.2008, 15:24    Titel: Antworten mit Zitat

Surface des BackBuffers bekommen:

CPP:
IDirect3DSurface9 *BackBuffer = NULL;
Grafikkarte->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&BackBuffer);


Backbuffer wieder frei geben:
CPP:
if (BackBuffer != NULL)
  BackBuffer->Release();
BackBuffer = NULL;


Inhalt des BackBuffers in dein Surface kopieren:
CPP:
Grafikkarte->StretchRect(BackBuffer, 0, ZielSurface, 0, D3DTEXF_NONE);


Deinen ZielBuffer darfst du übrigens NICHT als OffscreenSurface haben, in der DX Dokumentation gibt es eine Tabelle welche besagt das RT (dein BackBuffer ist ein RT) nicht auf Offscreen Plain kopiert werden kann mit StretchRect. Daher musst du ebenfalls eine RT Textur erstellen und von dieser Textur das Surface nehmen:

CPP:
IDirect3DTexture9* ZielTextur = NULL;
Grafikkarte->CreateTexture(
  BSchirmbreite,
  BSchirmhoehe,
  1
  D3DUSAGE_RENDERTARGET,
  D3DFMT_X8R8G8B8,
  D3DPOOL_DEFAULT
  &ZielTextur,
  NULL
);
if (ZielTextur != NULL)
  ZielTextur->GetSurfaceLevel(0, &ZielSurface);
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 21.11.2008, 19:14    Titel: Danke! Antworten mit Zitat

Wärmsten Dank für die wertvolle Hilfe. Lieber Fallen, ich möchte Deine Füße küssen. Alles funktioniert genau so, wie ich es mir vorgestellt habe.

Meine Überlegung war es, anstatt die ganze Szene rendern zu lassen, obwohl sich garnichts bewegt hat, die Szene in ein Surface zu speichern und einfach diese Kopie anzeigen zu lassen. Ich habe nun zu meinem Erstaunen festgestellt, daß das Anzeigen der Kopie scheinbar genau so viel Zeit beansprucht, wie das Rendern der Szene!

Wenn man also eine unbewegte Szene darstellen will, hängt es offenbar vom Berechnungsaufwand der Szene ab, ob man sie rendern lassen, oder kopieren und die Kopie mit stretchrect anzeigen lassen sollte.

Liebe Grüße an alle!
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: 22.11.2008, 01:17    Titel: Antworten mit Zitat

Ansich sollte deine Variante wenn sich wirklich nichts ändert und du nur die Kopie anzeigst ohne dabei jedes mal die Kopie zu erstellen einen Geschwindigkeitsschub geben.

1. Abgesehen davon, wieso renderst du überhaupt etwas wenn sich nichts geändert hat? Wink

2. Wieviel Frames hast du denn mit und ohne "Optimierung", 60? Dann hast du wahrscheinlich VSync aktiv, weniger aber Konstant? Evtl eine Framebremse eingebaut?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



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

BeitragVerfasst am: 22.11.2008, 19:55    Titel: Antworten mit Zitat

telebeppo hat Folgendes geschrieben:
...Zu DirectXer: meinst Du, das ich die Debug Version von DirectX und nicht die Retail -Version istallieren soll? Das ist selbstverständlich der Fall - aber ich weiß nicht wie ich mir directX-spezifische Fehlermeldungen holen kann. Meinst Du das Programm >Spy<, was im DirectX-Zubehör enthalten ist?

Nein, wenn du die Debug Version von DirectX installiert hast findest du in den System Steuerungen eine DirectX Komponente. Das ist das DirectX Control Panel. Da kannst du unter jeder Komponente von DirectX die Häkchen bei Use Debug Version setzen, und auch das Level ändern. (es schadet meist nicht, erstmal die höchste stufe zu nehmen. man bekommt dadurch immer wertvolle hinweise in der ausgabe.

wenn das control panel nicht angezeigt wird in den systemsteuerungen, kannst du diese Datei runterladen und so einrichten wies da steht. du musst allerdings die passende datei für deine directx version haben. diese in dem link ist für 9.0c

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



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 23.11.2008, 13:00    Titel: Antworten mit Zitat

Zu Fallen:

1. Es stimmt nicht ganz, daß sich garnichts ändert. Der Bildschirm-Inhalt bleibt zwar größtenteils unverändert (Ausschnitt einer Landkarte im Hintergrund), aber kleine Bildelemente (z.B. Mauszeiger, Sprites) bewegen sich und müssen an ihrer neuen Position neu gezeichnet werden.

2. mit "Optimierung" etwa 110
0hne variiert es von 80 bis 115
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

BeitragVerfasst am: 23.11.2008, 13:20    Titel: Antworten mit Zitat

Zu DirectXer:

Danke für den Link. Ich benutze Win2000 und habe das DirectX Software Development Kit, Version 9.0c installiert. Mich hat wundert, daß ich in der Systemsteuerung kein Programm zur Steuerung der DirectX-Komponenten finden konnte. Deshalb nochmals Danke. Werde die neuen Debug-Einstellungen bei nächster Gelegenheit ausprobieren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
telebeppo
Mini JLI'ler



Anmeldedatum: 17.11.2008
Beiträge: 36

Medaillen: Keine

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

Habe nun das DirectX Control Panel ausprobiert. Konnte aber fast nirgends den Debug-Modus aktivieren. In grau unterlegter Schrift fand ich den Eintrag: >Managed DirectX is not installed<.

In meinem DXSDK-Ordner fand ich in einem Unterordner ein Installationsprogramm für Managed DirectX, namens: >mdxredist<. Dies Programm habe ich aufgerufen - aber es wurde scheinbar nichts installiert.

Was kann ich tun, um die Funtionen des DirectX Control Panel zu aktivieren? Und wieso hat das DirectX SDK nicht sowieso alles für den Debug-Modus konfiguriert - schließlich habe ich doch die Debug-Version installiert?
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: 23.11.2008, 20:27    Titel: Antworten mit Zitat

Wenn das DX SDK + DX Debug Dlls korrekt installiert ist sollte es funktionieren. hatte selbst aber auch schon den Fall das dies nicht funktionierte, irgendwas habe ich neu installiert und dann ging es wieder. Da ich deinem Codestil entnehme das du nicht mit managed DX arbeitest (ist auch nicht unbedingt ratsam, leider..) brauchst du auch die managed Dlls nicht installieren (was aber sowieso schon der Fall sein sollte).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
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