Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi GLScene: Problem mit Alpha bei einem TGLPolygon (https://www.delphipraxis.net/171188-glscene-problem-mit-alpha-bei-einem-tglpolygon.html)

Maiky 25. Okt 2012 08:54


GLScene: Problem mit Alpha bei einem TGLPolygon
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi.

Ich habe aus vielen Punkten und mittels vielen TGLPolygonen eine Figur gebaut und wollte dieser gern Transparenz geben. Ein einzelnes Polygon erstelle ich so:
Code:
GLPolygon := TGLPolygon(GLDummyCube1.AddNewChild(TGLPolygon));
GLPolygon.Material.FrontProperties.Emission.Color := clrGreen;
GLPolygon.Material.BlendingMode := bmTransparency;
GLPolygon.Material.FrontProperties.Diffuse.Alpha := 0.50;
Aber wenn ich das dann mir anschaue, sieht dies leider so aus:

http://minus.com/lbjLUbyRAbTUcB

Wenn ich die Figur bewege sind die Klötzchen immer woanders. Ist das ein Bug in GLScene oder mache ich da noch etwas falsch?

EDIT: Die Hilfe von GLScene hatte mir btw da leider nicht weitergeholfen: http://glscene.sourceforge.net/wikka...ureTransparent

EDIT2: Ich habe auch das schon jeweils einzeln erfolglos ausprobiert:
Code:
GLPolygon.ObjectsSorting := osRenderFarthestFirst;
GLPolygon.ObjectsSorting := osRenderNearestFirst;
GLPolygon.ObjectsSorting := osRenderBlendedLast;

Uwe Raabe 25. Okt 2012 09:31

AW: GLScene: Problem mit Alpha bei einem TGLPolygon
 
Mit der Transparenz bei OpenGL ist das so eine Sache. Bei einem Objekt mit Transparenz wird nämlich der eigene Farbwert mit dem vorhandenen Farbwert gemischt. Damit bekommt aber die Reihenfolge der Objekte beim Zeichnen eine besondere Bedeutung.

Beim Zeichnen bekommt jedes Pixel ja auch noch einen Z-Wert mit. Wird dann ein Pixel darübe gezeichnet, geschieht dies nur, wenn der Z-Wert kleiner (also näher zur Kamera) ist, als der aktuelle Z-Wert. Bei einem Transparenten Pixel wird wie gesagt die Farbe gemischt, der Z-Wert kommt aber dann von dem transparenten Pixel.

Unter der Annahme, daß das transparente Objekt vor dem opaqen liegt, gibt es jetzt zwei Möglichkeiten:

1. Das opaque Pixel wird vor dem transparenten gezeichnet. Das Ergebnis ist wie gewünscht.
2. Das transparente Pixel wird zuerst gezeichnet. Dann wird das opaque gar nicht gezeichnet, weil sein Z-Wert hinter dem transparenten Pixel liegt.

Es gibt in TGLScene ein Property ObjectsSorting, das man auf osRenderBlendedLast stellen kann. Hiermit werden die transparenten Objekte tiefensortiert nach den opaquen gezeichnet. Leider funktioniert das nur objektweise. In deinem Fall "umschließt" das Polygon offensichtlich andere Objekte (es liegt sowohl davor als auch dahinter) und damit kann keine sinnvolle Sortierung erfolgen.

Leider ist auch ein Splitten solcher Objekte in mehrere kleinere nicht immer erfolgreich, da die Tiefensortierung halt sehr stark von der Blickrichtung abhängt.

Maiky 25. Okt 2012 09:45

AW: GLScene: Problem mit Alpha bei einem TGLPolygon
 
Danke für die extrem schnelle und ausführliche Antwort.

Zitat:

Zitat von Uwe Raabe (Beitrag 1188263)
Unter der Annahme, daß das transparente Objekt vor dem opaqen liegt, gibt es jetzt zwei Möglichkeiten:

Meine Grafik besteht aus hunderten Polygons und jedes davon ist transparent gesetzt.

Überschneiden dürfte sich dort ebenfalls nichts. Ich zeige mal eine 4 Bild Animation:

http://minus.com/llTGqTuAZS7Jj

http://minus.com/lbetBa2HjZWOGe

http://minus.com/lAmYWeLLEvsPK

http://minus.com/luW944mW0JKZV

Zitat:

Zitat von Uwe Raabe (Beitrag 1188263)
Es gibt in TGLScene ein Property ObjectsSorting, das man auf osRenderBlendedLast stellen kann.

Dies ist bei meinem GLScene der Default-Wert und so eingestellt.


EDIT:

Ich habe mal einen nicht transparenten Cube reingsetzt. Dieser wird immer korrekt dargestellt. Die "Bildfehler" am transaprenten Object sind dort wo der Cube durchscheint nicht vorhanden, nur dann noch drumherum.

http://minus.com/lvTZ6Ks648BU4

Uwe Raabe 25. Okt 2012 10:07

AW: GLScene: Problem mit Alpha bei einem TGLPolygon
 
Wenn ich das richtig sehe, passiert aber genau das, was ich beschrieben habe. Die Artefakte entstehen da, wo sich das Objekt selbst überdeckt. An manchen Stellen wird das dahinter liegende Polygon gezeichnet und an anderen nicht. Das ist dann auch noch abhängig von der Blickrichtung. Ich sehe momentan keine Möglichkeit, das sauber zu lösen - jedenfalls nicht mit dem Standard-GL-Shading.

Maiky 25. Okt 2012 10:16

AW: GLScene: Problem mit Alpha bei einem TGLPolygon
 
Da fehlt mir vermutlich leider noch etwas das Verständnis. Das "Objekt" hier ist ja lediglich eine Anhäufung von einzelnen hunderten Polygons (3-4 Punkte je Polygon).

http://minus.com/lPj2NyWW5LXSd

Inwiefern kann es sich da selbst überdecken, wenn jedes Polygon quasi nur eine 2D Fläche ist?

EDIT:

Hier ein Gitterbespiel. Ich habe die Polygone einfach immer von Punkt zu punkt gezogen und jedes Polygon hat 3 bis 4 Eckpunkte.

http://minus.com/llW7djNwQpw5p

Wenn ich jetzt das ganze fülle, dann sieht man das sogar im hintere Teil der grünen "Wand" viel fehlt.

http://minus.com/luGy0CwIf5ZCY

Uwe Raabe 25. Okt 2012 12:24

AW: GLScene: Problem mit Alpha bei einem TGLPolygon
 
Bei der Tiefensortierung muss ja eine Reihenfolge der transparenten Objekte hergestellt werden. Dazu wird mangels brauchbarer Alternative der Abstand des Schwerpunkts zur Kameraposition verwendet. Dadurch kann es passieren, daß ein Objekt, das eigentlich hinter einem anderen liegt, als davor einsortiert wird, weil die Schwerpunkte eben ungünstig liegen. Beim Zeichnen wird die Z-Position (Tiefe) aber pixelgenau berechnet. Wird nun das hintere Objekt später als das vordere gezeichnet, liegen die Z-Positionen seiner Pixel hinter den aktuellen Pixeln (von dem vorderen Objekt) und werden somit nicht gezeichnet. Als Ergebnis hat man in dem Bereich dann ein transparentes vorderes Objekt, aber das hintere ist dadurch nicht sichtbar.

Du kannst ja mal probeweise den DepthTest abschalten und das Ergebnis anschauen - vielleicht dient das etwas dem Verständnis.

Maiky 19. Nov 2012 18:54

AW: GLScene: Problem mit Alpha bei einem TGLPolygon
 
Ich würde das Thema gern noch einmal aufgreifen. Ich habe mir noch einmal alles durchgelesen, verstehe das Grundproblem, habe aber leider die Schwierigkeit damit es auf meinen Fall zu übertragen.

Ich versuche ja anhand von sehr vielen kleinen "2D" Polygonen (mit max. 3-4 Nodes, also entweder ein Dreieck oder ein Viereck) ein 3D Objekt darzustellen. Wäre es ein komplexes 3D Polygon oder ein Mesh, würde ich das Transparensproblem verstehen.

Gilt es hier eventuell auch als "Mesh", weil ich die einzelnen Polygone zu GLDummyCube hinzufüge und er dadurch die "Sortierung" anders handhabt, als wenn die Polygone frei einzeln im 3D Raum stehen würden?

Uwe Raabe 21. Nov 2012 16:18

AW: GLScene: Problem mit Alpha bei einem TGLPolygon
 
Kannst du hierzu wieder ein Beispiel-Projekt anhängen, bei dem das Problem auftritt? Die Theorie haben wir ja hier schon genügend behandelt.

Maiky 22. Nov 2012 14:13

AW: GLScene: Problem mit Alpha bei einem TGLPolygon
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sehr gern sogar. Wäre natürlich schön wenn es doch eine Lösung gäbe. Es macht nämlich sehr viel Spaß mit GLScene zu arbeiten bzw rumzuspielen. Ich möchte gern einen kleinen Simulator basteln, aber dafür würde ich schon Transparenz benötigen. Daher auch die Frage GLScene oder doch direkt mit OpenGL3 beschäftigen.

Wird es GLScene auch in GL3 geben? Ich glaube aktuell ist es ja "nur" GL2?

Uwe Raabe 22. Nov 2012 16:07

AW: GLScene: Problem mit Alpha bei einem TGLPolygon
 
Kann es sein, daß die Polygon-Punkte nicht in einer Ebene liegen? Bei einem Dreieck ist das immer der Fall, aber bei einerm Viereck kann das schon mal daneben gehen.

Ein Polygon soll immer in einer Ebene liegen. Andernfalls wäre das eine gekrümmte Fläche und die muss durch ausreichend planare Polygone angenähert werden.

Wenn das Polygon nicht planar ist, liegt der Schwerpunkt nicht innerhalb der Fläche und somit stimmen die Entfernungsberechnungen für das Rendering nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:20 Uhr.
Seite 1 von 2  1 2      

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