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
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:
DWM_BLURBEHIND bb = {0};
bb.dwFlags = DWM_BB_ENABLE;
bb.fEnable = true;
bb.hRgnBlur = NULL;
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
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?
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.
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.
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.
@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. Und wie sieht das mit Methoden aus die Aero bzw die DwmAPI benutzen? Gibt es da möglichkeiten, das Performanter zu gestalten?
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:
SetWindowLong hwnd, GWL_STYLE, WS_POPUP Or WS_VISIBLE
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
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.
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...
... 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
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
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.
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.