Inserendo texture nel device salta immediatamente all'occhio la presenza di un indice nell'istruzione setTexture. Una delle possibilità offerte da DirectX ormai da molte versioni è proprio la possibilità di poter inserire molte texture sull'oggetto e regolarne il comportamento. L'utilizzo di texture multiple è alla base di numerosissimi effetti, molti dei quali estremamente complessi e spettacolari. Potete ad esempio aggiungere ad esempio riflessi, sommare gli effetti di più texture e, come vedremo più avanti, generare il bump mapping ed effetti di riflessione dell'ambiente circostante. Uno degli esempi meglio riusciti è un demo della microsoft che mostra un delfino che nuota con i riflessi dell'acqua sull'animale e sul terreno.
L'effetto che sembra così spettacolare è semplicemente una sovrapposizione di texture contenenti numerosi riflessi in seguenza sulle texture del delfino e del terreno. Quasi banale credetemi. Ufficialmente DirectX supporta fino a 8 texture contemporaneamente ma in realtà non tutte le schede sono compatibili con un numero così elevato (alcune anche molto recenti si fermano appena a 4).
Se la vostra scheda non supporta un numero di texture semplicemente non le mostrarà (non genererà errori quindi).
Codice
Usare texture multiple è molto semplice:
Create un oggetto (per esempio una mesh) e inserite le texture nel device con setTexture con indici consecutivi (quindi 0, 1, 2, etc).
Ora dovete solo settare le preferenza tramite queste opzioni (che sono veramente tante).
Coordinate
device.TextureState(n).TextureCoordinateIndex = m
Ogni texture può avere differenti coordinate texture e di conseguenza occorre specificare quali sono. Per defaul la prima texture, quella normale con indice 0, ha le coordinate impostate su 0 ovvero sul primo set di texture. Se ad esempio impostate il tipo di vertice con due set di coordinate texture potete settare le texture agli indici 0 o 1. Se poi volete usare lo stesso set basta impostare il valore a 0 per tutti gli indici.
device.TextureState(1).TextureCoordinateIndex = 0
Con questa ad esempio la texture messa all'indice 1 ha le stesse coordinate della prima texture.
Operazioni
device.TextureState(n).ColorOperation
Questa è l'istruzione che imposta il comportamento della texture n. Il valore di default è modulate per la prima texture (quella con indice 0) e disable per le altre. Le istruzioni sono in realtà delle operazioni che vengono fatte su tre valori di colori (possiamo addirittura specificare se tali valori verranno presi dalla texture, dal materiale o da altro). Per il momento li chiamerò semplicemente arg1, arg2 e arg 3 mentre S sarà il colore risultato.
Operazioni
Subtract: effettua una sottrazione tra i colori di arg1 e arg2
Lerp: effettua una interpolazione lineare tra i colori;
S=arg1*arg2+(1-arg1)*arg3
MultiplyAdd: semplicemente arg1+arg2*arg3
DotProduct3: il colore finale sarà la somma dei singoli prodotti dei tre colori
BumpEnvironmentMapLuminance, BumpEnvironmentMap: questi valori servono per il bump mapping argomento di altri tutorial
ModulateInvColorAddAlpha: Vengono eseguiti calcoli sfruttando i singoli colori:
Sargb=(1-arg1rgb) x arg2rgb +arg1a
ModulateInvAlphaAddColor: come sopra
Sargb=(1-arg1a) x arg2rgb +arg1rgb
ModulateColorAddAlpha
Sargb=arg1rgb x arg2rgb +arg1a
ModulateAlphaAddColor
Sargb=arg1a x arg2rgb +arg1rgb
PreModulate: modula la texture con la successiva
AddSmooth: somma gli argomenti 1 e 2 e poi sottrae il prodotto
AddSigned: esegue la somma degli argomenti e sottrae 0.5 (i colori sono interpretati da 0 a 1)
AddSigned2X: come sopra ma il tutto è per 2
Add: somma gli argomenti 1 e 2
Modulate: moltiplica gli argomenti 1 e 2
ModulateX2: poi li moltiplica x 2
ModulateX4: o per 4
SelectArg2: solo il secondo argomento
SelectArg1: solo il primo
Disable: disattiva
Argomenti
Gli argomenti da usare per i tre valori sono:
device.TextureState(1).ColorArgument1
device.TextureState(1).ColorArgument2
device.TextureState(1).ColorArgument0 (al posto di 3).
I valori sono:
Current : il colore è quello presente fino all'inserimento di questa texture
Diffuce : il colore è il diffuse del materiale
Specular : il colore è lo specular
Texture : il colore è quello di questa texture.
I default sono in Texture, Current per gli arg1 e 2, non specificato per arg0.
Come si adoperano questi valori?
Fate prove e prove e prove e solo allora capirete il funzionamento. Vi lascio all'esempio che fa alcuni esempi di multitexture tra 2 texture alternando le operazioni sulla seconda. Buon divertimento!
Esempio VB.Net
Esempio C#