Ich habe aus vielen Quellen gehört, dass es eine schlechte Idee ist, T-Übergänge in 3D-Netzen zu haben, da dies zu Rissen beim Rendern führen kann. Kann jemand erklären, warum das passiert und was man tun kann, um sie zu vermeiden?
19
Antworten:
Die Antwort von lhf ist aus der Sicht der Tessellation gut, aber diese kann bei einfacheren Dreiecksnetz-Anwendungsfällen auftreten.
Nehmen Sie dieses triviale Beispiel von drei Dreiecken im Raster , ABC, ADE und DBE ...
Obwohl Punkt E mathematisch genau auf dem Liniensegment AB liegen sollte, werden in der Pipeline keine vollständig genauen Werte wie beispielsweise rationale Zahlen (z . B. https://gmplib.org/ ) verwendet. Stattdessen werden wahrscheinlich Floats verwendet, und daher wird eine gewisse Annäherung / ein gewisser Fehler eingeführt. Das Ergebnis wird wahrscheinlich ungefähr so aussehen:
Beachten Sie, dass alle Eckpunkte Ungenauigkeiten aufweisen können. Obwohl das obige Beispiel einen Riss zeigt, kann der T-Übergang stattdessen zu einer Überlappung entlang der Kante führen, wodurch die Pixel zweimal gezeichnet werden. Dies mag nicht so schlimm erscheinen, kann jedoch Probleme mit Transparenz- oder Schablonenoperationen verursachen.
Man könnte dann denken, dass der eingeführte Fehler bei Gleitkommazahlen unbedeutend ist, aber in einem Renderer werden die Werte des Scheitelpunkts (X, Y) im Rasterraum fast immer durch Festkommazahlen dargestellt, und die Verschiebung von der idealen Position wird es tun in der Regel viel größer sein. Da die Rendering-Hardware das Liniensegment Pixel für Pixel mit seiner eigenen internen Präzision "interpoliert", ist die Wahrscheinlichkeit noch größer, dass es von der gerundeten Stelle von E abweicht.
Wenn die T-Verzweigung "entfernt" wird, indem beispielsweise auch das Dreieck ABC in zwei geteilt wird, dh AEC und EBC, wird das Problem behoben, da die durch die Fehler verursachten Verschiebungen alle konsistent sind.
Nun könnten Sie sich fragen, warum Renderer (insbesondere HW) Festkomma-Mathematik für die Vertex-XY-Koordinaten verwenden. Warum verwenden sie keine Gleitkommazahlen, um das Problem zu reduzieren? Obwohl dies bei einigen der Fall war (z. B. bei Segas Dreamcast), kann es zu einem weiteren Problem kommen, bei dem die Dreiecksberechnung katastrophal ungenau wird, insbesondere bei langen, dünnen Dreiecken, und sich die Größe auf unangenehme Weise ändert.
quelle
Bei der Modellierung parametrischer Oberflächen mit einem Netz im Parameterbereich treten T-Übergänge höchstwahrscheinlich als Diskontinuitäten in der Oberfläche auf. Diese werden als Lücken im Rendering angezeigt. Siehe unten.
Im Allgemeinen führen T-Übergänge in Dreiecksnetzen wahrscheinlich zu Diskontinuitäten interpolierter Attribute wie Farbe und Normalen.
quelle
Gleitkomma-Rundungsfehler.
Nachdem Sie die T-Verzweigung transformiert haben, kann der Punkt im T von der Kante abgerundet werden.
Dann kann es passieren, dass ein Fragment, das für ein Pixel abgetastet wird, in der Lücke zwischen den beiden Oberflächen liegt.
Dies kann behoben werden, indem zunächst keine T-Verbindung vorhanden ist.
quelle
Die einfache Möglichkeit, dies zu vermeiden, besteht darin, sicherzustellen, dass alle Ihre Scheitelpunkte geschweißt sind
Das Problem ist, dass Sie Schnitte entlang von Kanten mit einem Scheitelpunkt haben, aber keinen entsprechenden Scheitelpunkt an der angrenzenden Kante zum Verschweißen / Verbinden haben. Wenn Sie sich das wie einen Knopf an einem Hemd vorstellen, haben Sie einen gesät Knopf an der Kante, aber kein Loch, damit der Stoff offen ist.
In der Abbildung unten stellen die roten Punkte korrekt verschweißte Scheitelpunkte dar, die blauen Punkte benötigen alle einen zusätzlichen Scheitelpunkt, um in die angrenzende Kante geschnitten zu werden.
Im Allgemeinen ist es ratsam, die Modellierung in Quad's & Tri's zu belassen. Dies hilft, dieses Problem zu beheben, da Sie immer auch einen entsprechenden Scheitelpunkt zum Schweißen haben sollten. Es ist auch hilfreich, Quads beizubehalten, wenn Sie Unterteilungsmethoden für das Netz verwenden möchten.
quelle