Osservate l'immagine:
Una texture procedurale è esattamente questo, tante texture disposte una sull'altre. Questo particolare tipo di texture presenta interessanti caratteristiche. Innanzittutto è l'unica ad essere effettivamente a tre dimensioni e anche i modelli che useranno queste tecniche dovranno possedere coordinate texture a tre dimensioni: TU, TV e TW. Quest'ultima gestisce la componente in altezza della pila. Il comportamente di TW segue quello delle normali texture ossia se si vuole prendere la texture nella sua interezza si va da 0 (punto più basso) a 1. Da qui nasce la particolare caratteristica che la rende molto interessante: se la coordinate TW corrisponde ad una zona a metà fra 2 texture il risultato in quel punto sarà una interpolazione tra le 2. Quindi posizionando opportunamente le coordinate potrete quindi variare il colore in ogni punto del modello mantenendo però grazie a TU e TW il posizionamento orizzontale e verticale. Il risultato è ad esempio questo
Con le 6 texture e variando TW in base all'altezza ho disposto le texture creando un sistema altimetrico. Solo 6 texture invece di un lavoro enorme in fase di creazione della montangna. Le texture procedurali non servono solamente a creare monti, canyon ed effetti del terreno (che già non è poco, pensate di variare la vegetazione del terreno con la sola coordinata TW). Con un saggio utilizzo e soprattutto con l'animazione dei vertici (quindi vertex shader più che consigliato), potete creare degli effetti veramente incredibili semplicemento scorrendo le coordinate TW. Nonostante le texture procedurali esistano da molto non è da tantissimo che queste sono supportate dagli hardware. Infatti la stragrande maggioranza degli editor 3D ha sempre usato tecniche di calcolo per compensare questo problema. Quindi in data odierna sono poche le schede che supportano tali funzionalità (addirittura anche qualche modello di GForce4). Una texture procedurale è gestita tramite un oggetto Direct3DVolumeTexture8. Quindi la prima cosa da fare è controllare se è possibile creare queste texture.
Manager.CheckDeviceFormat(0, DeviceType.Hardware, Format.X8R8G8B8, 0, ResourceType.VolumeTexture, Format.X8R8G8B8)
Questo codice restituisce un booleano che indica se la scheda è compatibile con la texture volumetrica nel formato X8R8G8B8 (i formati sono pressapoco gli stessi).
La texture volumetrica va creata dal nulla e riempita con colori estratti da altre texture o elaborate da codice tramite accesso diretto alla memoria.
Dim volTex As VolumeTexture
volTex = New VolumeTexture(device, 128, 128, 8, 1, Format.X8R8G8B8, Pool.Managed)
Con questo codice avete creato una texture 128 x 128 a 8 strati. Consiglio di inserire strati di numero in potenza di 2 (2,4,8,16) perchè più compatibile.
Accedete alla memoria
Dim data As Integer(,,) = CType(volTex.LockBox(GetType(Integer), 0, 0, 8, 128, 128), Integer(,,))
'elabora colori
volTex.UnlockBox(0)
L'array data di tipo integer a 3 dimensioni (W,V,U) contiene i colori nelle tre direzioni della texture. Se caricate da texture i colori (dato che vi ho insegnato come caricarli separatamente potete riunirli con l'oggetto color) caricateli strato per strato nelle ultime 2 variando ad ogni strato la W.
Il formato da usare è
Structure vertex3
Dim p As vector3
Dim n As Vector3
Dim tu As Single
Dim tv As Single
Dim tw As Single
End Structure
Dim Vformat As VertexFormats = VertexFormats.Position Or VertexFormats.Normal Or VertexFormats.Texture1 Or VertexTextureCoordinate.Size3(0)
Con questo usate l'istruzione clone per convertire la mesh in questo formato. La coordinata tw sarà appunto la coordinata texture per gli strati. Vi lascio all'esempio:
Esempio VB.Net
Esempio C#