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 28:
=== Shading costante ===
[[File:Dolphin triangle mesh.svg|miniatura|Esempio di shading costante]]
La tecnica più semplice di ombreggiatura è il flat shading o shading costante, dove un vertice di ciascun triangolo della mesh poligonale viene scelto come vertice chiave per quel triangolo.<ref name=":7">{{Cita|Hughes|pp. 127-128}}</ref> L'equazione di illuminazione viene eseguita per calcolare il valore di illuminazione per quel vertice, e l'intero triangolo viene riempito con una copia di quel valore.<ref name=":7" /> Questa tecnica può risultare appropriata per le piramidi, ma quando una mesh di triangoli approssima una superficie curva, risulta evidente che è necessaria una tecnica più sofisticata.<ref name=":7" /> Incrementare il numero di facce aiuta a migliorare il risultato, ma l'approssimazione resterà ancora apparente.<ref name=":7" /> Tentare di risolvere il problema con un mero incremento della risoluzione della mesh nonè solo èsia costoso (in termini di memoria/elaborazione), ma anchesia inefficace<ref name=":7" />, seperché la posizionedifferenza dellapercepita cameranell'ombreggiatura virtualeche cambia,coinvolge muovendosfaccettature questaadiacenti versoviene laaccentuata meshdall'effetto Mach banding (scoperto da Mach nel 1865), ail unquale certoesagera puntoil lecambiamento sfaccettaturedi risulterannointensità in ogni spigolo dove vi è una discontinuità in termini di variazione di evidentiluminosità.<ref name=":713">{{Cita|Foley|pp. />735-736}}
 
«The simple solution of using a finer mesh turns out be surprisingly ineffective, because the perceived difference in shading between adjacent facets is accentuated by the Mach band effect (discovered by Mach in 1865), which exaggerates the intensity change at any edge where there is a discontinuity in magnitude or slope of intensity. At the border between two facets, the dark facet looks darker and the light facet look lighter.»</ref> Vicino al bordo tra due bande, la banda scura sembra più scura e quella chiara più chiara.<ref name=":13" />
 
