AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi GLScene - Aktuelles Frame in 32bit-Bitmap speichern...Wie?
Thema durchsuchen
Ansicht
Themen-Optionen

GLScene - Aktuelles Frame in 32bit-Bitmap speichern...Wie?

Offene Frage von "torud"
Ein Thema von torud · begonnen am 10. Mär 2010 · letzter Beitrag vom 11. Mär 2010
Antwort Antwort
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#1

GLScene - Aktuelles Frame in 32bit-Bitmap speichern...Wie?

  Alt 10. Mär 2010, 23:00
Hallo Wissende,

ich habe versucht das aktuelle Frame eines GLSceneViewer in einem Bitmap mit AlphaKanal zu speichern. Dabei bin ich so vorgegangen:

Delphi-Quellcode:
GLSceneViewer1.Buffer.Render;
GLSceneViewer1.Buffer.CreateSnapShot.Create32BitsBitmap.SaveToFile('c:\test.bmp');
Die Datei wird tatsächlich erzeugt. Sie besitzt auch einen AlphaKanal.

Leider ist dieser immer voll deckend. Ich habe aber in der Scene nur einen Cube in der Mitte, sonst nix. Woran kann es nun liegen, dass beim Erzeugen des transparenten Bitmaps die Umgebung nicht als transparent angesehen wird!?

Falls ich da was falsch gemacht habe, würde ich es gern ändern und verstehen. Ich stell hier auch gern das kleine Testprojekt rein, wenns sein muss...
Danke
Tom
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: GLScene - Aktuelles Frame in 32bit-Bitmap speichern...Wi

  Alt 10. Mär 2010, 23:37
Es gibt zwei mögliche (sogar wahrscheinliche) Ursachen:

1) Der Export als BMP wird recht wahrscheinlich irgendwann mal über die GDI laufen, und BMP ist von Hause aus ein Format, dass an und für sich urprünglich ohne Alphakanal konzipiert war. Die gesamte GDI und andere Teile von Windows haben darunter lange Zeit leiden müssen, und leichte Besserung war erst mit GDI+ in Sicht. Die Frage ist also hier welchen Weg der Snapshot bis hin zur Datei auf der Platte nimmt.

2) Display-Buffer haben in aller Regel ein Format ohne Alphakanal (welcher Bildschirm kann schon durchsichtig werden?), und selbst wenn das Format an sich mit Alpha ist, so besteht dennoch eine gute Chance, dass die API diesen ignoriert wenn es weiss dass es um den Front-/Backbuffer geht. Ich kenne mich mit OpenGL allerdings zu wenig aus um da eine definitive Aussage zu machen.

Grundsätzlich wird zumindest bei DirectX empfohlen eine Offscreen (=normale, loose) Textur als Rendertarget zu setzen, und dann ihr Surface 0 zu exportieren. Für die Anzeige wird dann noch ein schnelles Fullscreen-Quad mit dieser Textur in den eigentlichen Backbuffer als Target geschmissen, was bei den meisten Spielen durch die Fullscreen-Post-Effekte ohnehin ansteht. Zudem würde ich dringend empfehlen in ein anderes Format zu exportieren, dass auch wirklich Alpha unterstützt, und zwar vom Kern an. Da wären vor allem TIFF, TGA und PNG nennenswert.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#3

Re: GLScene - Aktuelles Frame in 32bit-Bitmap speichern...Wi

  Alt 11. Mär 2010, 07:21
Hallo Medium,

danke für Deine ausführlich, leider rein theoretische Antwort.

Das mit den Bitmaps und dem GDI-Weg leuchtet mir alles ein. Auch nutze ich sonst andere Bildformate, wenn ich mit Transparenzen arbeite. Bevorzugt TGA und PNG.

Ich ging und gehe aber davon aus, dass, wenn GLScene Create32BitsBitmap anbietet, dies auch irgendwie funktionieren muss. Ich dachte auch, dass hier schon mal jemand so was gemacht hat.

Weiters hatte mich nämlich interessiert, ob es möglich ist, den GLSceneViewer in eine Art visuellen KeyMode umzustellen, so dass man grundsätzlich nur die einzelnen Alphakanäle aller Objekte sieht. Aber vielleicht ist das hier das falsche Forum und neue Frage, neuer Thread...

Und, es hätte ja auch sein können, dass ich nur an den Eigenschaften einer Komponente was ändern muss. Sowas wie
RenderOptions := 32Bit;

Nur als Idee.
Danke
Tom
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz