[DX9] Desktop Alphablending

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Zudomon
Establishment
Beiträge: 2259
Registriert: 25.03.2009, 07:20
Kontaktdaten:

[DX9] Desktop Alphablending

Beitrag 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
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [DX9] Desktop Alphablending

Beitrag 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.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2259
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [DX9] Desktop Alphablending

Beitrag von Zudomon »

Wie ist das denn hier gelöst?
http://rocketdock.com/
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [DX9] Desktop Alphablending

Beitrag 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.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
FredK
Beiträge: 31
Registriert: 06.05.2004, 17:11

Re: [DX9] Desktop Alphablending

Beitrag 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.
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: [DX9] Desktop Alphablending

Beitrag 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.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2259
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [DX9] Desktop Alphablending

Beitrag 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.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4273
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [DX9] Desktop Alphablending

Beitrag 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...
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: [DX9] Desktop Alphablending

Beitrag 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);
Zuletzt geändert von Jörg am 22.12.2009, 17:17, insgesamt 1-mal geändert.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2259
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [DX9] Desktop Alphablending

Beitrag 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.
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: [DX9] Desktop Alphablending

Beitrag von Jörg »

Vielleicht liegt es an der GraKa, ich hab eine gemaechliche Intel 965.
Antworten