Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Mai 27, 2024 15:07

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Transparentes OpenGL-Fenster
BeitragVerfasst: Mo Jul 25, 2011 10:45 
Offline
DGL Member

Registriert: Sa Mär 26, 2011 12:08
Beiträge: 17
Guten Morgen DGL,
Ich versuche im Moment, ein Transparentes OpenGL-Fenster zu erzeugen. So dass also alles, was die glClearColor besitzt, durchsichtig ist, und alles andere was ich rendere direkt über dem Desktop zu schweben scheint. Ich habe schon verschiedene Ansätze gefunden, doch keiner scheint bei mir zu funktionieren.

Die erste Version wäre, ein Fenster als Layered und Popup zu erzeugen
Code:
  1. CreateWindowEx(WS_EX_LAYERED,"OpenGL","OpenGL",WS_POPUP, ...);

Dann mittels
Code:
  1. SetLayeredWindowAttributes(hWnd, 0, 0, LWA_COLORKEY);

einen Colorkey festzulegen und als ClearColor 0, 0, 0, 0 zu verwenden. Bringt jedoch nicht das gewünschte Ergebnis, das Fenster bleibt schwarz, nicht transparent.

2. Ansatz (mittels DWMApi unter Win 7):
Code:
  1. DWM_BLURBEHIND bb = {0};
  2. bb.dwFlags = DWM_BB_ENABLE;
  3. bb.fEnable = true;
  4. bb.hRgnBlur = NULL;
  5. DwmEnableBlurBehindWindow(hWnd, &bb);

Also das Blurring des Aero-Modus hinter dem gesamten Fenster zu aktivieren. Auch hier, nicht das gewünschte Ergebnis.

Hat jemand von euch eine Idee wie so etwas zu realisieren ist?
Lg, Edlmann


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: Mo Jul 25, 2011 10:51 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Der Colorkey und die ClearColor müssen identisch sein. Und die Farbe darf im restlichen Fenster nicht auftauchen bzw. wird dort auch durchsichtig.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: Mo Jul 25, 2011 10:53 
Offline
DGL Member

Registriert: Sa Mär 26, 2011 12:08
Beiträge: 17
Soweit klar. Aber bei der Color-Key-Methode habe ich ja als crKey 0 übergeben, und als bAlpha ebenfalls, somit müsste doch bei einer ClearColor von 0, 0, 0, 0 alles schwarze durchsichtig sein oder nicht?

Edit: Hier mal mein bisheriger Quelltext dazu: http://dl.dropbox.com/u/12342503/TransparentOpenGL.rar


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: Mo Jul 25, 2011 11:04 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Im Prinzip schon. Überprüfst du den Rückgabewert der Funktion?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: Mo Jul 25, 2011 11:52 
Offline
DGL Member

Registriert: Sa Mär 26, 2011 12:08
Beiträge: 17
Die Procedur gibt true zurück, also sollte eigentlich alles funktionieren. Vllt kannst du dir ja mal den Quelltext anschauen und nach dem Fehler suchen (Ist Hauptsächlich ein non-VCL OpenGl-Sample, nur bei glCreateWnd habe ich einiges verändert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: Mo Jul 25, 2011 13:55 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Könnte ich wenn du ihn mir gibst ;)

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: Mo Jul 25, 2011 16:58 
Offline
DGL Member

Registriert: Sa Mär 26, 2011 12:08
Beiträge: 17
Siehe oben ;)

Oder hier: http://dl.dropbox.com/u/12342503/TransparentOpenGL.rar :P


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: Di Jul 26, 2011 10:22 
Offline
DGL Member

Registriert: Sa Mär 26, 2011 12:08
Beiträge: 17
Hab das ganze jetzt nochmal in einer VCL-Anwendung versucht, der gesamte Quelltext ist wie folgt:

Code:
  1. procedure TForm2.FormCreate(Sender: TObject);
  2. begin
  3.   SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT or WS_EX_TOPMOST or WS_EX_COMPOSITED or WS_EX_LAYERED);
  4.   SetLayeredWindowAttributes(handle, 0, 0, LWA_COLORKEY);
  5.   InitializeOpenGL(self.Handle);
  6.   Application.OnIdle := Render;
  7.   glClearColor(0, 0, 0, 0);
  8. end;
  9.  
  10. procedure TForm2.Render(Sender: TObject; var Done: Boolean);
  11. begin
  12.   StartRendering(SizeX, SizeY, ClientWidth, ClientHeight);
  13.  
  14.   FinishRendering;
  15. end;


Ohne dass ich etwas Rendere ist die Form (welche als Hintergrundfarbe schwarz hat) wunderbar durchsichtig, doch sobald ich das Rendern aktiviere, ist die Form wieder einfach schwarz. Hier ein Bild dazu, links ohne OpenGL, rechts mit.

Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: Di Jul 26, 2011 11:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das Verhalten ist hier völlig korrekt. Zumindest war es bisher auch so, und sofern sich unter Windows7 nichts geändert hat ist es normal dass, wenn du mittels OpenGL renderst der Colorkey für die Transparenz des Formulares nicht mehr funktioniert. Das liegt in der Zusammenarbeit zwischen OpenGL und der Fensterkomposition von Windows.

Soweit ich weiß ist die einzige Möglichkeit ein Bitmap (DIB) zu erstellen, dann OpenGL offscreen in dieses Bitmap rendern lassen und das Bitmap dann via Bitblt auf das Formular bringen. Dann klappt auch der Colorkey, allerdings mit dem Nachteil dass der Bitlt (sehr) viel langsamer ist als ein normales SwapBuffers.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: Di Jul 26, 2011 11:58 
Offline
DGL Member

Registriert: Sa Mär 26, 2011 12:08
Beiträge: 17
@Sascha Willems: Danke schonmal für die Antwort, ich hatte über Google gefunden dass der ColorKey Trotzdem noch funktioniert. Gut zu wissen, dass der Fehler nicht bei mir liegt. :P
Und wie sieht das mit Methoden aus die Aero bzw die DwmAPI benutzen? Gibt es da möglichkeiten, das Performanter zu gestalten?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: Do Mär 14, 2013 15:44 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Entschuldigung für das 'Ausgraben' des doch schon recht alten Threads,
da das Thema allerdings bei mir gerade Aktuell ist/war hab ich noch ein Nachtrag:

Das Beispiel von Oben
Code:
  1. SetWindowLong hwnd, GWL_STYLE, WS_POPUP Or WS_VISIBLE
  2. SetWindowLong hwnd, GWL_EXSTYLE, WS_EX_LAYERED
  3. SetLayeredWindowAttributes(hwnd, 0, 0, LWA_COLORKEY)

Sollte eigentlich die hintergrundfarbe 0 (also schwarz) transparent zeichnen, was sie unter windows XP auch tut.
Unter Windows7 gibt es die Methode wie oben von Sascha Willems die ich auch bereits ähnlich realisiert habe (zweites unsichtbares fenster und dann den screen auf mein sichtbares fenster kopiert...)
Habe aber gerade noch eine weitere Methode

Das Farbschema (Aero) auf BASIS umschalten:
Code:
  1. DwmEnableComposition(DWM_EC_DISABLECOMPOSITION)

Dannach geht es auch mit LWA_COLORKEY

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: Sa Mär 16, 2013 12:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Erstmal vorweg:
XP ist bald nicht mehr supported, von daher würde ich mir keine Gedanken mehr darum machen.


Solche Dinge wie Farbschema umschalten und co sollte man besser sein lassen. Denkt nur mal an Spiele die Abstürzen und euren Desktop in 640x480 zurücklassen.

Die Methode die Sasha beschrieben hat ist tatsächlich der einzig sichere Weg. Ich persöhnlich finde ihn auch lustiger da Perfomance Optimierung sehr viel Spaß macht :)
Versuch doch einfach mal nur die Bereiche in Bitmaps umzuwandeln die sich auch wirklich ändern dann hast du schon einen großen Gewinn an Leistung.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: Sa Mär 16, 2013 15:11 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
XP ist aber ein immer noch weit verbreitetes Betriebssystem!

Daher sollte man sich schon noch Gedanken darum machen (ich persönlich teste meine Programme auch noch auf Win98 und 2000, Nostalgiker eben ^^)

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: Sa Mär 16, 2013 22:06 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
yunharla hat geschrieben:
Solche Dinge wie Farbschema umschalten und co sollte man besser sein lassen. Denkt nur mal an Spiele die Abstürzen und euren Desktop in 640x480 zurücklassen.


Zugegeben ist das keine Optimale Lösung, ich halte selber nichts davon das Aero abschalten zu lassen...
Ist aber der einfachste und schnellste Weg (Da dieses Problem meines Wissens nach nur bei Vista und Win7 auftritt, in allen anderen Windowsversionen funktioniert es wieder Problemlos einschließlich Win8)

Der andere Weg ist dafür deutlich schwieriger umzusetzen und die Performance lässt sehr zu wünschen übrig.
Performance Optimierung finde ich im übrigen eher lästig ^^
leider ist mir dazu auch noch nichts eingefallen zumal ich bei mir nicht den Weg über eine BMP gehe sondern per readpixels direkt in den Pixel-Speicherbereich meines Fensters...

meine Update Routine sieht so aus:
Code:
  1.  
  2.         SwapBuffers(Win32_OGL.h_DC)                        
  3.  
  4.         For Y as Integer = 1 to Win_height
  5.             glReadPixels(0,Win_height-Y,Win_width,1, &h80E1, GL_UNSIGNED_BYTE, Screenptr + (((Y-1) * Win_width) * Win_bpp))
  6.         Next Y
  7.  


... wie gesagt lässt hier die Performance etwas zu wünschen übrig, weiß leider auch nicht wie ich diese verbessern kann...

Allerdings halte ich die Arbeit, mit einem Transparenten OpenGL Fenster auch eher für 'Spielerei'
und allgemein für ungeeignet wenn man es für zeitkritische 'Anwendungen' einsetzt.

Aber für ein kleines Intro oder weniger aufwendige Sachen ist es ganz lustig :)

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes OpenGL-Fenster
BeitragVerfasst: So Mär 17, 2013 11:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
EternalPain hat geschrieben:
Performance Optimierung finde ich im übrigen eher lästig ^^

Naja kommt drauf an was man möchte. Ich mach halt lieber die Wartung und die anderen lästigen Sachen. Hast halt ne riesen Abwechslung und keinen Kundenkontakt :D

EternalPain hat geschrieben:
Allerdings halte ich die Arbeit, mit einem Transparenten OpenGL Fenster auch eher für 'Spielerei'
und allgemein für ungeeignet wenn man es für zeitkritische 'Anwendungen' einsetzt.


Oh da bist du aber sehr optimistisch mein lieber :) Warte mal ab wenn du es noch zusätzlich mit Events brauchst.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 14 Queries | GZIP : On ]