Freigeben über


Verwenden von UVAtlas (Direct3D 9)

Hinweis

UVAtlas wurde ursprünglich in der inzwischen veralteten D3DX9-Bibliothek ausgeliefert. Die neueste Version ist unter UV Atlas Command-Line Tool (uvatlas.exe) verfügbar.

Viele Rendering- und Inhaltsgenerierungstechniken erfordern eine eindeutige, nicht überlappende Zuordnung eines 2D-Signals (z. B. einer Textur) auf ein Gitter. Zu diesen Techniken gehören:

  • Normal-/Verdrängungszuordnung
  • Texturraum-PRT-Simulationen und Lichtkarten
  • Oberflächenlackierung
  • Texturraumbeleuchtung

Die manuelle Erstellung einer eindeutigen UV-Kartierung ist oft zeitaufwändig und langwierig. dies gilt insbesondere, wenn die Eingabegeometrie komplex ist und eine effiziente/low-distortion-Textur-Raumnutzung gewünscht ist. Die folgende Abbildung zeigt ein Beispielgitter und den entsprechenden Texturatlas.

Zeigt ein Beispielgitter und den entsprechenden Texturatlas an.

Dieses Beispiel zeigt ein Gitternetz (links) und die entsprechende UV-Raum-Normalkarte (rechts). Beachten Sie, dass der Texturatlas mehrere Datengruppen oder -cluster enthält. jeder Cluster wird als Diagramm bezeichnet, und im obigen Beispiel enthält Displays die normalen Daten für einen Teil des Gitternetzes.

Die D3DX UVAtlas-APIs generieren automatisch einen optimalen, nicht überlappenden Texturatlas. Die APIs stellen Eingabeparameter bereit, die Folgendes ermöglichen:

  • Minimieren Sie Texturdehnung, Verzerrung und Untersampling.
  • Maximieren Sie die Textur-Raum-Packungsdichte für eine effiziente Nutzung des Arbeitsspeichers.
  • Sorgen Sie für eine gleichmäßige Stichprobenentnahme über das gesamte Gitternetz, wodurch Die Unterbrechungen bei der Stichprobenfrequenz minimiert werden.

Funktionsweise von UVAtlas

Die UVAtlas-APIs (siehe UVAtlas Functions) generieren einen Texturatlas, indem sie eine Oberfläche in Diagramme partitionieren und die Diagramme in einen Texturatlas packen. Verwenden Sie D3DXUVAtlasPartition und D3DXUVAtlasPack , um diese Schritte separat auszuführen. oder verwenden Sie D3DXUVAtlasCreate , um in einem einzigen Aufruf zu partitionieren, zu parametrisieren und zu packen.

Partitionieren und Parametrisieren eines Gitters

Zunächst wird das Gitternetz in Diagramme unterteilt, dann wird jedes Diagramm in einen eigenen [0,1] UV-Raum parametrisiert. Ein Zylinder kann durch ein Diagramm parametrisiert werden. eine Kugel hingegen benötigt zwei Diagramme, wie in der folgenden Abbildung dargestellt.

Abbildung einer in zwei Diagramme unterteilten Kugel

Ein Gitter, das mit einem einzelnen Diagramm parametrisiert werden kann, wird als "homeomorph zu einer Scheibe" klassifiziert, was bedeutet, dass Sie eine unendlich flexible, unendlich dehnbare Scheibe über das Diagramm verteilen und die Geometrie perfekt abdecken könnten. Diese Dehnung, die als Homeomorphismus bezeichnet wird, ist eine bidirektionale Funktion; Dies bedeutet, dass Sie von einer Parametrisierung zur anderen wechseln können, ohne Informationen zu verlieren.

Nur sehr wenige reale Gitter können in zwei Dimensionen parametrisiert werden, ohne das Gitter in Cluster oder Diagramme aufzuteilen. Die folgende Abbildung zeigt ein weiteres Beispielgitter und den entsprechenden Texturatlas.

Zeigt ein Beispielgitter mit unterschiedlichen Formen und dem entsprechenden Texturatlas.

Es gibt zwei Parameter, die die Anzahl der erstellten Diagramme bestimmen:

  • Die maximal zulässige Anzahl von Diagrammen für den Atlas
  • Die maximal zulässige Dehnungsmenge für jedes Diagramm

Der Umfang der Dehnung bestimmt die Anzahl der generierten Diagramme und die Gesamtqualität der Stichprobenentnahme. Stretch reicht von 0,0 (keine Dehnung) bis 1,0 (beliebige Dehnungsmenge). D3DXUVAtlasCreate und D3DXUVAtlasPartition geben die vom Algorithmus generierte maximale Stretch zurück. Die folgende Abbildung zeigt ein weiteres Beispielgitter und den entsprechenden Texturatlas.

