Texture mapping: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Davi.trip (discussione | contributi)
Nessun oggetto della modifica
Davi.trip (discussione | contributi)
Piccole aggiunte
Riga 1:
[[File:Texturedm1a2.png|thumb|(1) Modello 3D senza texture<br/>(2) Modello 3D con texture|290x290px]]
Il '''texture mapping''' in [[computer grafica]] è una tecnica che permette di proiettare una o più immagini sulla superficie di un [[modello 3D]], utilizzando le [[Mappatura UV|coordinate UV]]. Una '''[[Texture (grafica)|texture]]''' è semplicemente un'immagine bidimensionale in [[Grafica raster|formato raster]] che viene riprodotta su una o più facce di un modello [[poligono (computer grafica)|poligonale]] tridimensionale<ref>{{cita libro|autore=David Thomas, Kyle Orland, Scott Steinberg|titolo=The videogame style guide and reference manual|anno=2007|editore=Power Play Publishing|ISBN=978-1-4303-1305-2|url=http://www.gamestyleguide.com/VideoGameStyleGuideeBook.pdf|pagine=62|lingua=inglese}}</ref>. La texture rende il modello più dettagliato e realistico, inoltre la sovrapposizione di più texture è utilizzata ad esempio per dare degli effetti speciali ai modelli tridimensionali come luce e nebbia. La tecnica, in particolare nelle [[animazione digitale|animazioni]] 3D, unisce la rapidità di calcolo della grafica poligonale alla ricchezza di dettaglio delle immagini raster. La diffusione di tale tecnica di animazione nelle applicazioni domestiche come i videogiochi si ebbe negli anni '90; nei primi anni del decennio era ancora fattibile con velocità adeguate solo sui PC più potenti dell'epoca<ref>{{cita libro|voce=Texture mapping|titolo=Dizionario dei videogame|url=http://www.dizionariovideogiochi.it/doku.php?id=dizionario_dei_videogame_il|formato=pdf|autore=Fabio Rossi|editore=Vallardi|data=1993|ISBN=8811904226|p=389}}</ref>.
 
== Storia ==
Riga 10:
 
== Funzionamento ==
Le ''texture'', o ''texture map'' sono immagini utilizzate per aggiungere dettagli ulteriori allo [[Ombreggiatura|shading]] di superfici che apparirebbero altrimenti troppo omogenee e artificiali. L'idea è semplice: ogni volta che lo shading viene calcolato, vengono letti i valori utilizzati dalla computazione - il colore diffuso, per esempio - da una texture, invece che usare i valori di attributo che sono connessi alla geometria [[Rendering|renderizzata]]. Questa operazione è conosciuta come texture lookup<ref name=":1">{{Cita libro|autore=Steve Marschner, Peter Shirley|titolo=Fundamentals of Computer Graphics|edizione=4|anno=|editore=|città=|p=|pp=|ISBN=}}</ref>: il codice dello shading specifica una ''texture coordinate'', un punto nel dominio della texture, e il sistema di texture mapping trova il valore in quel punto nella texture immagine e lo restituisce. Il valore della texture è dopo usato nella computazione dello shading.
 
=== LookupCaso dei valori della texturegenerale ===
Si consideri una scena con un pavimento ligneo, e si determini che il colore diffuso del pavimento sia controllato da un'immagine che mostra assi del pavimento con una grana lignea. A prescindere che si stia utilizzando il [[ray tracing]] o la [[rasterizzazione]], il codice dello shading che calcola il colore per un punto di intersezione raggio-superficie o per un frammento generato dal rasterizer, necessita di sapere il colore della texture nello shading point, in modo da usarlo come colore diffuso nel modello di shading lambertiano.
 
Per ottenere questo colore, lo [[shader]] esegue un '''''texture lookup''''':<ref name=":1" /> comprende la posizione, nel sistema di coordinate della texture immagine, che corrisponde allo shading point, e legge il colore in quel punto nell'immagine, che ci risulta nel '''''texture sample'''''<ref name=":1" />. Quel colore è dopo usando nello shading, e dato che il texture lookup avviene in differenti posizioni nella texture per ogni pixel che vede il pavimento, diviene visibile un pattern di colori differenti nell'immagine. Il codice potrebbe apparire in questo modo:<syntaxhighlight>
Color texture_lookup(Texture t, float u, float v) {
int i = round(u * t.width() - 0.5)
Riga 28:
// return shading result
}
</syntaxhighlight>In questo codice, lo shader chiede alla superficie dove guardare nella texture, e in qualche modo ogni superficie che si desideri ombreggiare usando una texture necessita di essere in grado di rispondere a questa richiesta. Questo porta al primo ingrediente chiave del texture mapping: abbiamo bisogno di una funzione che esegua una [[Mappatura UV|mappatura]] dalla superficie alla texture, che possiamo calcolare facilmente per ogni pixel. Questa è la '''''texture coordinate function''''', e diremo che essa assegna delle '''''texture coordinates''''' per ogni punto sulla superficie. Matematicamente essa è una mappatura dalla superficie <math>S</math> al dominio della texture, <math>T</math>:<ref name=":1" />
 
<math display="block">\begin{align} \phi & : S \rightarrow T \\ & : (x,y,z) \mapsto (u,v) \\ \end{align}</math>
[[File:Texture mapping space.png|sinistra|miniatura|385x385px|Texture space per (a) texture maps 1D, (b) texture maps 2D, e (c) texture maps 3D]]
 
L'insieme <math>T</math>, spesso chiamato "'''''texture space'''''", è di solito solo un rettangolo che contiene l'immagine; è comune l'utilizzo del quadrato unitario <math>(u,v)\in[0,1]^2</math> (useremo le lettere <math>u</math> e <math>v</math> per le due texture coordinates). La funzione <math>\phi</math> è una mappatura ''dalla'' superficie ''alla'' texture, quando il nostro obiettivo è inserire la texture sulla superficie, questa tuttavia è la funzione di cui abbiamo bisogno.
 
Per il caso del pavimento di legno, se il pavimento si trova a essere a una costante <math>z</math> e allineato agli assi <math>x</math> e <math>y</math>, possiamo semplicemente usare la mappatura<ref name=":1" />
Riga 38:
<math display="block">u=ax; \quad v=by</math>
 
per alcuni fattori di scala appropriatamente scelti <math>a</math> e <math>b</math>, per assegnare le texture coordinates <math>(s,t)</math> al punto <math>(x,y,z)_{\text{floor}}</math>, e in seguito utilizzare il valore di un texture pixel, o '''''texel'''''<ref name=":1" />, il più vicino a <math>(u,v)</math>, come valore della texture in <math>(x,y)</math>.
 
I [[pixel]] da visualizzare sullo schermo, calcolati a partire dai texel, verranno in seguito governati dal filtro della texture. Il metodo più veloce è quello di usare l'[[Metodo dell'interpolazione lineare|interpolazione lineare]] ([[filtro lineare]]), ma l'[[interpolazione bilineare]] ([[filtro bilineare]]) o l'[[interpolazione trilineare]] ([[filtro trilineare]]) tra [[MIP map]] sono quelle più comunemente utilizzate per ridurre l'[[aliasing]], e quindi per aumentare la qualità complessiva dell'immagine. L'applicazione della texture sul modello tridimensionale è compito della [[scheda video]].
Riga 50:
* David S. Ebert, F. Kenton Musgrave, Darwyn Peachey, Ken Perlin, Steven Worley, ''Texturing and Modeling - A Procedural Approach'', 3ed.
* [http://web.cse.ohio-state.edu/~wang.3602/courses/cse5542-2013-spring/15-texture.pdf Huamin Wang, ''Texture Mapping'']
* [https://www.cs.cmu.edu/~ph/texfund/texfund.pdf Heckbert Paul, ''Fundamentals of Texture Mapping and Image Warping'', 1989]
 
== Voci correlate ==
Riga 62 ⟶ 63:
 
[[Categoria:Computer grafica]]
 
== Collegamenti esterni ==
* [http://happy-werner.hol.es/howtos/isw/parts/3d/chapter_2/chapter_2_texture_mapping.pdf ''Chapter 2: Texture Mapping''] da happy-werner.hol.es
* [http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series4/Textured_terrain.php][http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series4/Textured_terrain.php Programmare un terreno texturizzato] usando XNA/DirectX, da www.riemers.net