AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi GLScene: Problem mit Alpha bei einem TGLPolygon
Thema durchsuchen
Ansicht
Themen-Optionen

GLScene: Problem mit Alpha bei einem TGLPolygon

Ein Thema von Maiky · begonnen am 25. Okt 2012 · letzter Beitrag vom 10. Dez 2012
Antwort Antwort
Seite 1 von 2  1 2      
Maiky

Registriert seit: 14. Nov 2006
54 Beiträge
 
#1

GLScene: Problem mit Alpha bei einem TGLPolygon

  Alt 25. Okt 2012, 08:54
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;
Miniaturansicht angehängter Grafiken
jbjlubyrabtucb..png  

Geändert von Maiky (25. Okt 2012 um 09:29 Uhr) Grund: Verlinkte Datei an Beitrag angehängt
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#2

AW: GLScene: Problem mit Alpha bei einem TGLPolygon

  Alt 25. Okt 2012, 09:31
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Maiky

Registriert seit: 14. Nov 2006
54 Beiträge
 
#3

AW: GLScene: Problem mit Alpha bei einem TGLPolygon

  Alt 25. Okt 2012, 09:45
Danke für die extrem schnelle und ausführliche Antwort.

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

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

Geändert von Maiky (25. Okt 2012 um 10:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#4

AW: GLScene: Problem mit Alpha bei einem TGLPolygon

  Alt 25. Okt 2012, 10:07
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Maiky

Registriert seit: 14. Nov 2006
54 Beiträge
 
#5

AW: GLScene: Problem mit Alpha bei einem TGLPolygon

  Alt 25. Okt 2012, 10:16
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

Geändert von Maiky (25. Okt 2012 um 10:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#6

AW: GLScene: Problem mit Alpha bei einem TGLPolygon

  Alt 25. Okt 2012, 12:24
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Maiky

Registriert seit: 14. Nov 2006
54 Beiträge
 
#7

AW: GLScene: Problem mit Alpha bei einem TGLPolygon

  Alt 19. Nov 2012, 18:54
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?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#8

AW: GLScene: Problem mit Alpha bei einem TGLPolygon

  Alt 21. Nov 2012, 16:18
Kannst du hierzu wieder ein Beispiel-Projekt anhängen, bei dem das Problem auftritt? Die Theorie haben wir ja hier schon genügend behandelt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Maiky

Registriert seit: 14. Nov 2006
54 Beiträge
 
#9

AW: GLScene: Problem mit Alpha bei einem TGLPolygon

  Alt 22. Nov 2012, 14:13
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?
Angehängte Dateien
Dateityp: zip First Project C.zip (71,1 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#10

AW: GLScene: Problem mit Alpha bei einem TGLPolygon

  Alt 22. Nov 2012, 16:07
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:11 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