Utente:Davi.trip/Sandbox: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Davi.trip (discussione | contributi)
Nessun oggetto della modifica
Davi.trip (discussione | contributi)
Nessun oggetto della modifica
Riga 34:
[[File:Gouraud-normals.png|alt=|miniatura|Calcolo delle normali nel Gouraud shading]]
Come per lo shading interpolato, si applica poi l'equazione di illuminazione di Phong per calcolare il valore dell'intensità luminosa (colore) di ogni vertice e si usa l'interpolazione di questi colori per ottenere lo shading di tutti gli altri punti del poligono.<ref name=":10" />
 
'''Calcolo dell'intensità luminosa ai vertici'''
 
I colori sono espressi come triplette di componenti di rosso, verde e blu il cui intervallo di valori va da 0 a 1.<ref name=":11">{{Cita libro|nome=Eric|cognome=Lengyel|titolo=Mathematics for 3D Game Programming and Computer Graphics|edizione=3|data=2 giugno 2011|editore=Cengage Learning Ptr|lingua=Inglese|pp=157-209|ISBN=9781435458864}}</ref> Questi colori rappresentano sia la composizione spettrale della luce, che determina quale colore viene percepito dall'occhio, come anche l'intensità luminosa.<ref name=":11" /> Si denotano i colori con lettere in corsivo per distinguere dai vettori. Una singola componente rossa, verde o blu di un colore <math>\mathcal{C}</math> viene denotata usando usando un indice <math>r</math>, <math>g</math>, o <math>b</math> (dunque, si può scrivere <math>\mathcal{C}= (C_r,C_g,C_b)</math>).<ref name=":11" /> Un colore <math>\mathcal{C}</math> può essere moltiplicato per uno scalare <math>s</math> per produrre un nuovo colore:<ref name=":11" /><math display="block">s\mathcal{C}= (sC_r,sC_g,sC_b)</math>L'addizione e la moltiplicazione di colori sono eseguite per componenti. Ciò significa che per due colori <math>\mathcal{C}</math> e <math>\mathcal{D}</math> si ha:<ref name=":11" /><math display="block">\mathcal{C}+\mathcal{D}= (C_r+D_r,C_g+D_g,C_b+D_b)</math><math display="block">\mathcal{C}\mathcal{D}= (C_rD_r,C_gD_g,C_bD_b)</math>La moltiplicazione cromatica, che sia per un altro colore o per uno scalare, è detta anche ''modulazione''.<ref name=":11" />
[[File:Specular-highlight-2.png|miniatura|L'angolo compreso tra il vettore normale <math>\mathrm{N}</math> e l'''halfway vector'' <math>\mathrm{H}</math>, può essere usato per determinare l'intensità speculare]]
 
Il metodo di Gouraud calcola, perciòdopo aver trovato le normali ai vertici, i colori ''primary'' e ''secondary'' per ciascun vertice:<ref name=":11" />
 
<math display="block">\mathcal{K}_{\mathrm{primary}}=\mathcal{E}+\mathcal{D}\mathcal{A}+\mathcal{D}\sum_{i=1}^n\mathcal{C}_i\max\{\mathrm{N}\cdot\mathrm{L}_i,0\}</math><math display="block">\mathcal{K}_{\mathrm{secondary}}=\mathcal{S}\sum_{i=1}^n\mathcal{C}_i\max\{\mathrm{N}\cdot\mathrm{H}_i,0\}^m(\mathrm{N\cdot\mathrm{L}}_i>0)</math>dove
 
* <math>\mathcal{E}</math> è il colore emissione, che serve a dare all'oggetto l'apparenza di emettere un bagliore uniforme (alcuni oggetti possono emettere luce addizionale o rifletterla)
* <math>\mathcal{D}</math> è il colore della riflessione diffusa della superficie, che modula la luce riflessa
* <math>\mathcal{A}</math> è l'intensità della luce (o colore) ambientale, che giunge da ogni direzione con uguale intensità, e perciò illumina ogni parte di un oggetto uniformemente
* <math>n</math> è il numero di sorgenti luminose
* <math>\mathcal{C}_i</math> è l'intensità della sorgente luminosa
* <math>\mathrm{N}</math> è il vettore normale
* <math>\mathrm{L}_i</math> è il versore che punta verso la sorgente luminosa
* <math>\mathcal{S}</math> è il colore della riflessione speculare della superficie
* <math>\mathrm{H}_i</math> è il vettoreversore, detto ''halfway vector'' (che giace esattamente a metà strada tra il versore all'osservatore <math>\mathrm{V}</math> e il versore alla sorgente luminosa <math>\mathrm{L}</math>), per l'''i''-esima sorgente luminosa, dato da <math>\mathrm{H}_i=\frac{\mathrm{L}_i+\mathrm{V}}{\|\mathrm{L}_i+\mathrm{V}\|}</math>
* <math>m</math> è detto ''esponente speculare'', il qualee controlla la nettezza del punto luce (''specular highlight'')
* <math>(\mathrm{N\cdot\mathrm{L}}_i>0)</math> è un'espressione booleana che restituisce 1 se vera e 0 se falsa, la cui funzione è prevenire la comparsa di punti luce sulla superficie in punti distanti dalla sorgente luminosa
 
Il colore <math>\mathcal{K}</math>di un pixel è in seguito calcolato con l'equazione
 
<math display="block">\mathcal{K}=\mathcal{K}_{\mathrm{primary}}\circ\mathcal{T}_1\circ\mathcal{T}_2\circ\cdots\circ\mathcal{T}_k+\mathcal{K}_{\mathrm{secondary}}</math>dove ciascun <math>\mathcal{T}_i</math> rappresenta un colore campionato da una delle <math>k</math> ''texture maps'', e l'operazione <math>\circ</math> è una delle svariate operazioni di combinazione di texture che includono la modulazione e l'addizione.<ref name=":11" />
 
'''Interpolazione dei colori'''
[[File:Phong shading.svg|miniatura]]
Infine, ciascun poligono viene "ombreggiato" con l'interpolazione lineare delle intensità ai vertici lungo ciascuno spigolo e in seguito tra gli spigoli lungo ciascuna ''scanline''.<ref name=":8" /> Ciò avviene in fase di rasterizzazione.<ref name=":10" />
 
Sia <math>y</math> l'ordinata di una ''scanline'', e <math>\mathrm{N_A}</math>, <math>\mathrm{N_B}</math>, <math>\mathrm{N_C}</math> le intensità ai vertici. Per calcolare l'intensità in <math>\mathrm{N_{A-B}}</math>, <math>\mathrm{N_{X}}</math> e <math>\mathrm{N_{A-C}}</math>, si usano le seguenti formule:
 
* <math>\mathrm{N_{A-B}}=\mathrm{N_A}-(\mathrm{N_A}-\mathrm{N_B})\frac{y_A-y}{y_A-y_B}</math>
* <math>\mathrm{N_{A-C}}=\mathrm{N_A}-(\mathrm{N_A}-\mathrm{N_C})\frac{y_A-y}{y_A-y_C}</math>
* <math>\mathrm{N_X}=\mathrm{N_{A-C}}-(\mathrm{N_{A-C}}-\mathrm{N_{A-B}})\frac{x_{A-C}-x_X}{x_{A-C}-x_{A-B}}</math>
 
== Note ==