Seite 1 von 1

[DX9] Desktop Alphablending

Verfasst: 19.12.2009, 15:40
von Zudomon
Hallo!

Weiß jemand, wie man Alphablending realisieren kann, das mit dem Desktop verblendet wird?
Bitte nicht, indem man vorher den Desktop ausliest. Es gibt bestimmt eine Möglichkeit auch direkt auf den Desktop zu blenden.

Gruß
Zudo

Re: [DX9] Desktop Alphablending

Verfasst: 19.12.2009, 15:57
von Aramis
Es ist möglich semitransparente Fenster zu erstellen (SetLayeredWindowAttributes). Das funktioniert aber nicht zusammen mit Direct3D. Der Grund ist, dass D3D (zumindest vor WDDM) völlig unabhängig vom Fenstermanager des Betriebssystems zeichnet und auf diesen eigentlich keine Rücksicht nimmt.

Re: [DX9] Desktop Alphablending

Verfasst: 19.12.2009, 17:52
von Zudomon
Wie ist das denn hier gelöst?
http://rocketdock.com/

Re: [DX9] Desktop Alphablending

Verfasst: 19.12.2009, 23:24
von CodingCat
Vermutlich sieht das auch nur auf Vista und 7 so schick aus, eben wegen besagtem WDM. Ansonsten sehe ich auch nur eine Chance über Layered Windows, was definitiv kein Spaß ist.

Re: [DX9] Desktop Alphablending

Verfasst: 20.12.2009, 13:59
von FredK
Du kannst mit SetWindowRgn dem Fenster ja eine beliebige Form geben. Ich könnte mir sonst noch vorstellen, dass du vor dem Start der Anwendung vom Desktop einen Screenshot machst und auf den das raufzeichnest.

Re: [DX9] Desktop Alphablending

Verfasst: 21.12.2009, 08:12
von Jörg
Du kannst in einen Offscreenbuffer rendern, aus diesem deine Daten auslesen und dann mit den vorgeschlagenen Mitteln das Fenster ueberblenden, wenn du mit den Performance-Einbußen leben moechtest.

Re: [DX9] Desktop Alphablending

Verfasst: 21.12.2009, 08:48
von Zudomon
Vielleicht wäre das wirklich eine Möglichkeit, also den Desktop auslesen, in eine Textur übergeben und dann drüber rendern.

Wenn man folgendes Schema hat:
* Screenshot machen
* Über das Bild eigene Elemente rendern
* Bild ausgeben

Dann wäre auf dem nächsten Screenshot allerdings die angezeigte Form mit drauf.
Ich denke, wenn man die dann vorher versteckt um den Screenshot zu machen, würde das in einem nervigen geflacker enden.

Re: [DX9] Desktop Alphablending

Verfasst: 21.12.2009, 11:53
von Chromanoid
Also WinAmp hat das zumindest früher so gemacht. Auch das auf dem Desktop Hintergrund rendern funktioniert im Grunde bei XP nach dem Prinzip. Einfach eine Desktophintergrundfarbe einstellen und dann immer "screenshot" machen und alles was die Farbe hat überrendern... Das Verfahren dazu findet man auch irgendwo im Quellcode von einem Winamp Visualisierungsplugin. Fenstern kann man ja eine BitmapMaske als Region geben. Anhand dieser kannst du dann den klickbaren Bereich festlegen... Allerdings sind das alles Verfahren aus WinXP Zeiten. Wie das mit Vista/Win7 geht weiß ich nicht....

PS: Ich glaube du solltest direkt auf den Desktop malen. Also erst alles andere darunterliegende Rendern lassen, dann Desktop-Buffer auslesen, dein Zeug drüber malen und wieder freigeben... Deine Form ist dann einfach unsichtbar aber mit Klickbereich... müsste eigentlich gehen...

Re: [DX9] Desktop Alphablending

Verfasst: 22.12.2009, 16:56
von Jörg
Hier ein Code-Schnipsel. Resourcenerstellung fehlt, aber das kannste ja leicht ergaenzen.
Einfach im Pixelshader gleich das Alpha-Premultiply ausfuehren, dann spart man sich noch ein bisschen CPU-Arbeit.
alphaW ist ein Handle auf ein Fenster mit dem EX_LAYERED - Stil.

Performance ist aber die Hoelle :twisted: Waehrend mein Beispiel im normalen Betrieb sichere 60 fps macht, schafft er hier mit Muehe 10.

Code: Alles auswählen

// in den Systemspeicher kopieren
gD3D9D->GetRenderTargetData(m_rtBackBuffer,m_offscreenPlain);
// Ausgabe vorbereiten
HDC dc,gdc;
POINT pos={0,0};
POINT zero={0,0};
SIZE sz={OutputWidth,OutputHeight};
BLENDFUNCTION bf={AC_SRC_OVER,0,255,AC_SRC_ALPHA};
gdc = GetDC(NULL);
m_offscreenPlain->GetDC(&dc);
// Abschicken
UpdateLayeredWindow(alphaW,dc,&pos,&sz,dc,&zero,0,&bf,ULW_ALPHA);
// Aufraeumen
DeleteDC(gdc);
m_offscreenPlain->ReleaseDC(dc);

Re: [DX9] Desktop Alphablending

Verfasst: 22.12.2009, 17:02
von Zudomon
Danke @Jörg. Mit EX_LAYERED habe ich gestern Abend schon implementiert. Das mit den Screenshots war meiner Meinung nach auch nicht der richtige Weg. Ich muss sagen, dass ich Geschwindigkeitsmäßig keine Einbußen habe (zumindest soweit man das ohne FPS Anzeige sagen kann), und dabei führe ich das Alpha-Premultiply noch nicht im Shader aus.

Re: [DX9] Desktop Alphablending

Verfasst: 22.12.2009, 17:20
von Jörg
Vielleicht liegt es an der GraKa, ich hab eine gemaechliche Intel 965.