=== Gouraud shading ===
[[File:Gouraudshading00.png|sinistra|miniatura|Gouraud shading con il modello di illuminazione di Phong]]
Quando la computer grafica era ancora ai suoi primi giorni di vita, la memoria era misurata in kilobyte e i processori erano meno potenti di quelli attuali di molti ordini di grandezza, divenne particolarmente urgente la ricerca di un modo efficiente per produrre immagini accettabili di superfici curve a partire da approssimazioni di mesh a bassa risoluzione.<ref name=":7" /> Nei primi anni Settanta, lo studente dell'Università dello Utah di nome Henri Gouraud, rifinì la tecnica dello shading interpolato, che consiste nel valutare l'equazione di illuminazione solo nei vertici del poligono ed interpolare linearmente, all'interno dello spazio colore, i valori trovati nei vertici per trovare i valori sui lati e nei punti interni.<ref name=":7" /><ref name=":10">{{Cita|Zingaretti|pp. 136-138}}</ref> Il Gouraud shading estende il concetto di shading interpolato, ed è un processo che richiede che sia nota la normale per ciascun vertice della mesh poligonale.<ref name=":8">{{Cita|Foley|pp. 736-737}}</ref> Gouraud fu in grado di calcolare queste ''normali ai vertici'' direttamente dalla descrizione analitica della superficie.<ref name=":8" /> In alternativa, se le normali ai vertici non sono memorizzate con la mesh, e non possono essere determinate direttamente dalla superficie effettiva, allora, suggerì Gouraud, le si possono approssimare calcolando la media delle normali alla superficie di tutte le facce poligonali che condividono ciascun vertice:<ref name=":6" /><ref name=":8" /><math display="block">\mathrm{\vec{N}}_v = \frac{\sum_i\mathrm{\vec{N}}_i}{|\sum_i\mathrm{\vec{N}}_i|}</math><br />[[File:Gouraud-normals.png|alt=|miniatura|Calcolo delle normali nel Gouraud shading]]
[[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" /> Gli step del Gouraud shading sono quindi:<ref name=":12">{{Cita libro|nome=David|cognome=Salomon|titolo=The Computer Graphics Manual|data=6 ottobre 2011|editore=Springer-Verlag New York Inc.|lingua=Inglese|pp=864-866|ISBN=9780857298850}}</ref>
 
Line 56 ⟶ 57:
# Concludere con la generazione di una normale interpolata <math>\mathrm{N}_p</math> per ogni pixel <math>p</math>, applicando infine il modello di illuminazione lungo ciascuna ''scan line'' per calcolare l'intensità di ciascun punto della superficie<ref name=":12" />
 
Il Phong shading è computazionalmente più costoso del Gouraud shading, perché il modello di riflessione viene calcolato per ciascun pixel piuttosto che per ciascun vertice.<ref>{{Cita libro|nome=Jon|cognome=Peddie|titolo=The History of Visual Magic in Computers. How Beautiful Images Are Made in CAD, 3D, VR and AR|data=13 giugno 2013|editore=Springer Verlag|lingua=Inglese|pp=59-60|ISBN=9781447149316}}</ref>
I colori, in generale, 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, sia l'intensità luminosa.<ref name=":11" /> Si denotano i colori con lettere in corsivo per distinguerli 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" /> L'hardware grafico che può eseguire calcoli complessi su base pixel per pixel (un processo chiamato ''pixel shading'' o ''fragment shading''), può essere configurato per calcolare l'intera espressione (che si riferisce al Blinn-Phong shading)<ref name=":11" />
 
I colori, in generale, 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, sia l'intensità luminosa.<ref name=":11" /> Si denotano i colori con lettere in corsivo per distinguerli 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" /> L'hardware grafico che può eseguire calcoli complessi su base pixel per pixel (un processo chiamato ''pixel shading'' o ''fragment shading''), può essere configurato per calcolare l'intera espressione (che si riferisce al Blinn-Phong shading)<ref name=":11" /><math display="block">\mathcal{K}=\mathcal{K}_{\mathrm{emission}}+\mathcal{K}_{\mathrm{diffuse}}+\mathcal{K}_{\mathrm{specular}}=
<math display="block">\mathcal{K}=\mathcal{K}_{\mathrm{emission}}+\mathcal{K}_{\mathrm{diffuse}}+\mathcal{K}_{\mathrm{specular}}=
\mathcal{E}\mathcal{M}+\mathcal{D}\mathcal{T}\mathcal{A}+
\sum_{i=1}^n\mathcal{C}_i
[\mathcal{D}\mathcal{T}(\mathrm{N}\cdot\mathrm{L}_i)+\mathcal{S}\mathcal{G}(\mathrm{N}\cdot\mathrm{H}_i)^m(\mathrm{N}\cdot\mathrm{L}_i>0)]</math>per ciascun pixel che compone la faccia del triangolo (o poligono), e dove<br />[[File:Specular-highlight-2.png|miniatura|L'angolo compreso tra il vettore normale N e l'''h''<nowiki/>''alfway vector'' H, può essere usato per determinare l'intensità speculare<nowiki/>]]
 
per ciascun pixel che compone la faccia del triangolo (o poligono), e dove[[File:Specular-highlight-2.png|miniatura|L'angolo compreso tra il vettore normale N e l'''h''<nowiki/>''alfway vector'' H, può essere usato per determinare l'intensità speculare<nowiki/>]]
 
*<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)
Line 75 ⟶ 74:
*<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 versore, detto ''halfway vector''<ref>{{Cita|Scateni|p. 176}}
*<math>\mathrm{H}_i</math> è il versore, detto ''halfway vector''<ref>La sua presenza è dovuta a una modifica di Blinn dell'equazione di illuminazione di Phong. Si sostituisce al prodotto scalare <math>\mathrm{R}\cdot\mathrm{V}</math> il prodotto scalare <math>\mathrm{N}\cdot\mathrm{H}</math> dove <math>\mathrm{H}</math> è il vettore, normalizzato, sulla bisettrice dell'angolo formato dai vettori <math>\mathrm{L}</math> e <math>\mathrm{V}</math>. <math>\mathrm{R}</math>è la direzione di riflessione ideale.</ref> (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>\mathrm{H}_i</math> è il versore, detto ''halfway vector''<ref>«La sua presenza è dovuta a una modifica di Blinn dell'equazione di illuminazione di Phong. Si sostituisce al prodotto scalare <math>\mathrm{R}\cdot\mathrm{·V}</math> il prodotto scalare <math>\mathrm{N}\cdot\mathrm{·H}</math> dove <math>\mathrm{H}</math> è il vettore, normalizzato, sulla bisettrice dell'angolo formato dai vettori <math>\mathrm{L}</math> e <math>\mathrm{V}</math>. <math>\mathrm{R}</math> è la direzione di riflessione ideale.»</ref> (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>
*<nowiki/><math>m</math> è detto ''esponente speculare'', e 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