Computer Graphics Marco Tarini Università dellInsubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2006/07 Lezione 12: realismo a buon prezzo: il texture Mapping
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Memoria RAM nelle schede grafiche Frammenti & attributi interpolati Vertici & loro attributi Screen buffer (RGBA) Screen buffer 2 (RGBA) Depth buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice Texture RAM computazioni per frammento
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Texture Mapping Nelle operazioni per frammento si può accedere ad una RAM apposita –la Texture RAM –strutturata in un insieme di Textures ("tessiture") Ogni tessitura è un array 1D, 2D o 3D di Texels (campioni di tessitura) dello stesso tipo
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Texels Tipici esempi di texels: –ogni texel un colore (componenti: R-G-B, o R-G-B-A) la tessitura è una "color-map" –ogni texel una componente alpha la tessitura è una "alpha-map" –ogni texel una normale (componenti: X-Y-Z) la tessitura è una "normal-map" o "bump-map" –ogni texel contiene un valore di specularità la tessitura è una "shininess-map" –ogni texel contiene un valore di altezza la tessitura è una "displacement-map" –...
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Tipica applicazione: rimappare immagini sulla geometria geometria 3D (insieme di quadrilateri) + RGB texture 2D (color-map) =
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Altri esempi di color-map
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Altro esempio di color-map +=
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Texture Mapping: Storia 1974 introdotto da Ed Catmull –nella sua Phd Thesis Solo nel 1992 (!) si ha text. mapping hardware –Silicon Graphics RealityEngine Dal 92 a oggi: rapido aumento della diffusione –strada intrapresa soprattutto da low end graphic boards Oggi: una delle fondamentali primitive di rendering –la principale tecnica image based di rendering Ed Catmull (MEGA-MEGA- GURU)
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Notazione Texture 2D u v texel Texture Space (o "spazio parametrico" o "spazio u-v" o "spazio s-t") Una Texutre e' definita nella regione [0,1] x [0,1] dello "spazio parametrico" 512 texels 1024 texels 1.0
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Texture Mapping Ad vertice (di ogni triangolo) assegno le sue coordinate u,v nello spazio tessitura Screen Space x 0,y 0 x 2,y 2 x 1,y 1 u 0,v 0 u 1,v 1 u 2,v 2 posizione del 1mo vertice attributi del 1mo vertice u 0,v 0 u 1,v 1 u 2,v 2
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Texture Mapping Così in pratica definisco un mapping fra il triangolo 3D e un triangolo di tessitura Texture Space Screen Space
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Texture Mapping Ogni frammento ha le sue coordinate u,v nello spazio tessitura Texture Space Screen Space texture look-up
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Texture Mapping Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice Texture RAM computazioni per frammento interpolo coordinate texture coordinate texture interpolate compreso: coordinate texture (per vertice!) texture look-up interpolo coordinate texture
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Problema: interpolazione lineare coordinate texture Non vale per la proiezione prospettica! –era solo una approssimazione –andava bene quando interpolavamo colori, normali –non va bene quando interpoliamo coordinate texture... V1V1 V2V2 V3V3 p f(p) f( v 1 ) f( v 2 ) f( v 3 ) proiezione f p ha coord. baricentriche a,b,c nel triangolo v 1 v 2 v 3 f(p) ha coord. baricentriche a,b,c nel triangolo f(v 1 ) f(v 2 ) f(v 3 )
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Problema: interpolazione lineare coordinate texture Esempio: u v 1 1 u,v= (1,0) u 1,v 1 = (1,1) u 1,v 1 = (0,1) u 1,v 1 = (0,0)
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Problema: interpolazione lineare coordinate texture Esempio:
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Soluzione: Correzione Prospettica p ha coordinate baricentriche c 0 c 1 c 2 V0V0 V2V2 V1V1 A 0,B 0... A 1,B 1... A 2,B 2... p p = c 0 v 0 + c 1 v 1 + c 2 v 2 attributi di p: (senza considerare la "normalizzazione affine") A p = c 0 A 0 + c 1 A 1 + c 2 A 2 B p = c 0 B 0 + c 1 B 1 + c 2 B 2 = ( x 0, y 0, z 0, w 0 )
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Soluzione: Correzione Prospettica p ha coordinate baricentriche c 0 c 1 c 2 V0V0 V2V2 V1V1 A 0,B 0... A 1,B 1... A 2,B 2... p p = c 0 v 0 + c 1 v 1 + c 2 v 2 attributi di p: (senza considerare la "normalizzazione affine") A p = c 0 A 0 + c 1 A 1 + c 2 A 2 A0A0 w0w0 A1A1 w1w1 A2A2 w2w2 Ap =Ap = 1 w0w0 1 w1w1 1 w2w2 = ( x 0, y 0, z 0, w 0 )
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Soluzione: Correzione Prospettica Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice computazioni per frammento attributo originale A applico transofrm. poi calcolo: A' = A / w e w' = 1 / w c 0 + c 1 + c 2 A0A0 w0w0 A1A1 w1w1 A2A2 w2w2 Ap =Ap = 1 w0w0 1 w1w1 1 w2w2 interpolo A' e w' attributo finale del frammento: A' / w' c 0 + c 1 + c 2
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Correzione Prospettica SenzaCon
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Correzione Prospettica Texture mapping con correzione prospettica –anche conosciuto come: texture mapping perfetto metodo dei 3 vettori magici (desueto) metodo dei 9 numeri magici (desueto)
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Nota: la tessitura va caricata Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice computazioni per frammento Texture RAM LOADLOAD
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Nota: la tessitura va caricata 1.Da disco a memoria RAM main (sulla scheda madre) 2.Da memoria RAM main a Texture RAM (on board dell'HW grafico) Entrambe operazioni piuttosto lente. Per es, impossibili da fare una volta per frame!
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a In OpenGL Ad esempio: glEnable(GL_TEXTURE_2D); glBindTexture (GL_TEXTURE_2D, ID); glTexImage2D ( GL_TEXTURE_2D, 0, // mipmapping GL_RGB, // formato interno imageWidth, imageHeight, 0, // bordo GL_RGB, // formato nella RAM GL_UNSIGNED_BYTE, imageData);
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Come si assegnano le coordinate texture ai vertici? Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice Texture RAM computazioni per frammento interpolo coordinate texture coordinate texture interpolate compreso: coordinate texture (per vertice!) texture look-up compreso: coordinate texture (per vertice!)
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Come si assegnano le coordinate texture ai vertici? Due classi di soluzioni: –Assegnarle le coordinate textures al volo durante il rendering… –Precomputarle (e salvarle insieme alla mesh) Dipende dallapplicazione!
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Problema difficile: u-v mapping Assegnare una coppia di coordinate texutres ad ogni vertice della mesh –In preprocessing u v u v
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Problema difficile: u-v mapping fatto a mano, o automatizzato
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a In OpenGL Come ogni altro attributo glTexCoord2d( u,v )
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Come si assegnano le coordinate texture ai vertici? Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice Texture RAM computazioni per frammento interpolo coordinate texture coordinate texture interpolate texture look-up coordinate texture (eventualmente trasformate) compreso: coordinate texture
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Come si assegnano le coordinate texture ai vertici? Due classo di soluzioni: –Assegnarle le coordinate textures al volo durante il rendering… –Precomputarle (e salvarle insieme alla mesh)
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Come si assegnano le coordinate texture ai vertici? Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice Texture RAM computazioni per frammento interpolo coordinate texture coordinate texture interpolate texture look-up coordinate texture produco coordinate texture a partire dalla posizione
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Create automaticamente Concetto: da (x,y,z) a (u,v) - Linearmente In coordinate oggetto o vista –(prima o dopo la trasformazione) Esempi:
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Create automaticamente Anche 1D 1D texture!
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Come si assegnano le coordinate texture ai vertici? Due classi di soluzioni: –Assegnarle le coordinate textures al volo durante il rendering… –Precomputarle (e salvarle insieme alla mesh)
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Environment mapping: sferico Environment map: una tessitura che memorizza il colore dellambiente riflesso da ogni normale della semisfera. Come coordinata tessitura, basta usare la normale trasformata!
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Environment mapping: sferico simula oggetto a specchio che riflette uno sfondo lontano simula un materiale complesso (condizioni di luce fisse)
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Environment mapping: cubico frontrightback below above left
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Environment mapping: cubico Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice Texture RAM computazioni per frammento interpolo coordinate texture 3D coordinate texture 3D interpolate proietto sul cubo, accedo alla faccia corrispondente calcolo coordinate texture 3D [-1,+1] x [-1,+1] x [-1,+1] come raggio di vista riflesso dalla normale
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Environment mapping: cubico frontrightback below above left
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Environment mapping: cubico e sferico Sferico: –un texel per ogni direzione nella semisfera proiettata su un cerchio –come coordinata texture uso la normale –per forza effetto "headlight": ruoto oggetto mentre punto vista rimane fermo Cubico –un texel per ogni direzione nella sfera proiet. sulla sup di un cubo –come coordinata texture uso la direzione di vista rifelssa dalla normale –punto di vista può ruotare intorno ad oggetto fermo
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Creazione Automatica Coordinate Texture glEnable(GL_TEXTURE_GEN_S); 1- abilitarla: 2- scegliere la modalita': glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, mode ) S, T, R, Q mode = GL_OBJECT_LINEAR GL_EYE_LINEAR GL_SPHERE_MAP computa le coord texture dalle pos nel sist di rif oggetto (prima della trasformazione) computa le coord texture dalle pos nel sist di rif camera (dopo la MODEL-VIEW) computa come coord texture il raggio di vista rifelsso – usa la normale (dopo la MODEL-VIEW)
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Creazione Automatica Coordinate Texture glTexGenfv(GL_S, GL_EYE_PLANE, v); 3- scegliere il piano S, T, R, Q EYE OBJECT o vettore di 4 elementi coordinata texture prodotta = v T pos_vertice (e' distanza da un piano!)
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Texture Mapping Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice Texture RAM computazioni per frammento interpolo coordinate texture coordinate texture interpolate compreso: coordinate texture (per vertice!) texture look-up
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a u Texture Look-up: fuori dai bordi: modo "clamp" if (u 1) u1; if (v 1) v1; 1 1 v
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Texture Look-up: fuori dai bordi: modo "repeat" u v 1 1 u u – [ u ] v v – [ v ]
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Tessiture ripetute Tipico utilizzo: Molto efficiente in spazio! Nota: deve essere TILEABLE
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a In OpenGL glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); o nota: setto per u e v separatemente sono parametri della tessitura. Ogni tessitura caricata in memoria ha i propri parametri.
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Texture Mapping Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice Texture RAM computazioni per frammento interpolo coordinate texture coordinate texture interpolate compreso: coordinate texture (per vertice!) texture look-up
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Texture Look-up Un frammento ha coordinate non intere (in texels) Texture Space Screen Space texture look-up
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a pixel Texture Look-up Texture SpaceScreen Space pixel texel un pixel = meno di un texel un pixel = più di un texel minification magnification
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Caso Magnification u v Soluzione 1: prendo il texel in cui casco (cioè il texel il cui centro è più vicino alle coordinate u,v del frammento) equivale ad arrotondare le coordinate texel ad interi "Nearest Filtering" 7.5
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Caso Magnification texture 128x128 Nearest Filtering: risutlato visivo "si vedono i texel !"
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Caso Magnification u v Soluzione 2: Medio il valore dei quattro texel più vicini Interpolazione Bilineare 7.5 Ripasso: interpolazione lineare (1D) interpolazione bi-lineare (2D) Formule...
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Caso Magnification texture 128x128 Bilinear Interpolation: risutlato visivo
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Caso Magnification Modo Nearest: –si vedono i texel –va bene se i bordi fra i texel sono utili –più veloce Modo Interpolazione Bilineare –di solito qualità migliore –può essere più lento –rischia di avere un effetto "sfuocato"
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Caso Minification Nearest Filtering Bilinear interpolation non risolve il problema
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Caso Minification: MIP-mapping MIP-map level 0 MIP-map level 1 MIP-map level 2 MIP-map level 3 MIP-map level 4 (un solo texel) MIP-mapping: "Multum In Parvo"
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Mipmap Math Definiamo un fattore di scala, =texels/pixel – è il massimo fra x e y –può variare entro lo stesso triangolo –può essere derivato dalle matrici di trasformazione –e calcolato nei vertici, interpolato nei frammenti il livello di mipmap da utilizzare è: log 2 –livello 0 = massima risoluzione –se livello<0 cosa significa? –nota: il livello non è necess. un numero intero
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Caso Minification: MIP-mapping Bilinear interpolation non risolve il problema MIP-mapping
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a Caso Minification: MIP-mapping altro esempio
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a In OpenGL glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); oppure decidere che tipo di magnificazione usare:
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a In OpenGL glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, modo ); modo = GL_NEAREST GL_LINEAR GL_NEAREST_MIPMAP_NEAREST GL_LINEAR_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_LINEAR dove decidere che tipo di minifacazione usare: interpolazione trilineare
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a In OpenGL Caricare sulla scheda i vari livelli di mipmapping. –uno per uno: glTexImage2D ( GL_TEXTURE_2D, i, // MIP-map level GL_RGB, // formato interno imageWidth, imageHeight, 0, // bordo GL_RGB, // formato nella RAM GL_UNSIGNED_BYTE, imageData);
M a r c o T a r i n i C o m p u t e r G r a p h i c s / 0 7 U n i v e r s i t à d e l l I n s u b r i a In OpenGL Caricare sulla scheda i vari livelli di mipmapping. –tutti insieme (con la liberira glu): glTexImage2D ( GL_TEXTURE_2D, 0, // MIP-map level GL_RGB, // formato interno imageWidth, imageHeight, 0, // bordo GL_RGB, // formato nella RAM GL_UNSIGNED_BYTE, imageData); gluBuild2DMipmaps (