Comments
Description
Transcript
ppt
Computer Graphics Lezione 12: realismo a buon prezzo: il texture Mapping Università dell’Insubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2006/07 Marco Tarini rasterizer punti setup rasterizer triangoli setup rasterizer segmenti computazioni per frammento setup Frammenti & attributi interpolati Vertici poriettati & attributi computati computazioni per vertice Vertici & loro attributi Memoria RAM nelle schede grafiche Screen buffer (RGBA) Screen buffer 2 (RGBA) Depth buffer Texture RAM Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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" – ... Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Tipica applicazione: rimappare immagini sulla geometria = + geometria 3D (insieme di quadrilateri) RGB texture 2D (color-map) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Altri esempi di color-map Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Altro esempio di color-map + = Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Texture Mapping: Storia • 1974 introdotto da Ed Catmull – nella sua Phd Thesis Ed Catmull (MEGA-MEGAGURU) • 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 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Notazione v 1.0 Texture Space (o "spazio parametrico" o "spazio u-v" o "spazio s-t") 512 texels Texture 2D 1.0 u 1024 texels texel Una Texutre e' definita nella regione [0,1] x [0,1] dello "spazio parametrico" Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Texture Mapping • Ad vertice (di ogni triangolo) assegno le sue coordinate u,v nello spazio tessitura v x1,y1 u1,v1 x0,y0 u0,v0 x2,y2 posizione del 1mo vertice u1,v1 u0,v0 attributi del 1mo vertice u2,v2 u2,v2 Screen Space u Texture Space Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Texture Mapping • Così in pratica definisco un mapping fra il triangolo 3D e un triangolo di tessitura Screen Space Texture Space Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Texture Mapping • Ogni frammento ha le sue coordinate u,v nello spazio tessitura texture look-up Screen Space Texture Space Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria compreso: coordinate texture (per vertice!) rasterizer punti setup rasterizer triangoli setup rasterizer segmenti interpolo coordinate texture computazioni per frammento setup Frammenti & attributi interpolati Vertici poriettati & attributi computati computazioni per vertice Vertici & loro attributi Texture Mapping Screen buffer texture look-up coordinate texture interpolate Texture RAM Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Problema: interpolazione lineare coordinate texture R3 R2 f( v3 ) V3 p proiezione f f(p) f( v2 ) V2 V1 p ha coord. baricentriche a,b,c nel triangolo v1 v2 v3 f( v1 ) f(p) ha coord. baricentriche a,b,c nel triangolo f(v1) f(v2) f(v3) • Non vale per la proiezione prospettica! – era solo una approssimazione – andava bene quando interpolavamo colori, normali – non va bene quando interpoliamo coordinate texture... Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Problema: interpolazione lineare coordinate texture v 1 • Esempio: u,v= (1,0) 1 u1,v1= (1,1) u1,v1= (0,0) u1,v1= (0,1) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria u Problema: interpolazione lineare coordinate texture • Esempio: Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Soluzione: Correzione Prospettica • p ha coordinate baricentriche c0 c1 c2 p = c0 v0 + c1v1 + c2v2 V1 A1,B1 ... V0 = ( x0 , y0 , z0 , w0 ) p V2 A2,B2 ... A0,B0 ... attributi di p: (senza considerare la "normalizzazione affine") Ap = c0 A0 + c1A1 + c2A2 Bp = c0 B0 + c1B1 + c2B2 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Soluzione: Correzione Prospettica • p ha coordinate baricentriche c0 c1 c2 p = c0 v0 + c1v1 + c2v2 V1 A1,B1 ... V0 = ( x0 , y0 , z0 , w0 ) p V2 A2,B2 ... A0,B0 ... attributi di p: (senza considerare la "normalizzazione affine") A0 A1 A2 Ap = c0 A0 + c1A1 + c2A2 w0 w1 w2 Ap = 1 Ap = c0 A0 + c1A11 + c2A12 w0 w1 w2 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria attributo originale A applico transofrm. poi calcolo: A' = A / w e w' = 1 / w Marco Tarini ‧ Computer rasterizer punti setup rasterizer triangoli setup rasterizer segmenti interpolo A' e w' computazioni per frammento setup Frammenti & attributi interpolati Vertici poriettati & attributi computati computazioni per vertice Vertici & loro attributi Soluzione: Correzione Prospettica Screen buffer A0 A1 A2 c0 + c1 + c2 attributo w0 w1 w2 finale del frammento: Ap = 1 1 1 A' / w' c0 w + c 1 + c2 w w 0 1 2 Graphics ‧ 2006/07 ‧ Università dell’Insubria Correzione Prospettica • Senza • Con Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria L O A rasterizer punti setup rasterizer triangoli setup rasterizer segmenti computazioni per frammento setup Frammenti & attributi interpolati Vertici poriettati & attributi computati computazioni per vertice Vertici & loro attributi Nota: la tessitura va caricata Screen buffer D Texture RAM Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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! Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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); Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria compreso: coordinate texture (per vertice!) rasterizer punti setup rasterizer triangoli setup rasterizer segmenti interpolo coordinate texture computazioni per frammento setup Frammenti & attributi interpolati Vertici poriettati & attributi computati computazioni per vertice Vertici & loro attributi Come si assegnano le coordinate texture ai vertici? Screen buffer texture look-up coordinate texture interpolate Texture RAM Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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 dall’applicazione! Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Problema difficile: u-v mapping • Assegnare una coppia di coordinate texutres ad ogni vertice della mesh – In preprocessing v v u u Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Problema difficile: u-v mapping fatto a mano, o automatizzato Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria In OpenGL • Come ogni altro attributo glTexCoord2d( u,v ) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria compreso: coordinate texture coordinate texture (eventualmente trasformate) rasterizer punti setup rasterizer triangoli setup rasterizer segmenti interpolo coordinate texture computazioni per frammento setup Frammenti & attributi interpolati Vertici poriettati & attributi computati computazioni per vertice Vertici & loro attributi Come si assegnano le coordinate texture ai vertici? Screen buffer texture look-up coordinate texture interpolate Texture RAM Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria produco coordinate texture a partire dalla posizione coordinate texture rasterizer punti setup rasterizer triangoli setup rasterizer segmenti interpolo coordinate texture computazioni per frammento setup Frammenti & attributi interpolati Vertici poriettati & attributi computati computazioni per vertice Vertici & loro attributi Come si assegnano le coordinate texture ai vertici? Screen buffer texture look-up coordinate texture interpolate Texture RAM Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Create automaticamente • Concetto: da (x,y,z) a (u,v) - Linearmente • In coordinate oggetto o vista – (prima o dopo la trasformazione) • Esempi: Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Create automaticamente • Anche 1D 1D texture! Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Environment mapping: sferico Environment map: una tessitura che memorizza il colore dell’ambiente “riflesso” da ogni normale della semisfera. Come coordinata tessitura, basta usare la normale trasformata! Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Environment mapping: sferico simula oggetto a specchio che riflette uno sfondo lontano simula un materiale complesso (condizioni di luce fisse) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Environment mapping: cubico above left front right back below Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria calcolo coordinate texture 3D [-1,+1] x [-1,+1] x [-1,+1] come raggio di vista riflesso dalla normale rasterizer punti setup rasterizer triangoli setup rasterizer segmenti interpolo coordinate texture 3D computazioni per frammento setup Frammenti & attributi interpolati Vertici poriettati & attributi computati computazioni per vertice Vertici & loro attributi Environment mapping: cubico Screen buffer proietto sul cubo, accedo alla faccia corrispondente coordinate texture 3D interpolate Texture RAM Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Environment mapping: cubico above left front right back below Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Environment mapping: cubico e sferico • Sferico: – un texel per ogni direzione nella semisfera • proiettata su un cerchio • Cubico – un texel per ogni direzione nella sfera • proiet. sulla sup di un cubo – come coordinata texture uso la normale – come coordinata texture uso la direzione di vista rifelssa dalla normale – per forza effetto "headlight": – punto di vista può ruotare intorno ad oggetto fermo • ruoto oggetto mentre punto vista rimane fermo Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Creazione Automatica Coordinate Texture S, T, R, Q 1- abilitarla: glEnable(GL_TEXTURE_GEN_S); 2- scegliere la modalita': glTexGeni(GL_S , GL_TEXTURE_GEN_MODE , mode ) GL_OBJECT_LINEAR mode = 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) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Creazione Automatica Coordinate Texture 3- scegliere il piano S, T, R, Q glTexGenfv(GL_S, GL_EYE_PLANE , v); EYE o OBJECT vettore di 4 elementi coordinata texture prodotta = vT • pos_vertice (e' distanza da un piano!) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria compreso: coordinate texture (per vertice!) rasterizer punti setup rasterizer triangoli setup rasterizer segmenti interpolo coordinate texture computazioni per frammento setup Frammenti & attributi interpolati Vertici poriettati & attributi computati computazioni per vertice Vertici & loro attributi Texture Mapping Screen buffer texture look-up coordinate texture interpolate Texture RAM Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Texture Look-up: fuori dai bordi: modo "clamp" v 1 1 u if (u<0) u←0; if (u>1) u←1; if (v<0) v←0; if (v>1) v←1; Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Texture Look-up: fuori dai bordi: modo "repeat" v 1 1 u u ← u–[u] v ← v–[v] Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Tessiture ripetute • Tipico utilizzo: Nota: deve essere TILEABLE Molto efficiente in spazio! Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria In OpenGL glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); sono parametri della tessitura. Ogni tessitura caricata in memoria ha i propri parametri. nota: setto per u e v separatemente o glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); esempio: repeat sulla u e clamp sulla v Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria compreso: coordinate texture (per vertice!) rasterizer punti setup rasterizer triangoli setup rasterizer segmenti interpolo coordinate texture computazioni per frammento setup Frammenti & attributi interpolati Vertici poriettati & attributi computati computazioni per vertice Vertici & loro attributi Texture Mapping Screen buffer texture look-up coordinate texture interpolate Texture RAM Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Texture Look-up • Un frammento ha coordinate non intere (in texels) texture look-up Screen Space Texture Space Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Texture Look-up texel pixel un pixel = meno di un texel magnification Screen Space Texture Space pixel un pixel = più di un texel minification Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Caso Magnification v Soluzione 1: prendo il texel in cui casco 7.5 (cioè il texel il cui centro è più vicino alle coordinate u,v del frammento) 5.5 equivale ad arrotondare le coordinate texel ad interi "Nearest Filtering" 6.5 4.5 3.5 2.5 1.5 0.5 0.5 1.5 2.5 3.5 4.5 5.5 6.5 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 7.5 u Caso Magnification Nearest Filtering: risutlato visivo texture 128x128 "si vedono i texel !" Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Caso Magnification v Soluzione 2: Medio il valore dei quattro texel più vicini 7.5 6.5 5.5 Ripasso: interpolazione lineare (1D) interpolazione bi-lineare (2D) 4.5 3.5 Formule... 2.5 Interpolazione Bilineare 1.5 0.5 0.5 1.5 2.5 3.5 4.5 5.5 6.5 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 7.5 u Caso Magnification Bilinear Interpolation: risutlato visivo texture 128x128 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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" Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Caso Minification Nearest Filtering Bilinear interpolation non risolve il problema Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Caso Minification: MIP-mapping MIP-mapping: "Multum In Parvo" MIP-map level 2 MIP-map level 3 MIP-map level 1 MIP-map level 0 MIP-map level 4 (un solo texel) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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 è: log2 – livello 0 = massima risoluzione – se livello<0 cosa significa? – nota: il livello non è necess. un numero intero Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Caso Minification: MIP-mapping Bilinear interpolation non risolve il problema MIP-mapping Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Caso Minification: MIP-mapping 5 4 3 2 1 altro esempio 0 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria In OpenGL decidere che tipo di magnificazione usare: glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); oppure glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria In OpenGL decidere che tipo di minifacazione usare: glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, modo ); dove modo = GL_NEAREST GL_LINEAR GL_NEAREST_MIPMAP_NEAREST GL_LINEAR_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_LINEAR interpolazione trilineare Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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); Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria In OpenGL • Caricare sulla scheda i vari livelli di mipmapping. – tutti insieme (con la liberira glu): gluBuild2DMipmaps 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); Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria