Corso di Programmazione Grafica per il Tempo Reale
Texturing
Daniele Marini
Più modalità
• es. muro di mattoni: texture invece di
modellazione
– mappare una fotografia di un muro di
mattoni su una superficie
– simulare opacità del cemento e
“lucentezza dei mattoni” con funzione
immagine che modula la lucentezza
– simulare la “rugosità” del mattone con
bump mapping
Come opera
• durante il rendering per ogni locazione su una
superficie:
– la superficie viene orientata secondo il punto di vista
– si applica il modello di illuminazione
• considerando luci e proprietà del materiale
• se necessario applicando effetti nebbia o trasparenza
– il colore viene modificato secondo la funzione di texture
– se presente si modifica il coefficiente di lucentezza
secondo la funzione di lucentezza
– se presente, si modifica la normale secondo la funzione di
bump mapping
Texture mapping
• 2D, 3D o 4D
• La texture è una qualsiasi immagine
• L’operazione di mapping trasferisce
l’immagine sulla superficie
Pipe-line di texturing
Usa una funzione
di proiezione
MAPPING
Calcola posizione
nello spazio mondo
(x,y,z)
Es: proiezione
ortografica
(proiettare una slide)
(u,v) in (0,1)
Modifica valore
di illuminazione
Applica modello
illuminazione con
terna R,G,B
Usa una funzione
di corrispondenza
Da (0,1) a es.
(256x256), trova
valore in array
R,G,B
Applica funzione
di trasformazione
dei valori
Es. moltiplica R,G,B per 1.1
per evitare valori troppo
scuri
• La configurazione di texture 2D è
definita sul piano s,t - coordinate di
texture normalizzate in [0,1] o in
coord. di array, T(s,t) è la texture
• Gli elementi dell’array di texture
sono i texels
– La funzione di mapping associa a ogni punto
dell’oggetto un unico valore di T, un unico texel
• I valori di T sono espressi in (R,G,B)
• La terna viene usata per modificare
la terna (r,g,b) del punto
dell’oggetto come calcolata dal
modello di illuminazione durante la
fase di shading
Funzioni di proiezione
• proiezione piana o ortografica
– piano su piano
• proiezione parametrica
– piano texture su superficie parametrica
• proiezione sferica (a due passi)
– piano texture su più superfici
• proiezione cilindrica (a due passi)
– piano texture su più superfici
Proiezione piana
• le coordinate (s,t) della texture sono
associate alle coordinate proiettate
x,y
Proiezione parametrica
• Il mapping: se la superficie è
parametrica un punto è:
x(u,v)


p(u,v)  y(u,v)


z(u, v) 
• Si associa T(s,t) a p(u,v)
• L’associazione può essere diretta (u=s,
v=t) o lineare :
u  as  bt  c
v  ds  et  f
Proiezione parametrica
– La funzione è invertibile se ae ≠ bd
– La conversione alle coordinate schermo (trasfrmazione
window-to-viewport):
u  umin
s  smin

(u  umin )
smax  smin max
t  t min
(v max  v min )
tmax  tmin
– Questo approccio non tiene conto della curvatura, la
texture viene tirata (stretched) sulla superficie
v  v min 
Coordinate texture
(0,1)
(1,1)
(u1,v1)
(u2,v2)
(0,0)
(1,0)
(u,v) in [0,1]
(u0,v0)
Diversi modi per ripetere la texture:
• Repeat, mirror, clamp, border:
Metodo delle proiezioni
intermedie
• Per evitare distorsioni nella proiezione
occorre trovare un metodo che rispetti
“similarità”
• La parametrizzazione non è una
similarità
• Nel piano deve preservare gli angoli
• In generale deve preservare colinearità,
mappare rette in rette
• Una soluzione è ricorrere a proiezioni
intermedie
Proiezioni intermedie
• Scegliere una superficie intermedia S
• Mappare la texture su S
• Trovare una funzione di mapping mda
S all’oggetto O
• La funzione di mapping può essere
diretta o inversa
Proiezioni intermedie: due
passi
• Al primo passo si sceglie la superficie
intermedia S
• Al secondo passo si determina il
metodo di proiezione da S ad O
• La proiezione mpuò essere diretta o
inversa
Primo passo: proiezione
cilindrica
– Per proiezione sferica e cilindrica si segue un approccio
a due passi:
• Mappare su una sfera o un cilindro (oggetto intermedio) S
• Mappare la struttura ottenuta sull’oggetto finale - O
Cilindro con raggio r e altezza h :
x  r cos(2u)
y  r sin( 2u)
z  v /h
mappa :
su
t v
con u, v  0,1
Primo passo: proiezione
sferica
• si proietta sulla sfera con l’equazione:
  arccos(rz )
  atan2(ry ,rx )
dove : 0  atan2(y, x)  2 , prende come argomento y/x con x  0

