[D3D9] mit WinAPI kombinieren

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

[D3D9] mit WinAPI kombinieren

Beitrag von Krishty »

Ich möchte Direct3D (9) für Hintergrundgrafik benutzen, und stinknormale Win32-Fenster (Knöpfe und sowas) drüberzeichnen lassen.

Ein Bisschen Recherche hat ergeben, dass das ein harter Brocken sein soll. Eigene Experimentiere hingegen haben es unter Windows 7 mit Classic Theme ziemlich schnell funktionieren lassen: das Hintergrundfenster braucht bloß WS_EX_COMPOSITED damit streng die Zeichenreihenfolge von hinten nach vorn eingehalten wird.

Aber ich möchte es auch unter Windows XP haben und habe kein System zum testen hier. Hat jemand Erfahrungen mit der Situation? Ist WS_EX_COMPOSITED ein Trugschluss?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D9] mit WinAPI kombinieren

Beitrag von Krishty »

Ein paar Knöpfe und eine Toolbar:
14-06-23 transparency over D3D 9.png
14-06-23 transparency over D3D 9.png (6.88 KiB) 1506 mal betrachtet
Ich werde prüfen, was ich sonst noch an Controls reinkriege. Ich muss unbedingt ein XP-System zum Testen anschaffen. Es steht auch noch völlig in den Sternen, wie die Leistung ist.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: [D3D9] mit WinAPI kombinieren

Beitrag von Spiele Programmierer »

Wenn eine Exe angehängt wäre, könnte man es ja schnell ausprobieren.
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D9] mit WinAPI kombinieren

Beitrag von Krishty »

Merci! Ich hoffe, dass die XP-CRT von Visual Studio 2012 hält, was sie verspricht. Habe sie statisch eingebunden. Als DirectX-SDK *sollte* June 2010 reichen.

Ich habe dummerweise D3D *nach* Erzeugen des Fensters initialisiert; du musst einmal die Größe ändern wenn du startest damit überhaupt was sichtbar wird.

Ich habe gerade gemerkt, dass die Toolbar mit Aero flimmert aber mit Classic nicht. Mal gucken, was das wieder ist.
Dateianhänge

[Die Dateierweiterung exe wurde deaktiviert und kann nicht länger angezeigt werden.]

seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D9] mit WinAPI kombinieren

Beitrag von Krishty »

Okay; also Controls gehen ganz gut, nur: Transparenz ist für’n Popo.

Mit Aero wurde transparentes GDI-Zeichnen abgeschafft. SetBkMode(hdc, TRANSPARENT) und NULL_BRUSH/HOLLOW_BRUSH haben keine Wirkung sobald Aero aktiviert ist. Das macht wirklich wirklich hässliche Blöcke.

Offenbar bin ich nicht allein mit diesem Problem: Hier (keine Antworten); hier (als Aero-Bug abgetan); hier (keine Lösung); hier (Frage nicht verstanden); hier (Frage nicht verstanden); hier (keine Antwort); hier (kaum behilflich).

Und das ist wirklich ironisch: Aero, das Flackern abschaffen und sichere Komposition ermöglichen sollte, lässt dafür alle alten Programme, die das früher sauber geschafft haben, flimmern wie eine Motel-Neonröhre und und lässt transparente Flächen dichter decken als Deine Mutter®. Ich kann Direct3D und GDI problemlos überlagern – aber nur ohne Aero. Ganze Arbeit!

Greg Schlechter erklärt ein Bisschen:
Greg Schechter's Blog — Redirecting GDI, DirectX, and WPF applications hat geschrieben:The form of mixing that doesn't work well is when an application uses DirectX and GDI to target the same HWND. This has never been a supported scenario with DirectX, but there have been scenarios where it has happened to work.
Mhmm mhmm. Damit wäre die Eingangsfrage beantwortet: D3D + Win32 auf dem selben HWND ist nicht erlaubt.
Under the DWM, this is much more problematic, because there can be no guarantee of ordering between the DirectX and the GDI rendering.
Meinen Beobachtungen nach besteht durchaus Ordnung; aber nur, so lange kein WS_EX_TRANSPARENT im Spiel ist. Dann geht es nämlich leider ziemlich drunter und drüber (wörtlich?).
This is most troublesome when GDI and DirectX are not only rendering to the same HWND, but to overlapping areas of the same HWND. As such, this usage pattern is not supported.
Ja — was ich hier mache ist böse.
Note that there is an alternative that can often work for an application -- DirectX is capable of handing back a DC to a DirectX surface, and applications can perform GDI rendering to that DC. From the DWM's perspective, that DirectX surface remains purely rendered by DirectX, and all is well.
Das klingt fast, als sei dieses Szenario Hardware-beschleunigt. Hmmmmmmm. Nur wie kriege ich die Child Windows dazu, in ein bestimmtes DC zu zeichnen? Aber wenn ich via WM_PRINTCLIENT das Fenster in den D3D-DC zeichne, dann geht das nur, während die Controls in dem Fenster sichtbar sind. Wenn sie sichtbar sind, zeichnen sie aber bereits selber auf den Bildschirm (zusätzlich zum DC) und ich zeige letzten Endes alles doppelt an.

Wtf?! Wie kriege ich WM_PAINT komplett abgebrochen (auch für alle Kinder!) und löse WM_PRINTCLIENT für die Kinder aus damit die in dem DC landen, das D3D endlich auf dem Bildschirm ausgibt?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten