notJustCode.it
 
\\ Home : Articoli
Luci
Di RobyDx (del 18/01/2007 @ 23:19:44, in DirectX9, linkato 2348 volte)

L'ultimo aspetto di base della grafica 3D è la luce. La luce è un componente molto importante perchè restituisce colori ed ombre degli oggetti 3D. Perchè gli oggetti sono tutti bianchi? Semplice, perchè con le luci spente directX offre un colore di base bianco ma accendendo le luci gli oggetti rifletteranno il loro vero colore in base al tipo e al colore della luce. DirectX offre tramite le sue librerie Direct3D una simulazione di luce reale molto veloce e con la possibilità di inserire diverse luci nella scena. Le caratteristiche per la riflessione della luce da parte di un oggetto sono inserite in una variabile chiamata Material (creata con le mesh nel precedente tutorial). I materiali non comprendono semplicemente il colore dell'oggetto ma anche come questo risponde a tutti i tipi di luce esistenti. In directX infatti esistono diversi tipi di luce tutti rappresentati da proprietà di questo oggetto (sono tutti oggetti color).

  • Ambient
  • Diffuse
  • Emissive
  • Specular
  • Specular sharpness
    La luce ambientale è la luce che un oggetto riflette da una luce generale. Pensate di trovarvi all'aperto, il sole vi colpisce e vi illumina ma non succede che dietro di voi tutto è nero. La luce rimbalza e vi illumina tutto intorno in modo uniforme. La luce ambientale è questo e la proprietà ambient indica il colore che l'oggetto riflette dalla luce ambientale.
    La luce diffusa è la principale ed è quella riflessa se colpiti da una sorgente luminosa.
    Emissive è un colore emesso. Anche se l'oggetto non è illuminato questo emetterà il colore specificato da emissive.
    Specular è uno dei colori più interessanti. Un oggetto metallico riflette il colore ma anche dei riflessi (un auto rossa se illuminata emette anche dei riflessi di altri colori a secondo della luce e dei punti illuminati). Questa proprietà non si setta in modo immediato ma richiede il settaggio di specular sharpness e di altre proprietà.
    Tutte le proprietà vengono caricate nel materiale insieme alla mesh ma in genere solo la diffuse viene riempita. Conviene quindi settare la luce ambientale uguale a quella diffuse. La emissive, a meno che non vogliate un oggetto che emetta luce, lasciatela uguale a black.

    Luci

    In DirectX esistono 4 tipi di sorgenti molto differenti fra loro sia per effetto che per pesantezza. La luce infatti appesantisce il processo di rendering (ovviamente non moltissimo ma aggiungendone troppe ed inserendo altri effetti speciali il gioco può perdere frame). In DirectX è infatti possibile inserire molte luci (a secondo delle schede si può arrivare anche a 8 luci contemporaneamente). Eccetto la luce ambientale per tutte le luci occorre modificare le proprietà

    device.Lights(i)

    L'indice i indica il numero della luce. Quando tutte le caratteristiche sono settate occorre dare

    device.RenderState.Lighting = True
    device.Lights(i).Update()
    device.Lights(i).Enabled = True

    La prima prepara il device alle luce, la seconda modifica le impostazioni della luce con quelle appena inserite mentre l'ultima attiva la luce. Per poter inserire più luci attivate più luci cambiando gli indici.
    Per disattivare una luce dovete porre Enable=false o direttamente Lighting per disattivare tutto. Ricordate sempre di usare update altrimenti i nuovi settaggi non saranno inseriti. I 4 tipi di luce sono i seguenti.

    Ambientale

    La luce ambientale è una luce che proviene da tutte le direzioni e non crea quindi alcuna ombra (per ombre intendo le sfumature di colore degli oggetti, non quelle proiettate a terra). La luce ambientale serve per mostrare il colore dell'oggetto in modo uniforme ma soprattutto insieme alle altre luci per dosare al meglio l'illuminazione. Dato che si accompagna ad altre luci va settata a valori uguali ma inferiori alle altre luci. Questa luce inoltre non rientra tra le luci ed è unica, non si può settarne più di una. Per settarla occorre modificare la proprietà device.RenderState.Ambient con un oggetto Color
    Ad esempio

    device.RenderState.Ambient = Color.FromArgb(127, 127, 127, 127)

    Direzionale

    La luce direzionale è quella più leggera dopo l'ambientale. L'effetto è quello di una luce a distanza lontanissima (ad esempio la luce del sole). Per questa luce occorre settare un colore e una direzione. Ecco un esempio

    device.Lights(0).Type = LightType.Directional
    device.Lights(0).Diffuse = Color.Green
    device.Lights(0).Direction = New Vector3(1, 0, 1)
    device.Lights(0).Update()

    Occorre settare il tipo a direzionale, il colore dei vari elementi che corrispondono a quelli dei materiali (nell'esempio c'è solo diffuse ma si può settare anche emissive,specular e ambient ma di solito si settano solo Diffuse o al massimo specular. La cosa principale è la direzione tramite un vettore. Una direzione si può calcolare facilmente come posizione finale - posizione iniziale. Ad esempio se vogliamo che la luci passi per i punti (2,2,2) verso (10,10,10) si può scrivere (2-10,2-10,2-10) quindi (-8,-8,-8) ma dato che si può fare il minimo comune multiplo (1,-1,-1). Se conoscete un pò di matematica qui aiuta.

    Puntiforme

    La luce puntiforme genera sorgenti che si diradano da un solo punto. Torce o lampadine sono degli esempi. I settaggi sono ad esempio questi.

    device.Lights(0).Type = LightType.Point
    device.Lights(0).Diffuse = Color.Red
    device.Lights(0).Direction = New Vector3(1, 1, 1)
    device.Lights(0).Position = New Vector3(-100, 0, -100)
    device.Lights(0).Range = 120
    device.Lights(0).Update()

    Oltre al tipo e al colore occorre settare la posizione (posizione X,Y,Z del punto sorgente della luce) e la proprietà range. La proprietà range indica la distanza oltre la quale non è più visibile la luce. Dato che alcune schede pare diano problemi se la direzione è 0,0,0 conviene settare un valore anche alla direzione anche se ignorato. Inoltre è possibile anche inserire un valore per l'attenuazione (vedere sotto).

    Spot Light

    La luce spot è la luce più complessa e comprende ad esempio la luce emessa da una torcia o un faro. La luce parte da un punto (settate quindi la posizione) e prende una direzione (settate la direzione).

    spot lite directx

    La luce offre inoltre due zone di illuminazione, una centrale ed una esterna. L'angolo esterno deve essere maggiore di quello interno. Ecco un esempio

    device.Lights(0).Type = LightType.Spot
    device.Lights(0).Diffuse = Color.Blue
    device.Lights(0).Direction = New Vector3(1, 0, 1)
    device.Lights(0).Position = New Vector3(-100, 0, -100)
    device.Lights(0).Falloff = 5
    device.Lights(0).Range = 1000
    device.Lights(0).InnerConeAngle = 30 * rad
    device.Lights(0).OuterConeAngle = 60 * rad
    device.Lights(0).Attenuation1 = 0.01
    device.Lights(0).Update()

    Inner è l'angolo centrale e outer quello esterno. Serve settare tipo, colore, posizione,direzione e range. Il valore falloff gestisce il passaggio di luce tra i due coni. Attenuation1 è uno dei valori di attenuazione. Esistono tre variabili da settare per l'attenuazione ,(0,1,2) che devono rispettare questa equazione.
    Atten = 1/( att0i + att1i*d + att2i*di2)
    L'unico modo per capire bene il funzionamento della luce è provare a modificare i vari valori.

    Cose da sapere

    La luce di DirectX non è reale ma solo una simulazione. La luce reale rimbalza tra gli oggetti, è influenzata dall'aria ed è così complessa che per altri 20-30 anni nessun computer riuscirà a realizzare una simile quantità di calcoli. Di conseguenza le luci non possono ad esempio proiettare delle ombre al suolo, riflettere le luci tra oggetti o scurire oggetti coperti da altri oggetti. Per tutte queste cose occorre qualcosa in più che viene lasciato al programmatore. Nei tutorial più avanzati proveremo a realizzare ombre e sistemi avanzati di luce.
    Vi lascio l'esempio di quanto spiegato finora. Le basi del 3D sono state gettate, già ora potete iniziare a realizzare giochi ed applicazioni 3D.

  •  

    Esempio VB

    Esempio C#

    Articolo Articolo  Storico Storico Stampa Stampa
    I commenti sono disabilitati.
    "Se tutto deve rimanere com'è, è necessario che tutto cambi"

    Giuseppe Tomasi di Lampedusa, Il gattopardo


    Cerca per parola chiave
     

    Titolo
    Articoli (4)
    C++ (4)
    Direct3D10 (30)
    Direct3D11 (20)
    DirectX9 (82)
    DotNet (10)
    English (9)
    FanGames (22)
    ManagedDX11 (2)
    Materiale Utile (4)
    News (39)
    Shader Library (12)
    SharpDX (1)
    Software (25)
    Tecnologia (19)
    Varie (9)

    Gli interventi più cliccati

    Ultimi commenti:
    If you wish to retai...
    23/05/2013 @ 13:07:45
    Di chanel outlet
    You deficit of self-...
    23/05/2013 @ 13:07:13
    Di cartier watches uk
    Reinforce your own l...
    23/05/2013 @ 13:06:37
    Di replica watches
    Whenever you"re shiv...
    23/05/2013 @ 13:06:11
    Di swiss replica watches
    It's likely you have...
    23/05/2013 @ 13:05:02
    Di chanel handbags
    Cheap automobile ins...
    23/05/2013 @ 13:04:28
    Di replica watches

    Titolo
    Con quale tecnologia state realizzando o avete intenzione di realizzare i vostri progetti?

     DirectX11
     DirectX10
     DirectX9
     XNA
     DirectX8 o Precedenti
     OpenGL
     Motori grafici già pronti
     Altro

    Titolo
    Umorismo (17)

    Le fotografie più cliccate



    Ci sono 948 persone collegate
    Sono state visualizzate  pagine

    22/11/2024 @ 16:11:05
    script eseguito in 40 ms