[DX9] Desktop Alphablending
[DX9] Desktop Alphablending
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
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
- Aramis
- Moderator
- Beiträge: 1458
- Registriert: 25.02.2009, 19:50
- Echter Name: Alexander Gessler
- Wohnort: 2016
- Kontaktdaten:
Re: [DX9] Desktop Alphablending
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
Wie ist das denn hier gelöst?
http://rocketdock.com/
http://rocketdock.com/
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: [DX9] Desktop Alphablending
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.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Re: [DX9] Desktop Alphablending
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
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
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.
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.
- Chromanoid
- Moderator
- Beiträge: 4273
- Registriert: 16.10.2002, 19:39
- Echter Name: Christian Kulenkampff
- Wohnort: Lüneburg
Re: [DX9] Desktop Alphablending
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...
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
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.
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);
Zuletzt geändert von Jörg am 22.12.2009, 17:17, insgesamt 1-mal geändert.
Re: [DX9] Desktop Alphablending
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
Vielleicht liegt es an der GraKa, ich hab eine gemaechliche Intel 965.