Sistemi Multimediali II Marco Tarini Università dellInsubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2004/05 Lezione 9: davanti e dietro. rimozione delle superfici nascoste
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 2/40 Rimozioni delle superfici nascoste Gli oggetti più vicini devono coprire quelli più lontani –gli oggetti lontani sono "occlusi" da quelli più vicini
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 3/40 Rimozioni delle superfici nascoste Non e' occlusion culling –che puo' solo rimuovere interi triangoli occlusi (magari a gruppi) –che è solo una ottimizzazione Back-face culling non basta –esempio: superfici non back-facing, non totalmente occluse ma parzialemnte occluse
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 4/40 Rimozioni delle superfici nascoste Soluzione 1: –dividere ogni triangolo parzialmente occluso in parte visibile e parte occlusa? facendo una operazione di clipping Come si trovano le coppie occluso/occlusore? Clipping di un triangolo e un altro? E dove, nel pipeline HW? SOLUZIONE IMPROPONIBILE
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 5/40 Rimozioni delle superfici nascoste Soluzione 2: –disegnare solo poligoni interi, ma nell'ordine giusto –noto come "algoritmo del pittore"
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 6/40 Algoritmo del pittore (depth sorting) Data una scena (composta da primitive) –ordinare le primitive per profondità dalla più remota alla più vicina al punto di vista –mandarle tutte (in ordine) Scomodo! Poco efficente! Pensare al progetto che abbiamo fatto.
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 7/40 Algoritmo del pittore (depth sorting) Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli computazioni per frammento set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice DOVE? x y z v0v0 v1v1 v2v2 v0v0 v1v1 v2v2 prima di mandare i triangoli. Fatto dalla CPU !
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 8/40 Algoritmo del pittore (depth sorting) Data una scena (composta da primitive) –ordinare le primitive per profondità –mandarle tutte (in ordine) Sorting! Complessità pesudolineare col numero di primitive. in comp graph, peggio di lineare vuol dire MALE Una primitiva non ha una sola profondità! piuttosto ha una profondità max e una min
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 9/40 Algoritmo del pittore (depth sorting) Ma va prima C o D? Ma poi, esiste sempre un "ordine giusto"? La primitiva A può essere disegnata per prima
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 10/40 Algoritmo del pittore (depth sorting) La primitiva A può essere disegnata per prima Ma va prima C o D? Ma poi, esiste sempre un "ordine giusto"? – NO! intersezioni – NO! cicli di sovrapposizioni
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 11/40 Algoritmo del pittore (depth sorting) Oneroso –sorting: (n log (n)) –e nella parte software! Mal adattato allo schema HW –deve lavorare in spazio occhio...ma prima della proiezione HW ?! –lavorare globalmente su tutta la scena prima di mandare la prima primitiva Scomodo all'atto pratico –le primitive sono già "ordinate" semanticamente (scene-graph) Test difficili –in acluni casi (quando gli intervalli min z e max z non sono disgiunti) Bisogna comunque fare clipping –in altri casi (intersezione, cicli)
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 12/40 Algoritmo del pittore (depth sorting) In pratica, viene usato solo quando e' facile ordinare preventivamente le primitive –in fase di preprocessing Esempio: terreno come campo di altezza
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 13/40 Rimozioni delle superfici nascoste Soluzione 3: –rimuovere le superfici nascoste con un TEST PER FRAMMENTO –algoritmo dello "Z-buffer" o "Depth-buffer"
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 14/40 Algoritmo dello z-buffer Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice Depth buffer computazioni per frammento profondità per ogni frammento RGB finale per ogni frammento
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 15/40 Algoritmo dello z-buffer Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice Depth buffer computazioni per frammento Transform. Metti la z finale come attributo aggiuntivo Interpola la z (come tutti gli attributi) depth test Frammento con screen coordinates (x,y) e attributo interpolato z: if ( z <= DepthBuffer[x,y] ) { Scrivi frammento DepthBuffer[x,y] = z } else scarta (KILL) frammento
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 16/40 Algoritmo dello z-buffer Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice Depth buffer computazioni per frammento ho bisogno di precisione! almeno 16 bits
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 17/40 Algoritmo dello z-buffer: esempio = =
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 18/40 Algoritmo dello z-buffer: proprietà Non dipende dall'ordine delle primitive Funziona su tutto –anche su: Operazione per frammento –Viene svolto nelle "computazioni per frammento" Adatto all'implementazione HW
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 19/40 Algoritmo dello z-buffer: difettucci Consumo memoria –depth buffer = mezzo screen buffer Sia legge che scrive su dati condivisi –(l'implementatore HW deve fare attenzione) Problemi di aliasing –quando la precisione non e' sufficiente –ad esempio, se si renderizzano due superfici parallele molto vicine Male con le superfici semitrasparenti –come vedremo
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 20/40 In OpenGL Devo Abilitare il depth test: glEnable(GL_DEPTH_TEST); primitive qui pixels tutto il pipeline (proiezione, setup, rasterizzazione...) stato di OpenGL manipolazioni di stato (es. settare la matrice) Posso anche decidere le condizioni per passare il test: glDepthFunc( GL_LESS ) GL_NEVER GL_EQUAL GL_LEQUAL GL_GREATER GL_NOTEQUAL GL_LESS GL_GEQUAL GL_ALWAYS
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 21/40 In OpenGL e SDL Devo creare il depth buffer: SDL_Init(SDL_INIT_VIDEO); SDL_SetVideoMode(640, 480, 0, SDL_OPENGL); SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); Quando cancello lo schermo, devo anche calcellare il depth buffer... glClear( GL_COLOR_BUFFER_BIT );... | GL_DEPTH_BUFFER_BIT