Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
telebeppo Mini JLI'ler
Anmeldedatum: 17.11.2008 Beiträge: 36
Medaillen: Keine
|
Verfasst am: 18.11.2008, 18:39 Titel: Wie krieg ich den Backbuffer in ein Surface? |
|
|
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? |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 18.11.2008, 21:29 Titel: |
|
|
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 |
|
|
telebeppo Mini JLI'ler
Anmeldedatum: 17.11.2008 Beiträge: 36
Medaillen: Keine
|
Verfasst am: 19.11.2008, 19:14 Titel: So sieht es aus: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 19.11.2008, 20:14 Titel: |
|
|
Benutzte nächstes mal Cpp Tags
Und sag mal genau wie sich der Fehler äußert. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 20.11.2008, 17:57 Titel: |
|
|
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 |
|
|
telebeppo Mini JLI'ler
Anmeldedatum: 17.11.2008 Beiträge: 36
Medaillen: Keine
|
Verfasst am: 20.11.2008, 20:28 Titel: |
|
|
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.
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 21.11.2008, 15:24 Titel: |
|
|
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 |
|
|
telebeppo Mini JLI'ler
Anmeldedatum: 17.11.2008 Beiträge: 36
Medaillen: Keine
|
Verfasst am: 21.11.2008, 19:14 Titel: Danke! |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 22.11.2008, 01:17 Titel: |
|
|
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?
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 |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 22.11.2008, 19:55 Titel: |
|
|
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 |
|
|
telebeppo Mini JLI'ler
Anmeldedatum: 17.11.2008 Beiträge: 36
Medaillen: Keine
|
Verfasst am: 23.11.2008, 13:00 Titel: |
|
|
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 |
|
|
telebeppo Mini JLI'ler
Anmeldedatum: 17.11.2008 Beiträge: 36
Medaillen: Keine
|
Verfasst am: 23.11.2008, 13:20 Titel: |
|
|
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 |
|
|
telebeppo Mini JLI'ler
Anmeldedatum: 17.11.2008 Beiträge: 36
Medaillen: Keine
|
Verfasst am: 23.11.2008, 18:21 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 23.11.2008, 20:27 Titel: |
|
|
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 |
|
|
|