• dove: , sono latitudine e longitudine
sulla sfera; rx, ry, rz, sono direzioni di
proiezione (riflessione), vettori
normalizzati
Secondo passo
• nel secondo passo si sceglie come proiettare sull’oggetto
finale l’oggetto intermedio in funzione della normale al
punto considerato sull’oggetto - 3 modi principali:
– Mappa diretta: proiezione da I su O con normali determinate
su I
– Mappa inversa: determina la normale su O in ogni punto e
individua il punto su I
– Mappa inversa: proiezione dal centroide di O con normali
dirette dal centro dell’oggetto finale
– Mappa inversa: normali determinate su O; il punto su O è la
riflessione, vista dall’occhio, del punto su I
Funzioni di corrispondenza
• Indicano come deve essere mappata la texture:
– Wrap, repeat, tile: l’immagine viene ripetuta come una
piastrella
– Mirror: l’immagine viene ripetuta riflettendola
verticalmente o orizzontalmente
– Clamp to edge: i valori esterni a (0,1) sono forzati agli
estremi, il bordo dell’immagine si prolunga su tutta la
superficie
– clamp to border: i valori esterni a (0,1) sono resi con un
colore proprio, va bene per decalcomanie
Funzioni di modifica
• Replace: rimpiazza i valori R,G,B della
texture agli r,g,b del modello di
illuminazione - chiamato anche glow
texture
• Decal per simulare decalcomanie:
sfrutta canale alfa per modulare
r,g,b,alfa con R,G,B,ALFA
• Modulate: moltiplica r,g,b per R,G,B
Image texture
• Mappare una immagine es. 256 x
256 su una superficie piana; se la
superficie proiettata supera o è
inferiore alla risoluzione
dell’immagine:
– Magnification
– Minification
Magnification
• Nasce aliasing, si supera con
interpolazione
– Nearest neighbor: produce pixellizzazione,
va bene per piccoli ingrandimenti (max
fattore 2)
– Interpolazione bilineare: smoothing
– Altri filtri per ingrandimenti elevati
(ricampionamento)
Magnification
Nearest neighbor
inpterpolazione bilineare
Interpolazione bilineare
• Interpola Linearmente i valori di texture
di 4 texel vicini
t1
t2
i
t3
valore textur in i
=
Lrp(Lrp(t1, t3), Lrp(t2, t4))
t4
Interpolazione bilineare
• t(u,v) individua il valore nella texture
map
• b(u,v) filtered texel
Minification
• Molti texel possono cadere sullo stesso
pixel
– Ancora nearest neighbor, sceglie il texel più
vicino al pixel, aliasing forte, soprattutto nella
animazione
– Ancora interpolazione bilineare: sceglie il texel
medio per il pixel
– Meglio ricampionamento dell’immagine, in
modo da garantire un texel per pixel
(frequenza di campionamento ottima)
Minification
• Molti texel coprono un pixel (sotto
campionamento)
Solutione:
Accresci campioni o riduci
la frequenza massima della
texture
un pixel
metodi:
Artefatti di sotto camp.
1. Mip-mapping
2. Rip-mapping
3. Sum Area Table
MipMapping
• Mip: “multi in parvo”
– L’immagine di texture originale viene
affiancata da molte versioni via via più
piccole, mediante ricampionamento
dell’immagine originale
– Livello 0 originale
– Livello 1 sottocampionato a un quarto
(subtexture), si usa filtro gaussiano
– Si prosegue fino alla risoluzione del pixel
– Attenzione al gamma! per garantire
brightness costante
MipMapping
• Per scegliere quale texture usare si usa
un parametro d per cercare di
ottenere un rapporto pixel:texel pari a
1:1 o 2:1 (frequenza di Nyquist)
• Se un pixel ingloba più texel si scende
di livello
• d individua il livello, la terna (u,v,d)
individua il texel, il campione si
determina con interpolazione trilineare
Mipmapping
• Interpola tra i valori già interpolati in
modo bilineare
Level n+1
(u0,v0,d0)
d
Level n
v
u
Calcolare d per mipmapping
texel
pixel proiettato
sullo spazio texture
A=area approssimata del quadrilatero
b=sqrt(A)
d = log2 b
• Approssima il quadrilatero con un
quadrato
• Rafforza la sfocatura!
• Per evitarlo si usa un filtro anisotropo:
approssima il quadrilatero con un numero
superiore di campioni mip-map più piccoli
MipMapping
Non mipmapping
mipmapping
Anisotropic texture filtering
Ripmapping
•
•
•
•
•
Rectim in parvo
Si sottocampiona separatamente lungo u e v
È un sottocampionamento anisotropo
Permette di evitare effetti di sfocatura ai bordi
Si crea una struttura ad array, la diagonale
principale contiene la struttura mipmapping, lungo
righe e colonne abbiamo le immagini
sottocampionate lungo u e v.
• Si sceglie l’immagine sottocampionata in relazione
alla direzione di anisotropia
• si calcolano valori interpolati usando anche le
immagini sottocampionate lungo u e v
Ripmapping
Summed area table
• filtro anisotropo - calcola il colore medio in
una regione rettangolare nello spazio
texture a velocità costante
• si usa un array 2d della stessa dimensione
della texture, si usano più bit per maggiore
precisione
Ogni elemento nell’array memorizza la somma dei
colori di tutti i texel fino all’angolo in basso a sinistra
Summed area table - 2
• usato per filtrare la texture
spazio pixel
spazio texture
y
pixel
x
Calcola il BB dell’area del pixel nella texture e usa SAT per
calcolare il colore medio dell’area coperta dal BB
Summed area table - 3
• Come si calcola la somma dei texel
nell’area tra A e B?
R’ = SAT[B] – SAT[C] – SAT[D] + SAT[A]
B
C
R
A
D
Il valore finale è la media:
R’ / (numero texels in R)
Confronto
Non filtering
Mipmapping
Summed area table
Texture mapping in OgL
• Il texturing è fatto durante la rasterizzazione
della primitiva
• mappa punti 3D in locazioni (pixel) sul
display
• Ciascun frammento generato viene testato
per la visibilità (z-buffer) e se visibile viene
calcolato lo shading
• Durante l’interpolazione di shading si
calcola il valore di texture usando ancora
interpolazione tra vertici estremi
Dichiarazione della texture
Glubyte my_texels [512][512]
/* dichiara una immagine di texture
glTexImage2D(GL_TEXTURE_2D,0,components,512,512,
0,format,type, my_texels);
/*specifica che l’immagine deve essere una Texture
components determina il numero di colori (da 1 a 4)
format è determinato dai due parametri successivi
(valori dei pixel e dim immagine)
glEnable(GL_TEXTURE_2D)
Dichiarazione del modo di
mapping
glTexCoord2f(s,t)
/* range di variazione delle coordinate dello spazio
texture
La texture viene associata alla primitiva all’atto
della dichiarazione:
glBegin(GL_QUAD);
glTexCoord2f(0.0, 0.0);
glVertex2f(x1, y1, z1);
glTexCoord2f(1.0, 0.0);
glVertex2f(x2, y2, z2);
glTexCoord2f(1.0, 1.0);
glVertex2f(x3, y3, z3);
glTexCoord2f(0.0, 1.0);
glVertex2f(x4, y4, z4);
glEnd();
• Posso usare anche un intervallo inferiore di s e t, in
tal caso viene mappata solo una parte della
texture;
• OgL interpola i valori
• Cosa succede se si specificano valori di s e t esterni
all’intervallo 0,1?
– Potremmo volere che la texture si ripeta
periodicamente
– Oppure vorremmo “clampare” gli estremi ed
estendere 0 ed 1 per i valori inferiori o superiori
glTexParameter(GL_TEXTURE_WRAP_S, GL_REPEAT)
/*texture ripetute
glTexParameter(GL_TEXTURE_WRAP_S,GL_CLAMP)
/* texture “clampate”
Minification, magnification
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_NEAREST|GL_LINEAR)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_NEAREST|GL_LINEAR)
GL_NEAREST adotta nearest neighbourgh
GL_LINEAR applica un filtro smooth 2x2
mipmapping
• OgL permette di creare una serie di
array di texture a risoluzione
decrescente
gluBuild2DMipmaps(GL_TEXTURE_2D,3,64,64,GL_RGB,
GL_UNSIGNED_BYTE,my_texels)
/* crea le texture 64x64-32x32-16x16-8x8-4x4-2x2-1x1
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,
GL_NEAREST_MIPMAP_NEAREST)
/*invoca l’opzione mipmap
Modifica del colore
• Il colore può essere modulato (alfa blending) o
coperto dalla texture:
glTexEnv(GL_TEX_ENV,GL_TEX_ENV_MODE,GL_MODULATE)
glTexEnv(GL_TEX_ENV,GL_TEX_ENV_MODE,GL_DECAL)
Bump mapping
Bump mapping
• Perturbazione della
normale
• Funzione di bump
d(u,v): p'  p  d(u,v)n
• Meglio perturbare la
normale e non il punto
n
pu  pv
pu  pv
x 
 
u 
y 
pu   
u 
z 

u 

x 
 
v 
y 
pv   
v 
z 

v 

n'  p' u p' v
dove :
d
p' u  pu 
n  d(u,v)nu
u
d
p' v  pv 
n  d(u,v)nv
v
Environmental mapping
Simula riflessioni a specchio senza ray
tracing, chiamato anche reflection
map
Si calcola la proiezione dell’ambiente su
una forma determinata (sfera per
oggetti, cubo nel caso di ambienti
chiusi)
La proiezione viene trattata come una
texture, ma la texture viene proiettata
dal punto vista dell’osservatore
• Il programma applicativo deve calcolare
la proiezione dell’ambiente sulla
superficie intermedia (sfera o scatola)
• OgL genera automaticamente le
coordinate di texture per un mapping
sferico
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP)
glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP)
glEnable(GL_TEXTURE_GEN_S)
glEnable(GL_TEXTURE_GEN_T)
Nebbia ed effetti di
profondità
• Depth cueing
• Fog factor f viene trattato come il
coefficiente alfa blending, è approssimato da
una funzione del tipo
f e
0.5z 2
GLFloar fcolor[4] = […]
glEnable(GL_FOG)
glFogf(GL_FOG_MODE,GL_EXP)
glFoGf(GL_FOG_DENSITY,0.5)
glFogfv(GL_FOG_COLOR, fcolor)
Scarica

coordinate di texture