Dreiecke auf gleicher Ebene tiefensortieren
-
- Establishment
- Beiträge: 505
- Registriert: 01.03.2009, 19:09
Dreiecke auf gleicher Ebene tiefensortieren
Meine Anwendung hier beinhaltet mehrere ineinanderliegende Meshes. Man stelle sich ein Rohr oder einen Schlauch vor in dem ein weiteres Rohr/Schlauch liegt.
Da das innere Mesh aus den Konturen des äusseren Meshes erstellt wird (genauer gesagt werden einfach die Vertizes kopiert) existieren exakt gleiche Dreiecke (Position, Rotation, Größe). Allerdings mit unterschiedlichen Materialen/Farben. Beim erstellen kann ich das leider nicht verhindern da die Vertices anschließend noch für Volumenberechnungen benutzt werden und deshalb nicht verändert werden sollen.
Die Dreiecke können Transparant sein oder auch nicht, das ist vorher nicht bekannt.
Da ich die Drawcalls für die Meshes nicht (oder nur mit sehr großem Aufwand) sortieren kann suche ich nach einer Möglichkeit wie ich es hinbekomme, dass das äussere Mesh auch immer aussen gezeichnet wird und das ganze nicht von der Reihenfolge der Drawcalls abhängt.
Meine erste Idee, wäre die Vertices von einem der beiden Meshes entlang der Normalen minimal entsprechend nach aussen/innen zu verschieben um eine definierte Tiefenreihenfolge herzustellen. Welches Mesh verschoben wird und welches nicht müsste hier der User festlegen.
Allerdings bin ich mir nicht ganz sicher wie das anschließend aussehen wird, also ob es möglich ist die so zu verschieben dass man keinen Spalt zwischen den Dreiecken erkennt.
Nun meine Frage stand von euch jemand schon vor einem ähnlichen Problem oder hat eine Idee oder ein Konzept wie sich soetwas am besten umsetzen lässt? Je mehr dabei Automatisiert geschehen kann und je weniger der User angeben muss desto besser.
Da das innere Mesh aus den Konturen des äusseren Meshes erstellt wird (genauer gesagt werden einfach die Vertizes kopiert) existieren exakt gleiche Dreiecke (Position, Rotation, Größe). Allerdings mit unterschiedlichen Materialen/Farben. Beim erstellen kann ich das leider nicht verhindern da die Vertices anschließend noch für Volumenberechnungen benutzt werden und deshalb nicht verändert werden sollen.
Die Dreiecke können Transparant sein oder auch nicht, das ist vorher nicht bekannt.
Da ich die Drawcalls für die Meshes nicht (oder nur mit sehr großem Aufwand) sortieren kann suche ich nach einer Möglichkeit wie ich es hinbekomme, dass das äussere Mesh auch immer aussen gezeichnet wird und das ganze nicht von der Reihenfolge der Drawcalls abhängt.
Meine erste Idee, wäre die Vertices von einem der beiden Meshes entlang der Normalen minimal entsprechend nach aussen/innen zu verschieben um eine definierte Tiefenreihenfolge herzustellen. Welches Mesh verschoben wird und welches nicht müsste hier der User festlegen.
Allerdings bin ich mir nicht ganz sicher wie das anschließend aussehen wird, also ob es möglich ist die so zu verschieben dass man keinen Spalt zwischen den Dreiecken erkennt.
Nun meine Frage stand von euch jemand schon vor einem ähnlichen Problem oder hat eine Idee oder ein Konzept wie sich soetwas am besten umsetzen lässt? Je mehr dabei Automatisiert geschehen kann und je weniger der User angeben muss desto besser.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Re: Dreiecke auf gleicher Ebene tiefensortieren
Vielleicht ist hier etwas dabei? (Für Direct3D 11 kann man auch hier mehr lesen). Wenn aber kein gleichbleibender Depth-Bias pro Objekt möglich ist, dann bleibt aus meiner Sicht nichts anderes übrig, als order-independent Transparency zu benutzen (nur eben ohne Transparenz); beim Durchlaufen der Fragmentliste pro Pixel kann man dann entscheiden, welches Fragment vorne liegen soll (da man pro Fragment speichert, ob es zu einem Mesh gehört, welches innen oder außen liegt). Man könnte also sagen, du musst dann das Hardware-z-Buffering abschalten und z-Buffering einfach via Hand implementieren (mit einem Spezialfall für ähnliche Fragmenttiefen); ähnlich wie OIT.
Das wissen, welches Objekt innen und außen liegt, muss zum Zeitpunkt des Renderns vorhanden sein, oder man kann den (physikalisch ja unmöglichen) Fall von koplanaren Dreiecken nicht auflösen.
Das wissen, welches Objekt innen und außen liegt, muss zum Zeitpunkt des Renderns vorhanden sein, oder man kann den (physikalisch ja unmöglichen) Fall von koplanaren Dreiecken nicht auflösen.
- dot
- Establishment
- Beiträge: 1746
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: Dreiecke auf gleicher Ebene tiefensortieren
Ja, ich versteh das Problem auch nicht so ganz. Wenn beide Meshes wirklich exakt die gleichen Dreiecke haben und nacheinander gerendert werden, gibt es kein z-Fighting, gar nix. Abgesehen davon, frag ich mich, wieso es in dem Fall dann überhaupt zwei Meshes geben muss. Was genau soll "Außen" und "Innen" bedeuten, wenn beide Meshes exakt gleich sind? Und wieso kannst du die Draw Calls eigentlich nicht sortieren?
-
- Establishment
- Beiträge: 505
- Registriert: 01.03.2009, 19:09
Re: Dreiecke auf gleicher Ebene tiefensortieren
Konkret sollen Blutgefäße mit innenliegenden Ablagerungen dargestellt werden.
Die Ablagerungen gehen normalerweise bis an die innere Gefäßwand deshalb wird beim erstellen des Meshes für die Ablagerung einfach der entsprechende Bereich der Gefäßwand kopiert.
Das ganze wird automatisiert aus 3D-Bildern segmentiert.
Da Ablagerung und Gefäß unterschiedlich dargestellt werden sollen und auch wahlweise ein uns ausgeblendet werden sollen schien uns die Lösung mit seperaten Meshes am einfachsten. Wenn es da eine besser Lösung gibt immer her damit.
Das Proplem ist jezt wenn beide exakt gleich sind muss wenn ich von aussen draufschau immer das Gefäß sichtbar sein. Wird das Gefäß transparent gerendert, muss eben auch noch die Ablagerung (die möglicherweise nicht transparent ist) hinter das Gefäß.
Soweit die Vorgaben die ich nicht oder nur in sehr geringem Maße verändern kann.
Order independet Transparency sind wir gerade am implementieren (wird sowieso benötigt) allerdings steh ich auch hier vor dem Problem wie sortiere ich zwei gleiche Werte :(
@dot: das Problem beim herkömmlichen Render ist dass das zuletzt gezeichnete das andere Dreieck überzeichnet. Mit OIT hab ich das Problem wie ich zwei gleiche Teifenwerte sortiere.
Es sind auch nicht beide Meshes exakt gleich sonder lediglich einzelne Dreiecke der beiden Meshes.
Das der Fall phyisikalisch unmöglich ist weiß ich auch, es hilft aber nichts da die einzige Möglichkeit das kopieren zu umgehen eine erneute Segmentierung wäre in der Hoffnung dass der Fall nicht auftritt und sich Ablagerung und Gefäß nicht überlappen. Da das ganze extrem rechenintensiv ist fällt die erneute Segmentierung aus.
Die Ablagerungen gehen normalerweise bis an die innere Gefäßwand deshalb wird beim erstellen des Meshes für die Ablagerung einfach der entsprechende Bereich der Gefäßwand kopiert.
Das ganze wird automatisiert aus 3D-Bildern segmentiert.
Da Ablagerung und Gefäß unterschiedlich dargestellt werden sollen und auch wahlweise ein uns ausgeblendet werden sollen schien uns die Lösung mit seperaten Meshes am einfachsten. Wenn es da eine besser Lösung gibt immer her damit.
Das Proplem ist jezt wenn beide exakt gleich sind muss wenn ich von aussen draufschau immer das Gefäß sichtbar sein. Wird das Gefäß transparent gerendert, muss eben auch noch die Ablagerung (die möglicherweise nicht transparent ist) hinter das Gefäß.
Soweit die Vorgaben die ich nicht oder nur in sehr geringem Maße verändern kann.
Order independet Transparency sind wir gerade am implementieren (wird sowieso benötigt) allerdings steh ich auch hier vor dem Problem wie sortiere ich zwei gleiche Werte :(
@dot: das Problem beim herkömmlichen Render ist dass das zuletzt gezeichnete das andere Dreieck überzeichnet. Mit OIT hab ich das Problem wie ich zwei gleiche Teifenwerte sortiere.
Es sind auch nicht beide Meshes exakt gleich sonder lediglich einzelne Dreiecke der beiden Meshes.
Das der Fall phyisikalisch unmöglich ist weiß ich auch, es hilft aber nichts da die einzige Möglichkeit das kopieren zu umgehen eine erneute Segmentierung wäre in der Hoffnung dass der Fall nicht auftritt und sich Ablagerung und Gefäß nicht überlappen. Da das ganze extrem rechenintensiv ist fällt die erneute Segmentierung aus.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
- dot
- Establishment
- Beiträge: 1746
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: Dreiecke auf gleicher Ebene tiefensortieren
Reicht es nicht, die Ablagerungen einfach zuerst zu zeichnen? Könnte mir vorstellen, dass das in 98% der Fälle bereits gut genug aussehen würde. Aber wenn ihr sowieso OIT implementieren müsst, dann löst ihr dieses Problem eh im Vorbeigehen!?
Re: Dreiecke auf gleicher Ebene tiefensortieren
dot: Das Problem mit OIT hat er doch gerade beschrieben.
Wenn ihr OIT implementiert, macht einfach, was ich schon eingangs sagte: Pro Fragment speichern, wozu das Fragment denn gehört (zur Gefäßwand oder zur Sklerose); dann einfach beim Sortier-Schritt von OIT den Sklerose-Fragmenten einen kleinen Depth-Offset zum Gefäßzentrum hin geben.
Wenn ihr OIT implementiert, macht einfach, was ich schon eingangs sagte: Pro Fragment speichern, wozu das Fragment denn gehört (zur Gefäßwand oder zur Sklerose); dann einfach beim Sortier-Schritt von OIT den Sklerose-Fragmenten einen kleinen Depth-Offset zum Gefäßzentrum hin geben.
-
- Establishment
- Beiträge: 505
- Registriert: 01.03.2009, 19:09
Re: Dreiecke auf gleicher Ebene tiefensortieren
Die Ablagerund einfach zuerst zu zeichen hatten wir bisher, leider kam jezt als Anforderung hinzu dass diese ebenfalls transparent sein kann, was dann zu Artefakten führt, die die Rückseiten ebenfalls zu sehen sein sollen.
Mann müsste also folgendermaßen Zeichnen:
1. Gefäß innen
2. Ablagerung innen
3. Ablagerung aussen
4. Gefäß aussen
wenn die Kamera sich ausserhalb des Gefäßes befindet, befindet sie sich innerhalb entsprechended anders sortiert. Zu allem Überfluss ist das ganze nicht auf eine Ablagerung beschränkt und die Gefäße können sich verzweigen. Da ist eine automatische Sortierung der Drawcalls nur mit extrem hohem Aufwand möglich. Da wir den Ärzten die das verwenden sollen nicht zumuten können währen der Diagnose die Darstellung zu sortieren fällt eine manuelle sortierung auch aus :lol: :lol: :lol: :lol:
Mann müsste also folgendermaßen Zeichnen:
1. Gefäß innen
2. Ablagerung innen
3. Ablagerung aussen
4. Gefäß aussen
wenn die Kamera sich ausserhalb des Gefäßes befindet, befindet sie sich innerhalb entsprechended anders sortiert. Zu allem Überfluss ist das ganze nicht auf eine Ablagerung beschränkt und die Gefäße können sich verzweigen. Da ist eine automatische Sortierung der Drawcalls nur mit extrem hohem Aufwand möglich. Da wir den Ärzten die das verwenden sollen nicht zumuten können währen der Diagnose die Darstellung zu sortieren fällt eine manuelle sortierung auch aus :lol: :lol: :lol: :lol:
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
-
- Establishment
- Beiträge: 505
- Registriert: 01.03.2009, 19:09
Re: Dreiecke auf gleicher Ebene tiefensortieren
eXile hat geschrieben:dot: Das Problem mit OIT hat er doch gerade beschrieben.
Wenn ihr OIT implementiert, macht einfach, was ich schon eingangs sagte: Pro Fragment speichern, wozu das Fragment denn gehört (zur Gefäßwand oder zur Sklerose); dann einfach beim Sortier-Schritt von OIT den Sklerose-Fragmenten einen kleinen Depth-Offset zum Gefäßzentrum hin geben.
Hört sich nach einer brauchbaren Idee an. Ich werd das mal testen und dann wieder berichten obs klappt
Danke schon mal für eure Antworten
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
- dot
- Establishment
- Beiträge: 1746
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: Dreiecke auf gleicher Ebene tiefensortieren
Nur um das noch einzuwerfen, falls du's nicht kennst: Ein üblicher Trick ist, zuerst die Back Faces zu zeichnen (Culling umdrehen) und danach die Front Faces. Das ist genaugenommen natürlich nur bei konvexen Körpern korrekt, sieht aber möglicherweise schon ausreichend gut aus. Sonst eben OIT...
-
- Establishment
- Beiträge: 505
- Registriert: 01.03.2009, 19:09
Re: Dreiecke auf gleicher Ebene tiefensortieren
Kenn ich funktioniet aber leider nicht mehr sobald ich transparente Gefäße mit Verzweigungen habe :(
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
- dot
- Establishment
- Beiträge: 1746
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: Dreiecke auf gleicher Ebene tiefensortieren
Ja, dann wirds natürlich problematisch. Die Frage ist eben, wie exakt die Transparenz sein muss. Möglicherweise kommt man schon damit davon, dass man die Backfaces der Gefäße in den Depthbuffer malt, damit keine merkwürdigen Überlappungen zustande kommen. Natürlich sieht man dann nicht mehr, was hinter den Gefäßen ist. Wenn das kein Problem ist, z.B. weil es anders sowieso zu verwirrend werden würde, dann gut. Ansonsten -> OIT...