Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   OpenGL - rendern eines transparenten Bildes (https://www.delphipraxis.net/189402-opengl-rendern-eines-transparenten-bildes.html)

torud 8. Jun 2016 17:03

OpenGL - rendern eines transparenten Bildes
 
Hallo Wissende,

ich bin noch nicht so sehr mit OpenGL vertraut, habe aber schon herausgefunden, dass man, um Transparenzen benutzen zu können, mit
Delphi-Quellcode:
 glEnable(GL_BLEND);
arbeiten muss.

Könnte mir jemand von Euch zeigen, wie ich einfach nur mit OpenGL ein transparentes Bild rendere?
Eigentlich möchte ich als Basis ein solches Objekt in OpenGL erstellen und darauf dann andere OpenGL-Objekte platzieren und alles zusammen rendern. Also Ergebnis würde in der Regel immer ein Bild herauskommen, dass auch transparente Anteile hat.

Bei den bisher verwendeten Tutorials ist es leider immer so, dass das gerenderte Bild zwar einen Alpha-Kanal hat, dieser aber keine transparenten Bereiche aufweist.

Ich wäre sehr dankbar, wenn mir hier jemand eine kleine Starthilfe geben könnte.
RenderToTga oder RenderToPng wäre toll - wenn möglich.

Vielleicht hilft es ja auch anderen, die auch dieses Problem haben.

EWeiss 8. Jun 2016 17:20

AW: OpenGL - rendern eines transparenten Bildes
 
Delphi-Quellcode:
//Texture wird vorher gebunden
 glDisable(GL_DEPTH_TEST);
 glEnable(GL_BLEND);
 glBlendFunc(GL_SRC_ALPHA,GL_ONE);
//Render...
 glDisable(GL_BLEND);
 glEnable(GL_DEPTH_TEST);
gruss

torud 8. Jun 2016 17:23

AW: OpenGL - rendern eines transparenten Bildes
 
Hallo,

vielen Dank - ich versuchs mal damit. Kannst Du mir noch einen Tipp geben, wie ich dann Speichern kann?

Hab gerade kein Delphi zur Hand, check den Kram aber in 1 Stunde.

Jens01 9. Jun 2016 11:44

AW: OpenGL - rendern eines transparenten Bildes
 
Geht das bei Dir um 2D oder 3D Objekte, die gerendert werden sollen?

BUG 9. Jun 2016 12:17

AW: OpenGL - rendern eines transparenten Bildes
 
Insgesamt sind die DelphiGL-Tutorials zu solchen Themen (Blending) lesenswert (wenn auch afaik etwas älter).

torud 13. Jul 2016 12:01

AW: OpenGL - rendern eines transparenten Bildes
 
Zitat:

Zitat von Jens01 (Beitrag 1339820)
Geht das bei Dir um 2D oder 3D Objekte, die gerendert werden sollen?

In der Masse nutzen wir 2D-Objekte, wie Bilder und Text-Objekte, benötigen aber hin und wieder auch 3D-Objekte.
Ich hätte auch ein Beispielprojekt am Start, allerdings würde das Kompilat bei den meisten von Euch einen Fehler aufwerfen, weil eine spezielle VIdeokarte nicht gefunden würde.

Jens01 13. Jul 2016 12:40

AW: OpenGL - rendern eines transparenten Bildes
 
Ich glaube, ich meinte, wenn Du nur 2D-Objekte hast, das bei Transparenz nicht mit OpenGL zu machen, sondern vllt mit Graphics32 o.ä..
Transparenz geht bei OpenGL mit diesem Blending, wie hier schon angesprochen. Es kann aber auch schnell sehr kompliziert werden, wenn eine Tiefensortierung notwendig wird. Dann benötigt man Shaderverfahren.

torud 14. Jul 2016 07:59

AW: OpenGL - rendern eines transparenten Bildes
 
Ja, wenn es einfach nur um das Erstellen von statischen Bildern gegangen wäre, würde GDI vielleicht sogar reichen. Da aber die ein oder andere Animation zu realisieren wäre und das im Full-HD-Bereich, kommt das nicht in Frage.

Jens01 14. Jul 2016 09:24

AW: OpenGL - rendern eines transparenten Bildes
 
Naja, dann OpenGL.
Bei Transparenz geht vieles mit dem Blending. Da gibt es auch Tricks mit Mehrfachrenderung (siehe Tutorials bei DGL). Probleme kommen aber dann, wenn es darum geht, ob das eine transparente Objekt vor oder hinter einem anderen steht. Oder sogar in einem anderen Objekt. Man kann die Objekte dann nach der Tiefe sortieren oder man nutzt ein Verfahren mit Shadern (OIT Order-Independent Transparency).

Jens01 14. Jul 2016 09:52

AW: OpenGL - rendern eines transparenten Bildes
 
Dir geht es ums Erstellen des Bildes!?
Hier ein Link.
Ich selbst rendere in ein TBitmap32.

torud 15. Jul 2016 12:15

AW: OpenGL - rendern eines transparenten Bildes
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich habe mal ein Beispiel erstellt, dass sehr Basic ist, aber vielleicht mein Problem etwas veranschaulicht.

Ich habe mir das Beispiel mal von DelphiGL genommen und die Routine Screenshot benutzt.

Wenn man im Programm den Button Render betätigt, wird erwartungsgemäß das Bild so gerendert, wie im Tutorial.
Will ich es speichern, erhalte ich zwar eine TGA-Datei, ABER
-> der Inhalt ist komplett schwarz
-> es ist kein Alpha-Kanal vorhanden

Einzig die Abmaße stimmen.

Ich habe dann bei GetReadPixels das Format von GL_BGR nach GL_BGRA umgestellt und vorher noch die Datengröße

von
DataSize := Width * Height * 3;

geändert
DataSize := Width * Height * 4;

um Platz für Alphakanal zu schaffen.

Ich finde leider den Fehler nicht...
Ich hänge mal das Projekt an.

Jens01 15. Jul 2016 14:10

AW: OpenGL - rendern eines transparenten Bildes
 
Du solltest vllt die Frage auch noch mal bei DGL stellen. Dort gibt es eigentlich kompetente Antworten.

torud 15. Jul 2016 16:52

AW: OpenGL - rendern eines transparenten Bildes
 
Hallo Jens,

vielen Dank für den Hinweis. Ich habs dort auch mal gepostet...Mal schauen. Wenn ich eine helfende Antwort erhalte, poste ich´s hier.

torud 16. Jul 2016 07:40

AW: OpenGL - rendern eines transparenten Bildes
 
Manchmal reicht es auch, einfach nochmal mit einer Nacht Abstand alles von Neuem zu betrachten.

2 Zeichen musste ich ändern und alles geht. :-D

Der Code hier ist verantwortlich für das Erstellen des Alphakanals:

Delphi-Quellcode:
  tgaHeader.tfBpp := 32;
Vorher hatte ich dort nur eine 24!
Jetzt ist der Alphakanal vorhanden und er wird sogar korrekt befüllt!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:22 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