Abbildung eines Beispielgitters und des entsprechenden Texturatlas

Verwenden von integrierten Metrik-Tensoren zum Steuern der Parametrisierung

Die Texturraumpriorisierung kann pro Dreieck angegeben werden. Integrierte Metrik-Tensors können bereitgestellt werden, um zu steuern, wie Dreiecke im resultierenden Textur-Raum-Atlas gestreckt werden. IMT's können direkt angegeben oder basierend auf einem Eingabesignal mithilfe der D3DX IMT-Berechnungsfunktionen berechnet werden. Ein integrierter Metrik tensor (oder IMT) ist eine symmetrische 2x2-Matrix, die beschreibt, wie ein Dreieck im Atlas gedehnt wird. Jede IMT wird durch 3 Floats definiert, rufen Sie sie auf (a,b,c). Sie können in einer symmetrischen 2x2-Matrix wie folgt angeordnet werden:

a b
b c

Dann kann der IMT verwendet werden, um den Abstand zwischen zwei Vektoren zu ermitteln. Bei zwei Vektoren v1 und v2, wobei :

vector v1
vector v2 = v1 + (s,t)

Der Abstand zwischen v1 und v2 kann wie folgt berechnet werden:

sqrt((s, t) * M * (s, t)^T)

Mit anderen Worten, der Vektor (s,t) könnte die Größe der Dehnung in einer beliebigen Richtung im U-V-Raum sein. In diesem Fall ist der s-Vektor eine Richtung vom ersten zum zweiten Scheitelpunkt, und t ist das Kreuzprodukt von normal und s. Beispiel:

(1,1) * (1,1) = (2,2)
        (1,1)
IMT(1,1,1) scales by 2
(1,-1) * (1,1) = (0,0)
         (1,1)
IMT(2,0,2) scales by 2 with no shearing

IMTs können direkt angegeben oder basierend auf einem Eingangssignal mithilfe der D3DX IMT-Berechnungsfunktionen berechnet werden: D3DXComputeIMTFromPerVertexSignal, D3DXComputeIMTFromPerTexelSignal, D3DXComputeIMTFromSignal und D3DXComputeIMTFromTexture_graphics.

Geben Sie IMT-Daten direkt an, wenn Sie steuern möchten, wie der Texturraum einzelnen Dreiecken zugeordnet wird. Ordnen Sie dadurch wichtige Bereiche eines Gitternetzes (z. B. das Gesicht oder das Brustlogo eines Charakters oder Regionen einer Szene in der Nähe des Wanderwegs eines Spielers) mehr Fläche im Atlas zu. Durch Angeben von IMT,die Vielfaches der Identitätsmatrix sind, werden die resultierenden Dreiecke gleichmäßig im Texturraum skaliert.

Bei einer hochauflösenden Normalkarte können Sie z. B. IMT berechnen, um Bereichen mit höherem Frequenzsignal in der normalen Karte mehr Texturraum bereitzustellen. Dreiecke, die "flach" sind (die konstanten Regionen der ursprünglichen normaler Karte zugeordnet sind), erhalten weniger Texturraum. Dreiecke, die viele Normalkartendetails enthalten, erhalten im Endergebnis mehr Texturbereich. Sie können dann die normale Karte in eine kleinere Textur umrechnen, aber Details beibehalten, oder Sie können die normale Karte mit der optimalen UV-Zuordnung neu berechnen.

Verwenden von Adjacency-Daten für benutzerspezifische Falten

Benutzerdefinierte Adjacency-Informationen können für die Partitionierungsfunktion bereitgestellt werden, um vordefinierte Falten im Gitter zu beschreiben und somit eine Diagrammgrenze zwischen benachbarten Flächen zu definieren. Dies ist eine einfache Möglichkeit für den Aufrufer, seine eigene Diagrammpartitionierung als Eingabe in den Algorithmus anzugeben, wodurch Diagramme weiter verfeinern, um die Stretch unter das maximal zulässige Maximum zu bringen.

Beispiel

In diesem Beispiel wird veranschaulicht, wie Sie die UVAtlas-APIs und den DirectX Viewer (Dxviewer.exe) verwenden können, um Diskontinuitäten in Ihrem Modell zu finden und zu beheben, die sich erheblich auf die Größe Ihres Texturatlas auswirken können. Sie können Dxviewer.exe abrufen und über das DirectX SDK erfahren. Dxviewer.exe wurde nach der Version vom August 2009 aus dem DirectX SDK entfernt, sodass Sie mindestens das DirectX SDK vom August 2009 benötigen. Informationen zum DirectX SDK finden Sie unter Wo ist das DirectX SDK?.

