AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Firemonkey Image3D Rendering Reihenfolge

Ein Thema von LexLing · begonnen am 3. Mär 2014 · letzter Beitrag vom 9. Mär 2014
Antwort Antwort
Seite 1 von 2  1 2      
LexLing

Registriert seit: 3. Mär 2014
15 Beiträge
 
Delphi XE5 Professional
 
#1

Firemonkey Image3D Rendering Reihenfolge

  Alt 3. Mär 2014, 17:22
Guten Tag liebe Community,

seit einiger Zeit zerbreche ich mir den Kopf über ein gewisses Problem.
Ich habe mir in Firemonkey ein TViewport3D erstellt, wo ich viele verschiedene TImage3D Objekte reinlade.
Die meisten dieser Objekte sind PNGs, die teilweise Transparent sind, was zu folgenden Problemen führt:
Einige dieser Images werden offensichtlich in der falschen Reihenfolge reingeladen, da diese entweder abgeschnitten sind oder erst gar nicht transparent dargestellt werden.
(Bild im Anhang)

Nach einigem googlen, habe ich Lösungsansätze zu dieser Problemstellung gefunden, bei denen die Reihenfolge beeinflusst werden sollte.
Eines davon unter diesem Link:

http://www.delphitools.info/2011/11/...in-firemonkey/

Diesen Lösungsansatz habe ich in meinen Quellcode einbinden wollen, scheiterte aber schon an "SortList", was ich in Delphi XE5 leider nicht finden konnte.
Ersatzweise habe ich es leicht abgewandelt mit der Methode "Sort" versucht, was aber in der Darstellung leider rein gar nichts verändert.
Hier der Quellcode dazu:
Delphi-Quellcode:
vp.Sort(
function (i1, i2: TFmxObject): Integer
var
  o1,o2: TControl3D;
  x1, x2: Double;
begin
  o1 := nil; o2 := nil;
  if TfmxObject(i1) is TControl3D then o1 := TControl3D(i1);
  if TfmxObject(i2) is TControl3D then o2 := TControl3D(i2);
  if (o1 <> nil) and (o2 <> nil) then
  begin
    x1 := o1.Position.Vector.Distance(vp.cam.Position.Vector);
    x2 := o2.Position.Vector.Distance(vp.cam.Position.Vector);
    Result := Trunc((x2 - x1)*1000);
  end else
    Result := 0;
end
);
Nun frage ich mich wie ich Einfluss auf die Reihenfolge haben oder anderweitig das Problem lösen kann.
Freue mich auf eure Lösungsvorschläge.

Ich hoffe, ihr könnt mir weiterhelfen
Bitte seid nachsichtig, da dies mein erster Delphi Forum Auftritt ist.
Liebe Grüße
LexLing
Miniaturansicht angehängter Grafiken
transparentrendering.png  

