Condividi tramite


Uso di UVAtlas (Direct3D 9)

Nota

UVAtlas è stato originariamente fornito nella libreria D3DX9 deprecata. La versione più recente è disponibile in UV Atlas Command-Line Tool (uvatlas.exe).

Molte tecniche di rendering e generazione di contenuti richiedono una mappa univoca e non sovrapposta di un segnale 2D (ad esempio una trama) in una mesh. Tali tecniche includono:

  • Mapping normale/spostamento
  • Simulazioni PRT nello spazio delle trame e mappe leggero
  • Pittura a superficie
  • Illuminazione dello spazio delle trame

La generazione manuale di un mapping UV univoco richiede spesso molto tempo e noioso; ciò è particolarmente vero quando si desidera che la geometria di input sia complessa e l'utilizzo efficiente/a bassa distorsione dello spazio delle trame. La figura seguente mostra una mesh di esempio e il corrispondente atlas della trama.

Mostra una mesh di esempio e il corrispondente atlas delle trame.

Questo esempio mostra una mesh (a sinistra) e la mappa normale dello spazio UV corrispondente (a destra). Si noti che l'atlas delle trame contiene diversi gruppi o cluster di dati; ogni cluster viene chiamato grafico e nell'esempio precedente vengono visualizzati i dati normali per una parte della mesh.

Le API UVAtlas D3DX generano automaticamente un atlas di trama ottimale e non sovrapposto. Le API forniscono parametri di input che consentono di:

  • Ridurre al minimo l'estensione della trama, la distorsione e il sottocampionamento.
  • Ottimizzare la densità di compressione dello spazio delle trame per un uso efficiente della memoria.
  • Fornire un campionamento uniforme sulla mesh, riducendo al minimo le discontinuità nella frequenza di campionamento.

Funzionamento di UVAtlas

Le API UVAtlas (vedere Funzioni UVAtlas) generano un atlas delle trame partizionando una superficie in grafici e confezionando i grafici in un atlas delle trame. Usare D3DXUVAtlasPartition e D3DXUVAtlasPack per eseguire questi passaggi separatamente; oppure usare D3DXUVAtlasCreate per partizionare, parametrizzare e comprimere in una singola chiamata.

Partizionamento e parametrizzazione di una mesh

Prima di tutto, la mesh viene partizionata in grafici, quindi ogni grafico viene parametrizzato nel proprio spazio UV [0,1]. Un cilindro può essere parametrizzato da un grafico; una sfera d'altra parte richiederà due grafici, come illustrato nella figura seguente.

illustrazione di una sfera partizionata in due grafici

Una mesh che può essere parametrizzata con un singolo grafico è classificata come "omeomorfica in un disco", ovvero è possibile distribuire un disco infinitamente flessibile e infinitamente estendibile sul grafico e coprire perfettamente la geometria. Questa estensione, denominata homeomorfismo, è una funzione bidirezionale; ciò significa che è possibile passare da una parametrizzazione all'altra senza perdere informazioni.

Pochissime mesh reali possono essere parametrizzate in due dimensioni senza separare la mesh in cluster o grafici. La figura seguente mostra un'altra mesh di esempio e il corrispondente atlas delle trame.

Mostra una mesh di esempio con forme diverse e il corrispondente atlas della trama.

Esistono due parametri che determinano il numero di grafici creati:

  • Numero massimo di grafici consentiti per l'atlas
  • Quantità massima di estensione consentita per ogni grafico

La quantità di estensione determinerà il numero di grafici generati e la qualità complessiva del campionamento. L'estensione varia da 0,0 (nessuna estensione) a 1,0 (qualsiasi quantità di estensione). D3DXUVAtlasCreate e D3DXUVAtlasPartition restituiscono l'estensione massima generata dall'algoritmo. La figura seguente mostra un'altra mesh di esempio e il corrispondente atlas delle trame.

illustrazione di una mesh di esempio e del corrispondente atlas di trama

Uso di tensori metrici integrati per controllare la parametrizzazione

La definizione delle priorità dello spazio delle trame può essere specificata in base al triangolo. È possibile fornire tensori metrici integrati per controllare il modo in cui i triangoli vengono estesi nell'atlas dello spazio delle trame risultante. IMT può essere specificato direttamente o calcolato in base a un segnale di input usando le funzioni di calcolo IMT D3DX. Un tensore di metriche integrato (o IMT) è una matrice 2x2 simmetrica che descrive come un triangolo viene esteso nell'atlas. Ogni IMT è definito da 3 float, chiamarli (a,b,c). Possono essere disposti in una matrice 2x2 simmetrica come segue:

a b
b c

L'IMT può quindi essere usato per trovare la distanza tra due vettori. Dati due vettori v1 e v2, dove :

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

La distanza tra v1 e v2 può essere calcolata come segue:

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

In altre parole, il vettore (s,t) potrebbe essere la grandezza dell'estensione in una direzione arbitraria nello spazio u-v. In questo caso, il vettore s è una direzione dal primo al secondo vertice e t è il prodotto incrociato del normale e s. Ad esempio:

(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

IMT può essere specificato direttamente o calcolato in base a un segnale di input usando le funzioni di calcolo IMT D3DX: D3DXComputeIMTFromPerVertexSignal, D3DXComputeIMTFromPerTexelSignal, D3DXComputeIMTFromSignal e D3DXComputeIMTFromTexture_graphics.

Specificare i dati IMT direttamente se si vuole controllare la modalità di allocazione dello spazio delle trame ai singoli triangoli. In questo modo, allocare più area nell'atlas ad aree importanti di una mesh (ad esempio il logo del viso o del petto di un personaggio o aree di una scena vicino al percorso a piedi di un giocatore). Specificando i multipli di IMT della matrice di identità, i triangoli risultanti verranno ridimensionati in modo uniforme nello spazio delle trame.

Ad esempio, data una mappa normale ad alta risoluzione, è possibile calcolare IMT per fornire più spazio trama alle aree del segnale con frequenza più elevata nella mappa normale. I triangoli "flat" (mappati alle aree costanti della mappa normale originale) riceveranno meno spazio trama. I triangoli che contengono una grande quantità di dettagli della mappa normale riceveranno più aree di trama nel risultato finale. È quindi possibile ricampionare la mappa normale in una trama più piccola ma mantenere i dettagli oppure ricompilare la mappa normale con il mapping UV più ottimale.

Uso dei dati di adiacenza per le crese specificate dall'utente

Le informazioni sull'adiacenza definite dall'utente possono essere fornite alla funzione di partizionamento per descrivere le pieghe predefinite nella mesh e quindi definire un limite del grafico tra i visi adiacenti. Si tratta di un modo semplice per il chiamante di specificare il partizionamento del grafico come input nell'algoritmo, che affina ulteriormente i grafici per portare l'estensione al massimo consentito.

Esempio

Questo esempio illustra come usare le API UVAtlas e il Visualizzatore DirectX (Dxviewer.exe) per trovare e correggere le discontinuità nel modello che possono influire notevolmente sulle dimensioni dell'atlas della trama. È possibile ottenere Dxviewer.exe e ottenere informazioni su di esso da DirectX SDK. Dxviewer.exe è stato rimosso da DirectX SDK dopo la versione di agosto 2009, quindi per ottenerlo è necessario almeno DirectX SDK di agosto 2009. Per informazioni su DirectX SDK, vedere Dove è DirectX SDK?.

Si supponga di aver iniziato con un modello nel software di generazione di contenuti preferito (in questo esempio viene usato un modello head nano creato in Maya). Esportare il modello con trama in un file con estensione x e creare un atlas con trama con D3DXUVAtlasCreate. L'atlas della trama risultante sarà simile alla figura seguente.

illustrazione di un atlas per un modello nano

L'atlas ha 22 grafici e un tratto massimo di 0,994.

Esaminare ora il modello con trame per vedere il livello di mapping dell'atlas delle trame alla geometria. A tale scopo, caricare il modello nello strumento visualizzatore:

  • Aprire lo strumento visualizzatore dalle utilità DirectX.
  • Caricare il file con estensione x facendo clic sul pulsante Apri.
  • Abilitazione dell'opzione di visualizzazione crea facendo clic sul pulsante visualizza e selezionando Crea dal popup.

La figura seguente mostra ciò che dovrebbe essere visualizzato nello strumento visualizzatore.

illustrazione di una mesh con trama nello strumento visualizzatore

Ogni linea è una piega che è un bordo adiacente tra due grafici nell'atlas della trama. Il numero di grafici generati dall'algoritmo è causato da lievi differenze forse a causa delle discontinuità nelle normali. Queste piccole differenze possono essere ridotte dai dati di saldatura, ovvero forzando i dati quasi uguali ad essere uguali. Per saldare le normali e i pesi della pelle:

  • Eseguire lo strumento DirectX Ops (dxops.exe) con la riga di comando seguente nella mesh (sostituendo 'modelName.x' con il nome del modello):
    Dxops.exe -s "load 'modelName.x'; Optimize n:2.01 w:2.01 uv0:0.01;  save 'newModelName.x';"
    

In questo modo vengono confrontati i pesi normali e skinweight e in cui differiscono per valore inferiore a 2,01, i dati vengono resi uguali. Le illustrazioni seguenti mostrano un primo piano dell'occhio per vedere le pieghe prima della saldatura (a sinistra) e le pieghe dopo la saldatura (a destra):

illustrazione delle pieghe primadella saldatura illustrazione delle pieghe dopo la saldatura

Figura 7: Rimozione delle pieghe tramite saldatura

In questo esempio la saldatura ha rimosso 86 vertici dalla mesh di input. Con un minor numero di pieghe nella mesh, è possibile rigenerare l'atlas, come illustrato nella figura seguente.

illustrazione del nuovo atlas con pieghe rimosse

L'atlas ha solo 7 grafici e un tratto massimo di circa 0,0776. Il nuovo atlas ora si adatta a una trama più piccola (circa il 30% più piccola in questo esempio).

Creazione di grafici in un atlas

Dopo che una mesh è stata partizionata in grafici con parametri singoli, i grafici devono essere compressi in modo efficiente in una singola mappa di trama. Questa operazione viene eseguita come secondo passaggio di D3DXUVAtlasCreate o può essere richiamata in modo esplicito chiamando D3DXUVAtlasPack.

I grafici compressi sono separati da una larghezza di gutter specificata dall'utente. La larghezza della gutter è la quantità di separazione tra grafici e consente l'interpolazione bilineare e il mapping mip per evitare il rendering di artefatti ai limiti del grafico. D3DX fornisce un'interfaccia per l'inserimento automatico di questi gutter, vedere ID3DXTextureGutterHelper per altre informazioni.

Integrazione di UVAtlas nella pipeline

Oltre a essere richiamato dall'artista prima della pittura di trama, queste funzioni possono essere integrate in una pipeline di arte automatizzata. Ad esempio, una chiamata UVAtlas può essere rilasciata automaticamente dopo l'aggiornamento di un asset, prima di eseguire una simulazione PRT o un passaggio di mapping normale. Ciò consente di evitare la necessità di ripristinare manualmente manualmente il mapping UV di un oggetto se la topologia della mesh è stata modificata.

Vedere lo strumento UV Atlas Command-Line (uvatlas.exe) ad esempio l'utilizzo delle funzioni UVAtlas.

Argomenti avanzati