Angenommen, Sie haben mit einem Modell in Ihrer bevorzugten Software zur Inhaltsgenerierung begonnen (in diesem Beispiel wird ein Zwergkopfmodell verwendet, das in Maya erstellt wurde). Exportieren Sie das texturierte Modell in eine X-Datei, und erstellen Sie mit D3DXUVAtlasCreate einen Texturatlas. Der resultierende Texturatlas würde etwa wie die folgende Abbildung aussehen.

Abbildung eines Atlas für ein Zwergmodell

Der Atlas hat 22 Diagramme und eine maximale Dehnung von 0,994.

Sehen Sie sich nun das texturierte Modell an, um zu sehen, wie gut der Texturatlas der Geometrie zugeordnet ist. Laden Sie dazu das Modell in das Viewer-Tool:

  • Öffnen Sie das Viewer-Tool über die DirectX-Hilfsprogramme.
  • Laden Sie die X-Datei, indem Sie auf die Schaltfläche Öffnen klicken.
  • Aktivieren Sie die Option Zum Anzeigen von Falten, indem Sie auf die Schaltfläche Ansicht klicken und im Popup die Option Creases (Creases) auswählen.

Die folgende Abbildung zeigt, was im Viewer-Tool angezeigt werden sollte.

Abbildung eines texturierten Gitters im Viewer-Tool

Jede Linie ist eine Krebung, die eine benachbarte Kante zwischen zwei Diagrammen im Texturatlas darstellt. Die Anzahl der vom Algorithmus generierten Diagramme wird durch leichte Unterschiede verursacht, die möglicherweise auf Diskontinuitäten in den Normals zurückzuführen sind. Diese kleinen Unterschiede können durch Das Schweißen von Daten verringert werden, d. h. die Erzwingung von Daten, die nahezu gleich sind. So schweißen Sie die Normal- und Hautgewichte:

  • Führen Sie das DirectX Ops-Tool (dxops.exe) mit der folgenden Befehlszeile auf dem Gitter aus (ersetzen Sie "modelName.x" durch den Namen Ihres Modells):
    Dxops.exe -s "load 'modelName.x'; Optimize n:2.01 w:2.01 uv0:0.01;  save 'newModelName.x';"
    

Dadurch werden die Normal- und Skingewichte verglichen, und wenn sie sich im Wert um weniger als 2,01 unterscheiden, werden die Daten gleichgestellt. Die folgenden Abbildungen zeigen eine Nahaufnahme des Auges, um die Falten vor dem Schweißen (links) und die Falten nach dem Schweißen (rechts) zu sehen:

Abbildung von Falten vor dem Schweißen Abbildung von Falten nach dem Schweißen

Abbildung 7: Entfernen von Falten durch Schweißen

In diesem Beispiel wurden beim Schweißen 86 Scheitelpunkte aus dem Eingabegitter entfernt. Mit weniger Falten im Gitter können Sie den Atlas regenerieren, wie die folgende Abbildung zeigt.

Abbildung des neuen Atlas mit entfernten Falten

Der Atlas hat nur 7 Diagramme und eine maximale Dehnung von ca. 0,0776. Der neue Atlas passt nun in eine kleinere Textur (etwa 30 % kleiner in diesem Beispiel).

Packen von Diagrammen in einen Atlas

Nachdem ein Gitter in einzeln parametrisierte Diagramme partitioniert wurde, müssen die Diagramme effizient in eine einzelne Texturkarte gepackt werden. Dies wird als zweiter Schritt von D3DXUVAtlasCreate ausgeführt oder kann explizit durch Aufrufen von D3DXUVAtlasPack aufgerufen werden.

Gepackte Diagramme werden durch eine vom Benutzer angegebene Bundnetzbreite getrennt. Die Breite des Rinns ist der Umfang der Trennung zwischen Diagrammen und ermöglicht bilineare Interpolation und Mip-Mapping, um das Rendern von Artefakten an Diagrammgrenzen zu vermeiden. D3DX bietet eine Schnittstelle zum automatischen Ausfüllen dieser Dachrinnen. Weitere Informationen finden Sie unter ID3DXTextureGutterHelper .

Integrieren von UVAtlas in Ihre Pipeline

Diese Funktionen können nicht nur vor der Texturmalerei aufgerufen werden, sie können auch in eine automatisierte Kunstpipeline integriert werden. Beispielsweise kann ein UVAtlas-Aufruf automatisch ausgegeben werden, nachdem ein Medienobjekt aktualisiert wurde, bevor eine PRT-Simulation oder ein normaler Zuordnungsdurchlauf durchgeführt wird. Dadurch wird eine manuelle Reparatur der UV-Zuordnung eines Objekts vermieden, wenn die Topologie des Gitters geändert wurde.

Beispiel für die Verwendung der UVAtlas-Funktionen finden Sie im UV Atlas Command-Line Tool (uvatlas.exe ).

Erweiterte Themen