GLSL Tessellierte Umgebung - Lücken zwischen Patches

8

Also habe ich ein Programm geschrieben, das einen Tessellations-Shader und eine Höhenkarte verwendet, um eine Umgebung zu zeichnen. Es beginnt als eine 32x32-Ebene, und wenn es mehr tesselliert wird, werden die Höhen jedes quadratischen Eckpunkts durch die Höhenkarte bestimmt.

Ich möchte, dass je näher der Patch an der Kamera ist, desto tessellierter wird es. Ich habe jedoch festgestellt, dass dies Lücken zwischen den Patches verursacht. Wenn ein Patch tesselierter ist als ein nächster, verursachen die unterschiedlichen Auflösungen Lücken.

Hier sagt ein Bild mehr als tausend Worte:

Wenn zwei Patches die gleiche Auflösung haben, gibt es keine Lücken. Wie kann ich dieses Problem umgehen? Ich bin völlig festgefahren.

    
danglingPointer 08.05.2014, 00:39
quelle

3 Antworten

0

Hier ist, was ich getan habe;

Also habe ich gemerkt, dass nur die äußeren Tessellationsniveaus zwischen zwei Patches übereinstimmen müssen, die inneren Tessellationsniveaus können beliebig sein. TCS in GLSL Füllen Sie Folgendes aus, um zu bestimmen, wie viel Tessellation durchgeführt wird:

%Vor%

Die vier TessLevelOuter repräsentieren die Tessellationsebenen der vier Seiten des Patches (das Quadrat). Sie werden entlang der Orte jeder Ecke des Quadrats geführt. Um die inneren Tessellationsgrade zu bestimmen, beziehe ich diese vier Orte zusammen und erhalte die Entfernung des Ergebnisses von der Kamera. Jetzt mittle ich für jede Kante, die von den äußeren Tessellationsebenen gesteuert wird, die zwei geeigneten Eckpositionen und erhalte den Abstand davon von der Kamera. Da das mit dem daneben liegenden Patch übereinstimmen muss, funktioniert das.

    
danglingPointer 01.08.2014, 19:56
quelle
8

Die UV-Koordinaten entlang der Kanten müssen gleichmäßig variieren, damit sie nahtlos sind. Wenn sie auf der gleichen Unterteilungsebene durchgeführt werden, gibt es einige ziemlich zuverlässige Invarianzgarantien. Dies passiert jedoch selten, wenn die beiden Kanten mit unterschiedlichen Raten unterteilt werden.

Technisch ist das, was Sie haben, als T-Junction bekannt. Es tritt auf, weil zwei Oberflächen, die angeblich sind, um eine Kante gemeinsam zu nutzen, leicht divergieren. Das Einfügen eines neuen verschobenen Eckpunkts erzeugt zwei Grundelemente, von denen weder noch eine Kante mit dem Element eins des benachbarten Bereichs gemeinsam haben.

Sie müssen die äußere Tessellationsebene für Patches mit Kanten *:

identisch machen

* Wie in diesem Diagramm von GPU Gems 2

    
Andon M. Coleman 08.05.2014 02:15
quelle
2

Ich bin sicher, dass Sie mit dem Problem der kontinuierlichen Detailgenauigkeit bereits vertraut sind. Das Suchen im Web gibt mehrere Methoden, die das Lücke-Problem lösen. Eine solche Seite ist hier , wo ich das Bild unten kopiert habe.

Eine Sache, die in Ihrem Fall interessant ist, ist, dass die Tesselation anscheinend nicht in 2 / n-Richtung zunimmt / abnimmt. Für Ihren Fall könnte es vielleicht die einzig mögliche Lösung sein, die vier Grenzen eines jeden Terrain-Mesh-Gitters mit Flächen zu versehen, die als Vorhänge dienen.

Wenn Sie sich das Bild unten ansehen, sehen Sie, dass die Grenzen vertikale Flächen haben. Nebeneffekt ist, wenn die Lücke groß genug ist, dann könnte es als eine Klippe gesehen werden. Sie müssen die Tesselation zwischen den Detailstufen anpassen, um diesen Nebeneffekt zu minimieren.

    
Keugyeol 08.05.2014 02:24
quelle

Tags und Links