Geändert von LexLing ( 4. Mär 2014 um 11:38 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 3. Mär 2014, 17:34
Unterscheiden sich deren z-Werte?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 3. Mär 2014, 17:38
Nimm doch mal diese Zeile raus
Result := Trunc((o1.Position.X - o2.Position.X)*1000);
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 3. Mär 2014, 18:09
Ich verstehe die Sortierfunktion ehrlich gesagt auch nicht wirklich-

Bei Sprites mit Transparenz kommst du nicht Drumherum, die von hinten nach vorne zu zeichnen. Die anonyme Sortiertfunktion muss eigentlich beim Vergleich von zwei Dingen nur einen Wert <0, gleich Null oder >0 ausgeben können. Multiplizieren oder Nachkommastellen abschneiden muss nicht sein.

Ich kenne mich mit FireMonkey nicht aus, aber spontan hätte ich gesagt (bin aus der 3D-Geschichte langsam schon zu lange draußen ) gesagt, die Baum-Sprites werden vom Z-Buffer stellenweise als "nicht transparent" aufgenommen- Sprich:
  1. Vorderer Baum wird gerendert
  2. ZBuffer merkt sich das komplette Rechteck
  3. Hinterer Baum wird gendert: Besteht den Tiefentest gegen den vorderen Baum nicht und wird dort nicht gerendert

Ich weiß nicht, wie man das mit FireMonkey macht, aber kannst du nicht sagen dass alles, wo die diffuse Textur einen Alphawert > schwellwert hat, das nicht in den Z-Buffer geht?
  Mit Zitat antworten Zitat
LexLing

Registriert seit: 3. Mär 2014
15 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 4. Mär 2014, 11:44
Danke erstmal für die Antworten.

@mkinzler:
Ja, die z-Werte sind unterschiedlich.

@Sir Rufo:
Die Zeile war nur noch aus Versehen drin.
Aber auch ohne sie geht es leider nicht.

@Der schöne Günther:
Wenn das so wäre wie du sagst, dann müsste der Effekt doch bei allen Bäumen auftreten.
Aber bei vielen geht es (richtig).

Ich habe mal die Reihenfolge wie ich die Objekte erzeuge geändert.
Das ändert auch die Fehler, aber leider werden die Objekte zwar in einer anderen Reihenfolge gezeichnet - aber nicht so, wie ich sie erzeuge.

Irgendwie macht diese sort-Funktion gar nichts. Ich habe sie mal in:
Delphi-Quellcode:
  vp.Sort(
  function (i1, i2: TFmxObject): Integer
  var
    o1,o2: TControl3D;
    x1, x2: Double;
  begin
    o1 := nil; o2 := nil;
    if TfmxObject(i1) is TControl3D then o1 := TControl3D(i1);
    if TfmxObject(i2) is TControl3D then o2 := TControl3D(i2);
    if (o1 <> nil) and (o2 <> nil) then
    begin
      if o1.Position.Z < o2.Position.Z then
        Result := -1
      else if o1.Position.Z > o2.Position.Z then
        Result := 1
      else
        Result := 0;
    end else
      Result := 0;
  end

  );
geändert, aber nichts tut sich.

Muss ich denn eigentlich immer die Funktion update des TViewPort3D aufrufen, wenn ich die Kamera-Position ändere?
Oder mache ich da was falsch?
Die sort-Funktion rufe ich einmal nach dem Erzeugen aller Objekte und dann immer vor einem update auf.
Muss ich das vielleicht anders machen?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 4. Mär 2014, 12:20
Die Zeichenreihenfolge hängt nicht von der absoluten Position des einzelnen Objekts ab, sondern vom relativen Abstand zum aktuellen Betrachtungsstandpunkt.

Je weiter weg, desto früher zeichnen.

Das muss deine Sortierung hinbekommen.

Solange du aber nicht den relativen Abstand in irgend einer Weise hier ins Spiel bringst, wird die Sortierung alles liefern nur nicht das gewünschte Ergebnis.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 4. Mär 2014 um 12:24 Uhr)
  Mit Zitat antworten Zitat
LexLing

Registriert seit: 3. Mär 2014
15 Beiträge
 
Delphi XE5 Professional
 
#7

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 4. Mär 2014, 12:40
Die Sortierung mit dem relativen Abstand war auch mein erster Gedanke und habe sie auch schon ausprobiert.
Die sort-Funktion von Firemonkey aber scheint offensichtlich gar nichts zu machen.
Egal, wie ich versuche eine Sortierungsreihenfolge anzuordnen, es passiert gar nichts (es sieht immer aus wie auf dem Bild im Anhang).

Ich scheine Firemonkey keine Reihenfolge durch die sort-Funktion angeben zu können
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 4. Mär 2014, 13:42
Ich sehe nur, dass der Kram mit der Sortierung noch aus dem seligen 2011 ist. FireMonkey hat sich ja doch ein paar mal gewandelt. Kann es sein, dass man es ganz anders machen muss?
  Mit Zitat antworten Zitat
LexLing

Registriert seit: 3. Mär 2014
15 Beiträge
 
Delphi XE5 Professional
 
#9

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 4. Mär 2014, 13:52
Man sieht auch auf der Seite aus dem Jahre 2011, dass dort die Funktion "sortList" benutzt wurde.
Auf die kann ich heutzutage leider nicht mehr zugreifen.
Wäre sehr gut möglich, dass ein anderer Lösungsansatz nötig wäre.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 4. Mär 2014, 14:15
Die Sortierung mit dem relativen Abstand war auch mein erster Gedanke und habe sie auch schon ausprobiert.
Die sort-Funktion von Firemonkey aber scheint offensichtlich gar nichts zu machen.
Egal, wie ich versuche eine Sortierungsreihenfolge anzuordnen, es passiert gar nichts (es sieht immer aus wie auf dem Bild im Anhang).

Ich scheine Firemonkey keine Reihenfolge durch die sort-Funktion angeben zu können
Welche Delphi-Version hast du denn im Einsatz? (ah, gerade im ersten Beitrag gesehen XE5)
Bei XE5 wird die TViewPort3D.FRenderingList auf jeden Fall schon mal von selbst passend sortiert (abhängig von der Kamera).

Damit dürfte das eigene Sortieren wohl ins Leere laufen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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 01:40 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