Vettori normali viso e vertice (Direct3D 9)
Ogni viso in una mesh ha un vettore normale di unità perpendicolare, come illustrato nella figura seguente. La direzione del vettore è determinata dall'ordine in cui sono definiti i vertici e dal fatto che il sistema di coordinate sia destro o sinistrorso. Il viso si allontana dal lato anteriore del viso. In Direct3D è visibile solo la parte anteriore di un viso. Un viso anteriore è uno in cui i vertici sono definiti in senso orario.
Qualsiasi viso che non è un viso anteriore è una faccia posteriore. Direct3D non esegue sempre il rendering dei visi indietro; pertanto, i volti indietro sono detti essere codificati. È possibile modificare la modalità di analisi per eseguire il rendering dei visi indietro, se necessario. Per altre informazioni, vedere Culling State (Direct3D 9).
Direct3D usa le normali delle unità di vertice per gli effetti di ombreggiatura, illuminazione e texturing gouraud. La figura seguente mostra le normali di esempio.
Quando si applica l'ombreggiatura Gouraud a un poligono, Direct3D usa le normali dei vertici per calcolare l'angolo tra la sorgente di luce e la superficie. Calcola i valori di colore e intensità per i vertici e li interpola per ogni punto in tutte le superfici della primitiva. Direct3D calcola il valore di intensità della luce usando l'angolo. Maggiore è l'angolo, minore è la luce sulla superficie.
Se si crea un oggetto piatto, impostare le normali dei vertici in modo che puntino perpendicolare alla superficie, come illustrato nella figura seguente.
È più probabile, tuttavia, che l'oggetto sia costituito da strisce di triangoli e che i triangoli non siano coplanari. Un modo semplice per ottenere l'ombreggiatura liscia su tutti i triangoli nella striscia consiste nel calcolare innanzitutto il vettore normale della superficie per ogni viso poligonale a cui è associato il vertice. La normale vertice può essere impostata in modo da creare un angolo uguale con ogni normale superficie. Tuttavia, questo metodo potrebbe non essere sufficientemente efficiente per le primitive complesse.
Questo metodo è illustrato nel diagramma seguente, che mostra due superfici, S1 e S2 visualizzate dall'alto. I vettori normali per S1 e S2 sono visualizzati in blu. Il vettore normale dei vertici viene visualizzato in rosso. L'angolo che il vettore normale vertice produce con la normale superficie di S1 è lo stesso dell'angolo tra la normale vertice e la normale superficie di S2. Quando queste due superfici sono illuminate e ombreggiate con ombreggiatura Gouraud, il risultato è un bordo uniformemente ombreggiato e arrotondato tra di essi.
Se il vertice si appoggia verso uno dei visi a cui è associato, fa aumentare o diminuire l'intensità della luce per i punti su tale superficie, a seconda dell'angolo che crea con la sorgente di luce. Il diagramma seguente mostra un esempio. Anche in questo caso, queste superfici sono visibili sul bordo. La normale vertice si appoggia verso S1, causando un angolo più piccolo con la sorgente di luce rispetto a se la normale vertice aveva angoli uguali con le normali della superficie.
È possibile usare l'ombreggiatura Gouraud per visualizzare alcuni oggetti in una scena 3D con bordi taglienti. A tale scopo, duplicare i vettori normali dei vertici in qualsiasi intersezione di visi in cui è necessario un bordo affilato, come illustrato nella figura seguente.
Se si usano i metodi DrawPrimitive per eseguire il rendering della scena, definire l'oggetto con bordi taglienti come elenco di triangoli, anziché una striscia di triangoli. Quando definisci un oggetto come striscia di triangoli, Direct3D lo considera come un singolo poligono composto da più facce triangolari. L'ombreggiatura gouraud viene applicata sia in ogni faccia del poligono che tra le facce adiacenti. Il risultato è un oggetto ombreggiato uniformemente dal viso al viso. Poiché un elenco di triangoli è un poligono composto da una serie di visi triangolari disgiunti, Direct3D applica l'ombreggiatura Gouraud in ogni viso del poligono. Tuttavia, non viene applicato da faccia a faccia. Se due o più triangoli di un elenco di triangoli sono adiacenti, sembrano avere un bordo affilato tra di essi.
Un'altra alternativa consiste nel passare all'ombreggiatura piatta quando si esegue il rendering di oggetti con bordi taglienti. Si tratta del metodo più efficiente a livello di calcolo, ma può comportare oggetti nella scena che non vengono sottoposti a rendering realisticamente come gli oggetti ombreggiati da Gouraud.
Argomenti correlati