Textur-Einrückungspixel

Einführung in den vierten Artikel unserer Reihe zur Arbeit mit 3D-Modellen in Unity. Frühere Artikel: „Funktionen für die Arbeit mit Mesh in Unity“ , „Unity: prozedurale Bearbeitung von Mesh“ , „Import von 3D-Modellen in Unity und Fallstricke“ .

Im vorherigen Artikel haben wir erwähnt, dass der Textur-Scan auf die Angemessenheit der Pixeleinrückung bei einer bestimmten Texturauflösung überprüft wird. In dieser Veröffentlichung beschreiben wir das Wesentliche des Problems bei der Beobachtung der Pixeleinrückung und den Algorithmus für deren Verfolgung. Es wird nicht als Code betrachtet, sondern genau das Prinzip, das in jeder Sprache und in jeder Entwicklungsumgebung implementiert werden kann.



Problem


Eine Bestellung für ein 3D-Modell wird normalerweise von einer Anforderung an die Texturauflösung begleitet. Aufgrund der diskreten Natur des Rasterbilds muss der 3D-Künstler die Einrückung in Pixel zwischen Teilen des Textur-Scans beobachten. Das Fehlen der erforderlichen Einrückung führt dazu, dass dasselbe Pixel auf dem Modell an völlig unterschiedlichen Stellen angezeigt wird, wenn es nicht benötigt wird.

Es ist besonders wichtig, in den frühen Arbeitsphasen eine ausreichende Einrückung zu verfolgen. Am häufigsten beschäftigen sich einige Personen mit der Erstellung von Geometrie, einschließlich eines Textur-Scans, und andere mit dem Zeichnen von Texturen. Der vom 3D-Künstler erkannte Fehler verursacht weniger Probleme als der, den der Texturdesigner findet. Im letzteren Fall wird die Situation noch komplizierter, wenn das verwendete 3D-Paket keine Werkzeuge zum Zeichnen über Geometrie bereitstellt (z. B. einen Pinsel).

Sie sollten auch zwei Nuancen berücksichtigen, aufgrund derer zwischen den Elementen des Sweeps möglicherweise mehr Platz benötigt wird. Die erste ist eine Verringerung der Texturauflösung während des Mipmappings. Das zweite ist die Verwendung eines Dilatationsfilters beim Erstellen einer Beleuchtungskarte . Bei der Erstellung eines UV- Scans muss sich ein 3D-Künstler an den Anforderungen für die Texturauflösung orientieren und auch die oben aufgeführten Nuancen berücksichtigen. Trotzdem können viele Mängel ohne automatische Überprüfung einfach nicht bemerkt werden.


Ein Beispiel für das Auftreten von Artefakten mit einer Abnahme der Details

Für einfache Modelle kann ein Textur-Scan mit automatischen Werkzeugen erstellt werden. Sie basieren jedoch auf internen Metriken und berücksichtigen keine Pixeleinrückungen. Daher befinden sich gemeinsam genutzte Pixel häufig entlang diagonaler Ränder. Das Überprüfen mit Checker-Texturen zeigt nicht alle Fehler an. Außerdem haben diese Texturen häufig eine höhere Auflösung als die im Projekt verwendeten.


Gemeinsame Pixel

Das Problem einer unzureichenden Pixeleinrückung im UV- Scan ähnelt dem Problem mit Überlagerungen. In beiden Fällen kann es zu sogenannten Blutungen kommen - im vorherigen Artikel haben wir beschrieben, welche Artefakte dadurch entstehen.

Das Problem mit der Pixeleinrückung hängt jedoch von der Mindestanforderung an die Texturauflösung ab. Eine einzige Überprüfung reicht aus, um die Überlagerungen zu bestimmen, während sich die Anforderungen an die Texturauflösung in der nächsten Entwicklungsstufe ändern können. Die Situation wird durch die Tatsache kompliziert, dass die von uns verwendeten 3D-Pakete keine Tools zum automatischen Erkennen von Fehlern in Bezug auf die Nähe von Teilen des UV- Scans enthalten. Und vergessen Sie nicht, dass Sie nach dem Betrieb des automatischen Shapers in Unity noch UV2 überprüfen müssen .

Wir haben uns entschlossen, ein Tool zu erstellen, mit dem Einrückungen in Pixel überprüft und die Stellen potenzieller Lücken im Modell markiert werden können. Die Anforderungen an die Einrückung werden anhand der folgenden Parameter ermittelt:

  1. Die Basisauflösung der Textur.
  2. Die minimale Auflösung der Textur, bei der das Fließen nicht zulässig ist.
  3. Die erforderliche Einrückung auf die minimale Textur.

Da die Größe der von uns verwendeten Texturen gleich Zweierpotenzen ist, ist die Formel zur Berechnung der erforderlichen Einrückung bei der Grundauflösung recht einfach: (Grundauflösung / Mindestauflösung) * Einzug in die MinTexture.

Offensichtlich hängt die Lösung dieses Problems eng mit der Rasterung zusammen. Für eine klarere Angabe der Anforderungen und die Entwicklung eines Algorithmus führen wir verschiedene Konzepte ein.

Schlüsselkonzepte


Betrachten Sie einen UV- Raum und ein einheitliches Gitter mit der Dimension NxM im Bereich von 0,0 bis 1,0. Zellen mit einer Breite von 1 / N und einer Höhe von 1 / M bilden eine Aufteilung des UV- Raums.


NxM-Aufteilung des UV- Raums

Wir nehmen zwei beliebige Punkte und bezeichnen Dn als die Anzahl der Pixel, die von der Projektion auf die U-Achse des Segments, das die gegebenen Punkte verbindet, belegt werden. In ähnlicher Weise Dm für die V-Achse. Dann definieren wir den Pixelabstand als das Maximum zwischen Dn und Dm.


Pixelabstand

Es ist zu beachten, dass im euklidischen Raum Bewegungsoperationen wie parallele Translation und Rotation keine Bewegungen für das Netz sind, wenn der Pixelabstand als Metrik verwendet wird. Diese Nuance hat die Entwicklung unserer Lösung etwas erschwert.



Wir nennen ein Quadrat mit einer Seite in K Pixeln den Kern von K. Dann können zwei beliebige Punkte mit einem Pixelabstand von weniger als K von einem Kernel von K abgedeckt werden.


Beispiele für Kerne unterschiedlicher Größe

Zwei Kanten des Polygons bilden eine Konkavität der Kontur, wenn ihr Mittelpunkt (der Schwerpunkt an vier Eckpunkten) links von diesen Kanten liegt, wenn die Kontur im Uhrzeigersinn umrundet wird. Bei einer Durchquerung gegen den Uhrzeigersinn muss ein Punkt rechts von den Kanten gefunden werden.


Ein Paar Rippen, die eine Konkavität der Kontur bilden

Lösung


Lassen Sie uns nun direkt über das Überprüfen der Pixeleinrückung sprechen. Um dies zu implementieren, haben wir einen Algorithmus entwickelt, der aus drei unabhängigen Fragmenten besteht. Die Reihenfolge der Ausführung ist nicht wichtig. Das Ergebnis jedes der Fragmente ist die NxM-Matrix, die ein Puffer der Zellen der Partition ist, in der einige Zellen markiert sind. Das Hinzufügen aller drei Puffer ist das allgemeine Ergebnis.

Betrachten Sie zunächst das einfachste Snippet. Es kommt darauf an, Zellen zu finden, die sich in der Nähe von entarteten Dreiecken und Kanten schneiden, deren Länge kleiner ist als die Seite des Kerns einer bestimmten Größe. Alle diese Zellen sind im Puffer markiert.


Ergebnis der Überprüfung der Elementgrößen

Bevor Sie die beiden anderen Fragmente beschreiben, betrachten Sie die allgemeine Logik ihrer Arbeit. Beide beziehen sich auf die Verarbeitung von Dreiecksclustern, die als Schalen oder Inseln bezeichnet werden. Shell für einen 3D-Künstler ist eine zusammenhängende Menge von Polygonen, dh jedes Polygon in dieser Menge hat einen Nachbarn, mit dem es gemeinsame Eckpunkte teilt. Auch Shell ist ein eigenständiger Übungsplatz. Mit Muschel, Insel und Cluster meinen wir dasselbe.



Um alle Schalen zu finden, verwenden wir den Suchalgorithmus für alle verbundenen Komponenten des Diagramms, wobei der Scheitelpunkt des Diagramms durch ein Polygon und die Kante durch das Vorhandensein gemeinsamer Scheitelpunkte in einem Paar von Polygonen dargestellt wird. Da das einzige Polygon in Unity ein Dreieck ist, das durch Scheitelpunktindizes definiert ist, betrachten wir Dreiecke als benachbart, wenn mindestens ein Index des Scheitelpunkts des ersten mit dem Index eines Scheitelpunkts des zweiten übereinstimmt. Aus der Analogie mit dem Graphen und der Methode zur Bestimmung der Kanten folgt, dass die Menge der Indizes der Eckpunkte eines Clusters die Menge der Eckpunkte des anderen nicht schneidet.



Mit dem gemeinsamen Teil fertig. Das zweite Fragment, das wir betrachten werden, bestimmt die Orte potenzieller Fehler, die mit der Nähe oder Überlappung verschiedener Cluster verbunden sind.

Viele Cluster werden der Eingabe in Form von Dreiecksätzen im UV- Raum zugeführt, wobei die Dimension der UV- Aufteilung der Texturauflösung (NxM) entspricht und der Einrückungswert P die Anzahl der Pixel ist. Für eine gegebene Partition müssen diejenigen Bereiche gefunden werden, in denen der Abstand in Pixeln zwischen den Clustern kleiner als der erforderliche Einzug ist. Eine Zelle in der Ergebnismatrix wird markiert, wenn sie in mindestens einen Kern des Werts K = P + 1 eintritt, der zwei verschiedene Cluster schneidet.

Die Essenz des Fragments ist fast in der Beschreibung des Ergebnisses dargelegt. Es ist notwendig, alle Kerne der Größe K zu finden , die sich mit Dreiecken aus verschiedenen Schalen schneiden, und dann die Zellen dieser Kerne im Ergebnispuffer zu markieren.

In unserer Implementierung werden alle Clusterpaare der Reihe nach berücksichtigt. Für jedes Paar wird der Schnittbereich der Sätze von Kerneln der Größe K bestimmt, die von diesen Clustern abgedeckt werden. Wählen Sie ein Paar und bezeichnen Sie einen Satz als Q.



Dann müssen alle Elemente von Q durch das folgende Kriterium überprüft werden: schneidet der gegebene Kernel mindestens ein Dreieck in jedem der Cluster des ausgewählten Paares. Wenn ja, werden alle Zellen des getesteten Kernels markiert.



Der Puffer mit markierten Zellen für alle Clusterpaare bildet das Ergebnis.


Ergebnis der Clustereinrückung

Jetzt werden wir uns mit dem letzten Fragment befassen. Hier müssen Sie einen Cluster verarbeiten. Die Eingabe besteht aus einer Reihe von Dreiecken im UV- Raum, der Dimension der UV- Partition entsprechend der Auflösung der Textur (NxM) und dem Einrückungswert P als Anzahl der Pixel. Eine Zelle kann in zwei Fällen markiert werden: Entweder ist der Cluster ungültig oder weist Löcher auf, oder der Abstand in Pixel zwischen den Konkavitätskanten ist geringer als der erforderliche Einzug.

Der innere Teil des Clusters interessiert uns nicht - zunächst wird seine Kontur durch eine zusammenhängende Liste von Kanten dargestellt. Benachbarte Dreiecke duplizieren die Indizes der Scheitelpunkte, sodass die Kante zur Kontur gehört, wenn ein Paar von Indizes ihrer Scheitelpunkte für die Menge der Kanten des Clusters eindeutig ist. Nachdem Sie herausgefunden haben, welche Kanten die Kontur bilden, müssen Sie sie zusammensetzen, damit eine verknüpfte Liste erhalten wird.

Wenn nach diesem Schritt nicht alle Kanten der Kontur in die Liste aufgenommen werden, weist der Cluster entweder Löcher auf oder es liegt ein Fehler in den Netzdaten vor. In diesem Fall müssen alle Zellen der vom Cluster geschnittenen Kerne angemessen markiert werden.

Wird die Kontur gefunden, wird die Verarbeitung fortgesetzt. Wir haben die folgende Ergebnisanforderung formuliert. Lassen Sie das Kantenpaar, das die Konkavität der Kontur bildet, den Kern von K = P + 1 schneiden. Dann müssen die Zellen des Kerns markiert werden, wenn beide Teile der Kontur zwischen den Kanten über diesen Kern hinausgehen.


Testergebnis für Clusterfunktionen

Wir haben uns entschlossen, diese Anforderung durch paarweisen Vergleich der Kanten der Kontur umzusetzen. Wir beginnen mit der Konkavitätsbedingung, dann werden für jedes Paar alle Kernel überprüft, die beide Kanten schneiden. Um den Kernel zu testen, werden Durchquerungen jedes Teils der Kontur zwischen einem Kantenpaar durchgeführt. Wenn jeder Teil mindestens einen Punkt jenseits der Grenzen des Kerns enthält, werden alle Zellen des Kerns markiert.


Die Bedingung, unter der die Zellen des überprüften Kernels markiert werden

Zusammenfassung


Der obige Algorithmus ist sehr gut für die Implementierung unter Verwendung von Parallel Computing geeignet. Die Verarbeitung jedes Paares von Clustern und Kanten erfolgt unabhängig voneinander. Da die Überprüfungen auf Rasterung basieren, ist es ratsam, die Funktionen der GPU zu verwenden, wenn Sie die Verarbeitung nicht mit Kantenpaaren, sondern mit Kernen starten.

Wir transformieren das Ergebnis des Algorithmus in eine Textur. Auf diese Weise können Sie bei einer bestimmten Auflösung die Stellen potenzieller Fehler im UV- Scan grafisch darstellen. Die resultierende Textur kann auch auf das Modell angewendet werden, um Markierungen direkt auf der Geometrie anzuzeigen.

In den folgenden Beispielen haben wir das Kaninchen und Suzanne speziell mit dem automatischen Blender- Werkzeug geschnitten, damit wir mehr Artefakte erhalten. Die überprüfte Texturauflösung beträgt 256x256, die erforderliche Einrückung ist 1.

Blau markierte Zellen bedecken Cluster mit Löchern sowie zu kleinen Dreiecken und Kanten. Grün zeigt die Zellkerne mit den Eigenschaften jedes Clusters einzeln an. Kernel, in denen der Einzug zwischen Clustern nicht beobachtet wird, sind rot markiert.

Beispiele




Im nächsten Artikel werden wir einen Algorithmus zur Optimierung von 3D-Modellen in einer Szene betrachten, indem unsichtbare Geometrie entfernt wird. Bleib bei uns!

Source: https://habr.com/ru/post/de451794/


All Articles