\\ Home : Articoli : Stampa
MultiTexture
Di RobyDx (del 26/01/2007 @ 21:04:15, in DirectX9, linkato 2016 volte)

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.

Esempio Multitexture

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#