Condividi tramite


Texture Wrapping (Direct3D 9)

In breve, il wrapping delle texture cambia il modo fondamentale in cui Direct3D rasterizza i poligoni texturizzati usando le coordinate della texture specificate per ogni vertice. Durante la rasterizzazione di un poligono, il sistema esegue l'interpolazione tra le coordinate della trama in ogni vertice del poligono per determinare i texel da usare per ogni pixel del poligono. Normalmente, il sistema considera la trama come un piano 2D, interpolando nuovi texel prendendo la route più breve dal punto A all'interno di una trama al punto B. Se il punto A rappresenta la posizione u, v (0,8, 0,1) e il punto B è in corrispondenza (0,1,0,1), la linea di interpolazione è simile al diagramma seguente.

diagramma di una linea di interpolazione tra due punti

Si noti che la distanza più breve tra A e B in questa illustrazione viene eseguita approssimativamente attraverso il centro della trama. L'abilitazione del wrapping delle coordinate u-texture o v-texture cambia il modo in cui Direct3D percepisce il percorso più breve tra le coordinate della trama nella direzione u e nella direzione v. Per definizione, il texture wrapping fa sì che il rasterizzatore prenda il percorso più breve tra i set di coordinate texture, presupponendo che 0,0 e 1,0 siano coincidenti. L'ultimo bit è la parte difficile: si può immaginare che l'abilitazione del texture wrapping in una direzione porta il sistema a considerare una texture come se fosse avvolta intorno a un cilindro. Si consideri ad esempio il diagramma seguente.

diagramma di una trama e due punti avvolti intorno a un cilindro

La figura precedente mostra come il processo di wrapping nella direzione u influisce sul modo in cui il sistema interpola le coordinate di texture. Usando gli stessi punti dell'esempio per le trame normali o non rivestite, è possibile osservare che il percorso più breve tra i punti A e B non attraversa più il centro della trama; ora passa attraverso il confine dove 0,0 e 1,0 si incontrano. Il wrapping nella direzione v è simile, ad eccezione del fatto che avvolge la trama intorno a un cilindro che si trova sul lato. Il wrapping sia nella direzione u che nella direzione v è più complesso. In questa situazione, è possibile immaginare la trama come un toro, o una ciambella.

L'applicazione pratica più comune per il wrapping delle texture consiste nell'eseguire il mapping dell'ambiente. In genere, un oggetto con trama con una mappa dell'ambiente appare molto riflettente, mostrando un'immagine speculare dell'ambiente circostante dell'oggetto nella scena. Per il bene di questa discussione, immagine di una stanza con quattro pareti, ognuna dipinta con una lettera R, G, B, Y e i colori corrispondenti: rosso, verde, blu e giallo. La mappa dell'ambiente per una stanza così semplice potrebbe essere simile alla figura seguente.

illustrazione di strisce verticali di rosso, verde, blu e giallo

Immaginate che il soffitto della stanza sia tenuto in piedi da un pilastro perfettamente riflettente, a quattro lati. Il mapping della texture dell'ambiente al pilastro è semplice; far sembrare il pilastro come se riflettesse le lettere e i colori non è così facile. Il diagramma seguente mostra una cornice di filo del pilastro con le coordinate di trama applicabili elencate nei vertici superiori. La cucitura in cui l'avvolgimento attraverserà i bordi della trama è indicata con una linea tratteggiata.

diagramma di un rettangolo con una linea tratteggiata che lo divide a metà

Con il wrapping abilitato nella direzione u, il pilastro con trama mostra i colori e i simboli della mappa dell'ambiente in modo appropriato e, nella parte anteriore della trama, il rasterizzatore sceglie correttamente il percorso più breve tra le coordinate della trama, presupponendo che le coordinate u 0.0 e 1.0 condividono la stessa posizione. Il pilastro con trama è simile alla figura seguente.

illustrazione di un pilastro costituito da quadranti rossi, verdi, blu e gialli

Se la disposizione delle trame non è abilitata, il rasterizzatore non esegue l'interpolazione nella direzione necessaria per generare un'immagine credibile e riflessa. Invece, l'area davanti al pilastro contiene una versione compressa orizzontalmente dei texel tra le coordinate u 0.175 e 0.875, mentre passano attraverso il centro della trama. L'effetto di avvolgimento è rovinato.

Uso del wrapping delle trame

Per abilitare il wrapping delle trame, chiamare il metodo IDirect3DDevice9::SetRenderState come illustrato nell'esempio di codice seguente.

d3dDevice->SetRenderState(D3DRS_WRAP0, D3DWRAPCOORD_0);

Il primo parametro accettato da IDirect3DDevice9::SetRenderState è uno stato di rendering da impostare. Specificare uno dei valori enumerati da D3DRS_WRAP0 a D3DRS_WRAP7 che indicano per quale livello di texture impostare il wrapping. Specificare i flag D3DWRAPCOORD_0 fino a D3DWRAPCOORD_3 nel secondo parametro per abilitare il wrapping della texture nella direzione corrispondente, o combinarli per abilitarlo in più direzioni. Se si omette un flag, il rivestimento della trama nella direzione corrispondente è disabilitato. Per disabilitare il wrapping della texture per un set di coordinate di texture, impostare il valore dello stato di rendering corrispondente su 0.

Non confondere la disposizione delle trame con le modalità di indirizzamento delle trame denominate in modo analogo. Il wrapping delle texture viene eseguito prima dell'indirizzamento delle texture. Assicurarsi che i dati di wrapping della trama non contengano coordinate di trama al di fuori dell'intervallo di [0,0, 1,0] perché questo produrrà risultati non definiti. Per altre informazioni sull'indirizzamento delle trame, vedere modalità di indirizzamento delle trame (Direct3D 9).

Mappa di spostamento con avvolgimento

Le mappe di spostamento vengono interpolate dal motore di tassellazione. Poiché non è possibile specificare la modalità di wrapping per il motore di tassellazione, non è possibile eseguire il wrapping delle texture con le mappe di spostamento. Un'applicazione è in grado di utilizzare un set di vertici che consente all'interpolazione di avvolgersi in qualsiasi direzione. L'applicazione può anche specificare l'interpolazione da eseguire come semplice interpolazione lineare.

trame Direct3D