Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
questa funzione chiamata dal Form1_Load esegue la prima operazione di disegno : crea uno
schermo nero. Anche se sembra sbagliato bisogna entrare in un loop infinito se volete creare un
gioco. In questo modo potete far girare centinaia di volte il codice. Ognuna di queste sar un
fotogramma (ecco cosa significa che un gioco gira a 30 Fps). Ricordate di inserire DoEvents che
serve ad avere sempre il controllo del programma (ad esempio per chiudere una finestra).
Passiamo al dettaglio.
device.Clear 0, ByVal 0, D3DCLEAR_TARGET, D3DColorRGBA(0, 0, 0, 0), 1#, 0 'questa
funzione pulisce tutto lo schermo rendendolo del colore espresso in D3DColorRGBA( cambiate i
numeri da 0 a 255 per modificare il colore). Per ora non vi spiego il resto ma vi anticipo che qui vi
una delle cose pi belle di DirectX8 : da qui si pu creare molto facilmente un gioco in SplitScreen
(ad esempio uno sparatutto in soggettiva con 4 persone che giocano sullo stesso schermo). Io ci
sono riuscito e poi ve lo spiegher.
device.BeginScene 'inizia il rendering
'tutto il codice che deve eseguire le varie fasi di rendering
'(ossia il disegno degli elementi 2D\3D va qui
device.EndScene 'fa terminare il rendering
device.Present ByVal 0, ByVal 0, 0, ByVal 0 'invia l'immagine al monitor anche qui le opzioni
permettono di decidere quale zona del nostro mondo 3D mandare in una zona dello schermo. In
questo caso le opzioni sono di default e inviano tutta la zona allo schermo.
DoEvents' per non far bloccare il PC
GoTo 1 (sapete come si adopera altrimenti leggetevi la guida)
Chiusura
Un programma Dx non si pu semplicemente chiudere, se lo fate vi potrebbe rimanere l'ultima
immagine sullo schermo o bloccarsi il computer. Per questo bisogna fare alcune cose.Aggiungete un
evento doppio click al form (questo codice).
Private Sub Form_DblClick()
'termina il programma
Set DX = Nothing
Set D3D = Nothing
Set device = Nothing
End
End Sub
Poich avete inserito l'istruzione DoEvents nel loop il form risponder all'evento ma per chiudere
definitivamente il programma bisogna inserire End in Form_DblClick. Appena farete doppio click
sullo schermo il programma si chiuder.
Fate partire il programma e lo schermo vi diventer completamente nero; no panic il programma
funziona cambiate i valori del colore nel device.Clear e lo schermo cambier colore.
Spero non sia stato difficile e che non mi sia dilungato troppo ma volevo essere chiaro il pi
possibile.Se non lo sono stato avvertitetimi e mi tagler le vene(neanche per sogno)!
Vi d un p di opzioni da modificare nel Load (FATE TANTI ESPERIMENTI SOLO COSI'
CAPIRETE IL MECCANISMO).
D3DWindow.SwapEffect = D3DSWAPEFFECT_FLIP
Lasciatela cos rappresenta solo il modo con cui l'immagine trasferita al monitor; questa l'
opzione pi compatibile
D3DWindow.Windowed = 0
Se gli date il valore 0 il programma va a pieno schermo. Se gli date invece il valore 1 andr in una
finestra. Per far ci dovete modificare un p di cose per.
D3DWindow.BackBufferCount = 1
Numero dei backbuffer : pi alto pi andr veloce a discapito della memoria video. Di solito si
usa 1 o 2 perch 3 non supportato da quasi nessuna scheda
D3DWindow.BackBufferFormat = D3DFMT_R5G6B5 'colore
Questa una costante che indica i bit della scheda video. Ce ne sono un' infinit molte delle quali
non supportate. Per vedere quanti bit sono dovete fare la somma dei numeri vicino al colore
(R5G6B5=16).
D3DWindow.BackBufferWidth = 800
D3DWindow.BackBufferHeight = 600
Semplicemente la risoluzione dello schermo in larghezza (800) e altezza(600).Potete dargli una
qualsiasi risoluzione valida. Le pi comuni sono 640x480 800x600 320x240 1024x768 ma in realt
ce ne sono un'infinit per ogni scheda.
D3DWindow.hDeviceWindow = Me.hWnd
qui dovete dargli la propriet hWnd del Form (la potete memorizzare anche in una variabile long)
D3DWindow.EnableAutoDepthStencil = 1
D3DWindow.AutoDepthStencilFormat = D3DFMT_D16 '16 bit Z-Buffer
Queste lasciatele anche cos indicano solo il formato del Zbuffer (ne parlo dopo) potete provare con
D24 o D32 a seconda della scheda.
Attenzione se provate a cambiare alcune cose potrebbe darvi errori di automazione. LA COSA
NON DANNEGGIA IL PC MA IO NON MI RITENGO RESPONSABILE DI NESSUN DANNO,
tutte queste cose le ho trovate anche in altri siti e non mi hanno mai danneggiato niente (al
massimm si resetta il PC. Qui trovate il codice di esempio. Fatelo partire e chiudetelo con doppio
click.
L'enumerazione semplicemente una interrogazione del computer su ci che in grado di fare. Con
un programma di enumerazione potrete creare ad esempio una lista con le risoluzioni possibili o
sapere se la scheda supporta una determinata operazione. La cosa sembra noiosa ma fondamentale
perch non detto che un programma creato su un Pc giri su un altro. Se avrete una lista con le
capacit della scheda video di chi esegue il programma potrete far scegliere a chi lo usa la
risoluzione e le caratteristiche di visualizzazione. Questo il codice di un programma di
enumerazione che non fa partire lo schermo Dx. Sar vostro esercizio montare la cosa insieme
(ovviamente prima di far partire la prima schermata del gioco).
Caricate la libreria dal menu riferimenti come nel precedente esempio.Visualizzate il form e inserite
2 listBox come in figura
End Sub
In questa routine ho dichiarato una nuova variabile ModeTemp che memorizza le caratteristiche di
uno schermo (risoluzione, colore e fraquenza del monitor che non useremo). La prima cosa che
facciamo chiedere quanti tipi di risoluzioni abbiamo memorizzando in nModes (semplice variabile
numerica di tipo long) il valore dato da d3d.GetAdapterModeCount(0). Ora per con un ciclo FOR
controlliamo se ogni modalit supportata e se si la aggiungiamo alla lista ( per un vero gioco
potreste memorizzarle ed usarle ad esempio per il cambio di risoluzione. Per ogni risoluzione
memorizziamo i dati nella variabile modeTemp tramite l'istruzione
Call d3d.EnumAdapterModes(0, I, ModeTemp)
Quindi usiamo un select case in modo da selezionare solo i colori che ci interessano (le modalit si
trovano tramite costanti in ModeTemp.Format e per completezza ho inserito tutte le possibili nei
vari CASE). A questo punto se
d3d.CheckDeviceType(0, D3DDEVTYPE_HAL, ModeTemp.Format, ModeTemp.Format, False)
e uguale a D3D_OK allora la modalit supportata e l'aggiungiamo all'elenco List1. Il
checkDeviceType accetta vari opzioni : questi sono : 0 indica che si usa la scheda video principale;
D3DDEVTYPE_HAL indica che si vuole usare l'accellerazione grafica (D3DDEVTYPE_REF
indica senza accellerazione); ModeTemp.Format indica il colore e false indica che si usa la modalit
pieno schermo (con true si indica la modalit finestra). Una volta che questa funzione d come
risultato D3D_OK allora la risoluzione pu essere usata. Se volete potete usare il CheckDeviceType
anche soltanto per controllare una risoluzione assegnando da soli i valori a ModeTemp. Ora almeno
(per la risoluzione) potete creare un programma compatibile con tutte le schede video esistenti
baster controllare le varie risoluzioni e usare quella che interessa.
Finalmente cominciamo le cose serie: disegnare un oggetto 3D e farlo muovere nello spazio.
Scaricatevi subito il programma perch da ora in poi lavoriamo direttamente sul codice (che
comincer ad essere sempre pi lungo).In questo esempio creeremo un oggetto 3D (un cubo) e lo
faremo muovere in un ambiente 3D. Il cubo apparir bianco e senza ombre ma gi un importante
esempio perch tutto inizia da qui. Nel prossimo esempio lo coloreremo e vi aggiungeremo le
ombre. Attenzione la parte pi complicata questa, il resto sar fatto per aggiunte. Ricordate infine
che molte delle routine che spiego possono essere usate come codice fisso senza bisogno di
riscriverlo. Fra poco pubblicher il modulo mDx8a che contiene tutto un set di funzioni base per
ogni componente di directX. Ecco una miniatura del programma.
Gli oggetti 3D , ad esempio i calciatori di un gioco di calcio 3d, sono formati da un insieme di
triangoli nello spazio chiamati poligoni. Maggiore sar il numero dei triangoli e meglio potr essere
rappresentato il nostro oggetto ma contemporaneamente aumentar il carico di lavoro per il PC. Se
ad esempio un quadrato formato da due triangoli allora ne serviranno 12 per rappresentare un
cubo che di 6 facce mentre per una sfera ne occorreranno moltissimi per far apparire le curve
meno spigolose possibili. In directX gli oggetti sono memorizzati in array di vertici (D3DVERTEX)
che letti in ordine ricreeranno il nostro disegno.Per il nostro cubo servono 12 triangoli e quindi 36
vertici.Il tipo D3DVERTEX composto da 8 valori : X,Y,Z che rappresentano le coordinate dei
punti nello spazio, TU e TV che rappresentano la posizione delle texture (prossima lezione),
Nx,Ny,Nz che rappresentano il modo in cui la luce si riflette sull'oggetto.Nel Form ho creato una
routine che crea il nostro cubo e nel modulo una funzione per modificarne pi facilmente i
valori.Osservate che nel form ho dichiarato un array cubo(35) di D3DVERTEX che memorizza i 36
vertici che ci servono(da 0 a 35). IMPORTANTE i punti che formano i triangoli devono essere
consecutivi( 0,1,2 il primo triangolo,3,4,5 il secondo e cos via..) e soprattutto disposti in senso
orario nell'ordine in cui vogliamo vederli; se li disponiamo in senso antiorario non compariranno se
non vedendoli da dietro. Per esempio se invertiamo l'ordine dei vertici dei triangoli vedremo solo le
parti interne del cubo non l'esterno. Una volta creato il nostro array per l'oggetto che vogliamo
rappresentare baster chiamare l'oggetto device.DrawPrimitiveUp e passargli il nostro array per
veder comparire il nostro cubo. Ma dove comparir il cubo?. I vertici che impostiamo rappresentano
solo la posizione di partenza dell'oggetto : saremo noi a specificare il punto esatto in cui devono
trovarsi i vertici dell'oggetto nonch la grandezza e la rotazione. Per far cio usiamo un'altra variabile
definita come D3DMATRIX. Per chi non conoscesse le matrici aritmetiche una matrice una
griglia di numeri che in DX formata da 16 valori disposti su 4 file. Solo intervendo su questi
valori si possono modificare posizione, scala e rotazione di oggetti e telecamere. Intervenire
direttamente sui 16 valori difficilissimo ma per fortuna Dx offre varie istruzioni che ci aiutano.
Ora veniamo al codice.
Codice
Il codice, ora che inizia a diventare pi lungo diviso in un modulo contenente istruzioni che si
possono definire una volta sola (come l'istruzione che crea lo schermo o lo chiude) e nel classico
form che contiene il codice di controllo del programma.
Il Modulo
Qui scrivo tutto ci che c' nel modulo che ho denominato mdx8.
'parte grafica
Global DX As New DirectX8
Global D3DX As New D3DX8
'////////////////////////////////
'//////PARTE GRAFICA////////////
'//////////////////////////////
Global D3D As Direct3D8 'direct 3d
Global device As Direct3DDevice8 'spazio in cui si rappresenta
Global dSprite As D3DXSprite 'gestisce gli sprite
Global matWorld As D3DMATRIX 'rappresenta il mondo
Global matView As D3DMATRIX 'rappresenta la camera
Global matProj As D3DMATRIX 'rappresenta come la camera rappresenta il mondo
Const rad1 = 3.14 / 180 'il pi greco
Sub CreaSchermo(dxWidth As Long, dxHeight As Long, Fhwnd As Long)
Case vbKeyUp
posizioneY = posizioneY + 0.5
End Select
End Sub
Sub mainLoop()
Dim angoloX As Long
zoom = 1 'imposto la grandezza del cubo a 1
1
'faccio ruotare il cubo sull'asse y e se l'angolo supera i 360 allora lo reinposto a 0
angoloX = angoloX + 1
If angoloX > 359 Then angoloX = 0
device.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, D3DColorRGBA(0, 0, 0, 0),
1#, 0 'pulisce lo schermo
device.BeginScene 'inizia il rendering
'tutto il codice che deve eseguire le varie fasi di rendering
muoviObj zoom, zoom, zoom, 15, angoloX, 0, posizioneX, 0, posizioneY
device.DrawPrimitiveUP D3DPT_TRIANGLELIST, 12, cubo(0), Len(cubo(0))
device.EndScene 'fa terminare il rendering
device.Present ByVal 0, ByVal 0, 0, ByVal 0 'invia l'immagine al monitor
DoEvents
GoTo 1
End Sub
Sub creaCubo()
'lati
'1
cubo(0) = CreaD3Dv(-1, -1, -1, 0, 0, 0, 0, 0)
cubo(1) = CreaD3Dv(-1, 1, -1, 0, 0, 0, 0, 0)
cubo(2) = CreaD3Dv(1, 1, -1, 0, 0, 0, 0, 0)
cubo(3) = CreaD3Dv(1, 1, -1, 0, 0, 0, 0, 0)
cubo(4) = CreaD3Dv(1, -1, -1, 0, 0, 0, 0, 0)
Ci sono funzioni che aiutano in questi conti ma sono noiose e soprattutto lente per la memoria. La
funzione che ho creato (muoviObj) chiede tutti i valori per modificare la scala, la rotazione e la
traslazione di tutti gli assi. Questa risulta essere 2.5 volte pi veloce dei metodi di Dx. Se volete
capire come funziona leggetela attentamente.
Vertici
POINTLIST
LINELIST
LINESTRIP
TRIANGLELIST
TRIANGLESTRIP
TRIANGLEFAN
Su un oggetto 3D non facile far andare d'accordo tutti i vertici per questo gi su un cubo si fa
fatica a trovare le coordinate corrette figuriamoci su sfere o addirittura sul serpente ipotizzato
all'inizio. Tuttavia non c' problema perch non bisogner disegnarci sempre cos gli oggetti : nella
prossima lezione vi spiegher come creare disegni 3D da usare in visual basic con programmi tipo
3D Studio MAX o Lightwave. Per questo esempio ho creato come oggetto 3D un quadrato e ho
inpostato i valori cos:
Sub creaquadrato()
quadrato(0) = CreaD3Dv(-1, -1, 0, 0, 0, 0, 0, 1)
quadrato(1) = CreaD3Dv(-1, 1, 0, 0, 0, 0, 0, 0)
quadrato(2) = CreaD3Dv(1, 1, 0, 0, 0, 0, 1, 0)
quadrato(3) = CreaD3Dv(1, 1, 0, 0, 0, 0, 1, 0)
quadrato(4) = CreaD3Dv(1, -1, 0, 0, 0, 0, 1, 1)
quadrato(5) = CreaD3Dv(-1, -1, 0, 0, 0, 0, 0, 1)
End Sub
Ps se impostate le TU e TV con 2 anzich con 1 l'immagine sar disegnata 2 volte sul poligono.
Fate esperimenti con il programma.
Ora nel mainLoop noterete che ho inserito due volte le istruzioni di disegno proprio per disegnare
due quadrati ognuno con una texture diversa. Ora il lavoro finito : se volete che il prossimo
poligono sia disegnato con texture inserite prima del device.DrawPrimitiveUp questa istruzione
device.SetTexture 0, texture1
Questa serve a dire che al livello 0 bisogna inserire la texture memorizzata in texture1. Attenzione
se non si modifica questa istruzione tutti i prossimi poligoni saranno disegnati con quella texture.
Per cambiare texture riusate la stessa istruzione cambiando il nome della variabile mentre se volete
che il prossimo poligono sia senza texture usate device.SetTexture 0, nothing.
Notate che ho sempre usato 0 ma possibile sovrapporre pi texture sul poligono con effetti
spettacolari. Ma questo pi complicato e riguarder un tutorial avanzato. Per ora scaricatevi
questo demo da me creato e studiatevelo.
Questo l'ultimo argomento fondamentale che bisogna sapere sul Direct3D e come ho scritto
sull'indice ora dovreste imparare un p di 2D dato che nei prossimi argomenti sar costretto a usare
alcuni di questi componenti. Argomento di questa lezione uno dei miei preferiti: le luci e l'effetto
che hanno sugli oggetti. Come avrete notato dal tutorial precedente nell'uso degli oggetti in formato
X ho usato una variabili che volontariamente non ho voluto spiegare: la D3DMaterial8. Cos'? Se
guardate all'ambiente notate che la luce non si riflette allo stesso modo su tutti gli oggetti. Ad
esempio un'auto rossa riflette appunto il rosso ai nostri occhi ma in alcuni punti in cui la luce del
sole va a riflettersi potete vedere dei riflessi bianchi. Le caratteristiche di luminosit e riflessione
sono descritti proprio da questa variabile. Una variabile definita come d3dmaterial deve essere
passata al device prima di ogni operazione del disegno tramite l'istruzione
device.setMaterial "nome della variabile"
Nel loop che disegna notate che l'ho gi inserita dato che la variabile D3DMaterial fa parte del tipo
oggX definito da me(ricordate che un array). La struttura della variabile D3DMaterial composta
da 5 sotto variabili e inoltre le prime 4 hanno anche delle sotto variabili (r,b,g,a) che sono i quattro
valori dei colori che vanno settati da 0 a 1.
Dim materiale As D3DMATERIAL8
materiale.Ambient.r = 1
materiale.diffuse.r = 1
materiale.specular.r = 1
materiale.emissive.r = 1
materiale.power = 255
Nelle prime 4 assegnazioni ho impostato al massimo il valore rosso delle varie caratteristiche
dell'oggetto (per gli oggetti caricati da file X molte sono gi settate dal vostro editor ).
Ambient indica la capacit di riflettere la luce ambientale ossia quella proveniente da tutte le
direzioni (come quelle luci diffuse di stazioni e aereoporti).
Diffuse indica la capacit di riflettere la luce che gli viene puntata addosso da fonti di luci ( la
principale e fondamentale)
Specular indica la capacit di riflettere le fonti di luce (esempio dell'auto). Un'altro esempio la
luce che si riflette sul monitor dalla finestra. ATTENZIONE E' LA LUCE NON L'IMMAGINE: IN
DIRECTX CON LA LUCE NON SI RIFLETTONO GLI OGGETTI.
Emissive indica la capacit di un oggetto di emettere luce (come un oggetto radioattivo).
Power non come le precedenti ma va impostata con un valore numerico da 0 a 255 e indica la
capacit riflessiva riferita a specular. In un prossimo tutorial spiegher un effetto molto bello da
realizzare con questa propriet.
Sui materiali ho finito; ricordatevi di impostare ogni oggetto con il suo materiale perch non come
per le texture che si pu usare Nothing per eliminarle. OGNI OGGETTO IL SUO MATERIALE.
Luci
La variabile che imposta la luce la D3dLight8 che composta da moltissime sottovariabili. Per
poter usare le luci dovrete attivare la luce nel Device,dichiarare una variabile di tipo D3dLight8,
aggiungerla al device e accenderla.Potrete aggiungere molte luci al vostro ambiente a secondo della
scheda video video ma al massimo 8 e accenderle, spegnerle, spostarle e farci tutto ci che volete.
Per attivare la luce nel device inserite questa linea.
device.SetRenderState D3DRS_LIGHTING, 1
Poi dichiarate la variabile
Dim luce As D3DLIGHT8
Impostatela (andate ai tipi per vedere come)
Aggiungetela al device
device.SetLight 0, luce
(Nota. 0 indica che la luce inserita nello slot 0; per inserire pi luci ripetete l'operazione con
un'altro indice (non obbligatoriamente consecutivo)
Infine accendete la luce
device.LightEnable 0, 1
(anche qui 0 l'indice della luce)
Esistono 3 tipi di luce in DirectX. Nell'esempio che lascio con questo tutorial vedrete il classico
Cubo illuminato da questi 3 tipi di luce. Premete 1,2 e 3 per cambiare il tipo di luce e il suo colore.
Point Light
Il primo tipo di luce (tasto 1) la luce puntiforme ossia generata da un punto nello spazio. Questo
tipo di luce quello usato ad esempio per le torce dei castelli. In base ai settaggi si potra regolarne
ad esempio il colore da riflettere, la posizione e la massima distanza a cui sar visibile. Nel mio
esempio ho inpostato la luce sul rosso e la distanza a cui visibile esattamente alla distanza del
cubo. In questo modo quando i vertici si allontanano si oscureranno. Questo tipo di luce il
secondo per il consumo di potenza.
luce.diffuse.g = 1
luce.Type = D3DLIGHT_DIRECTIONAL
luce.Direction.z = 30
device.SetLight 0, luce
Per la direzionale non si usa la posizione ma la Direction(divisa in X,Y,Z). Per trovare la giusta
direzione si sottrae il punto che si vuole illuminare - l'origine. In questo caso z=30= 0 (punto dove si
guarda) - (-30) (origine). La luce segue questo segmento.
Spot Light
L'ultimo tipo la luce di tipo spot. Per farla breve la luce proiettata da una torcia elettrica o da un
faro. E' la pi complessa e penso che un disegno chiarisca tutto molto meglio.
Nella zona al centro la luce molto pi intensa e l'angolo delle luci descritto in radianti dai due
angoli phi e theta. Per questa luce va settata la posizione di partenza e la direzione. E' la luce a mio
avviso pi spettacolare ma anche la pi pesante per il computer. Usare troppe di queste luci
appesantiscono il programma. ATTENZIONE QUESTA LUCE CREA UN FASCIO DI LUCE MA
QUESTO NON SI VEDE FINCHE' NON URTA QUALCOSA.
luce.diffuse.b = 1
luce.Type = D3DLIGHT_SPOT
luce.Position.z = -10
luce.Direction.z = 30
luce.Range = 1000
luce.Attenuation1 = 0.001
luce.Falloff = 5
luce.Phi = 60 * rad1
luce.Theta = 30 * rad1
device.SetLight 0, luce
Qui attenuatio importante. Pi piccolo il valore e meno si attenua. Phi e Theta sono gli angoli
(NB Theta
Qui trovate l'esempio. Per le luci fate milioni di esperimenti perch capire bene il meccanismo delle
variabili dificile e spesso gli oggetti non si vedranno perch semplicemente non saranno
illuminati. Ultimo appunto:
Ambient Light
Per usarla con o senza altre luci scrive questa riga
device.SetRenderState D3DRS_AMBIENT, D3DColorMake(1, 1, 1, 1)
Attenzione per gli utenti 3D Studio: quando regolate il materiale per gli oggetti non s perch ma la
luce ambientale non impostata. Per vedere l'oggetto dovrete impostare voi la variabile ambient del
materiale (consiglio di porre Ambient=Diffuse
cubo.mateX(aus).Ambient = cubo.mateX(aus).diffuse
Ultima nota
Alpha
Cosa diavolo il valore di colore "A" accanto a R,B,G. Il valore di colore alpha un quarto valore
di colore per gli oggetti che ne indica la trasparenza. Per il momento ignoratelo, come lo girate cos
sta bene!. Per gli esempi sull' AlphaBlending sar utile oltre per poter erndere semitrasparenti gli
oggetti della grafica 2D.
Fra poco pubblicher il tutorial Luci special sulle luci degli oggetti metallici. Nella sezione speciali
di Direct3D.
Prima di passare all'argomento sulle luci passiamo ad un altro degli argomenti fondamentali: il
formato X. Cos come ogni programma 3D ha il suo formato anche Direct3D ha il suo formato che
sostituisce gli array di vertici e non solo: anche le texture e le impostazioni sulla luce degli oggetti
vengono memorizzate e questo permette di disegnare con molte meno istruzioni un ambiente 3D
anche di milioni di poligoni (anche se ci vuole un PC spaventoso per realizzare un gioco che
visualizzi milioni di poligoni quindi rimaneta tra i 3000 e i 100000 che meglio). Il formato X per
potreste farmi notare che non molto supportato (non s nemmeno se l'ultimo 3D studio lo
supporta) ma in realt questo non un problema perch la microsoft distribuisce in forma gratuita
un programma che converte il formato 3DS (il pi comune tra tutti) in formato X. La variabile che
memorizza il tutto l'oggetto D3DXMesh. Dato per che questa memorizza solo la disposizione
delle texture dobbiamo accostargli una variabile Direct3DTexture8 e una variabile D3DMaterial per
le inpostazioni luminose. Inoltre per oggetti complessi la mesh formata da pi oggetti che vanno
cos disegnati in serie. Cos ho creato un tipo che memorizza tutte le cose di un oggetto 3D anche il
pi complesso il tipo da me chiamato oggX
Type oggX
numX As Long
meshX As D3DXMesh
mateX() As D3DMATERIAL8
texX() As Direct3DTexture8
End Type
MateX() e TexX() sono due array dinamici che vengono ingranditi quando necessario.
Il programma creato visualizzer un cubo creato in 3DS avente come texture il mio logo.