I problemi del Real Time Lezione 19: Grafica in tempo reale Come visto nelle precedenti lezioni, i calcoli necessari a generare immagini 3D sono numerosi e complessi. I programmi di grafica 3D impiegano spesso diversi minuti (anche ore) per generare un singolo fotogramma di animazione. Eppure esistono numerose applicazioni in tempo reale. I problemi del Real Time I videogiochi a cui siamo abituati oggi permettono ai personaggi di muoversi in interi mondi tridimensionali. I problemi del Real Time I problemi del Real Time In numerose applicazioni vengono utilizzati simulatori (ad esempio i simulatri di volo) che riproducono immagini 3D realistiche in tempo reale. I problemi del Real Time I problemi che bisogna affrontare sono di 2 tipi: Problemi di banda Problemi di calcolo La realta' virtuale ci ha poi portato a definire mondi 3D in cui l'utente puo' muoversi. I problemi del Real Time I limiti del Bus I problemi di banda sono legati al trasferimento delle immagini dalla memoria del PC al video. Si verificano tanto nella grafica 2D che in quella 3D. Per comprendere i problemi di banda, occorre concentrarsi sull'architettura di un PC e comprendere il meccanismo di generazione delle immagini. I problemi di calcolo sono invece legati alla generazione delle immagini. Essi sono minimi nella grafica 2D, ma sono assai significativi nella grafica 3D. La componente di un PC che crea le immagini visualizzate sullo schermo viene chiamata scheda video. I limiti del Bus CPU Memoria Centrale I limiti del Bus Scheda Video CPU BUS I limiti del Bus CPU VRAM BUS Il processore del PC comunica con la memoria centrale e con la scheda video attraverso un dispositivo chiamato BUS. Normalmente ogni schdea video possiede una memoria privata (VRAM) incorporata. I limiti del Bus Scheda Video Memoria Centrale Scheda Video Memoria Centrale VRAM BUS La scheda video invia al monitor le immagini create in base alle informazioni presenti nella memoria privata. CPU Scheda Video Memoria Centrale VRAM BUS Il processore visualizza le immagini trasferendo i colori dei singoli pixel dalla memoria centrale alla memoria della scheda video passando per il BUS. I limiti del Bus CPU Memoria Centrale I limiti del Bus Scheda Video CPU VRAM Bit-BlitBUS BUS I limiti del Bus Il BUS e' in grado di trasferire i dati ad una velocita' limitata. I limiti del Bus 1024 x 768 x 16M colori = CPU 3 MB VRAM BUS La quantita' di memoria necessaria per memorizzare un'immagine puo' rendere la velocita' del BUS inadeguata a produrre animazioni fluide. I limiti del Bus BUS Scheda Video Memoria Centrale 3 MB x 60 Hz = 180 MB/s Il fatto di condividere un unico canale per accedere sia alla memoria centrale che alla scheda video causa ulteriori rallentamenti. I limiti del Bus Scheda Video CPU VRAM 32 MB/s L'operazione di trasferimento di un'immagine dalla memoria centrale alla memoria video viene chiamata Bit-Blit. Memoria Centrale Scheda Video Memoria Centrale VRAM AGP Per risolvere questo problema i PC di oggi hanno 2 Bus uno dei quali dedicato esclusivamente alla scheda video (AGP). Memoria Centrale Scheda Video CPU 32MB/s VRAM 1MB/s Questo BUS e' molto piu' veloce di quello standard. Essendo poi fisicamente separato puo' lavorare indipendentemente dalla memoria centrale. Il sincornismo video Il sincornismo video Il trasferimento rapido di dati dalla memoria centrale alla scheda video non è sufficiente a garantire la fluidita' delle immagini. Un'altra serie di problemi da risolvere e' quella del sincronismo con il video. Il monitor ridisegna l'immagine con un pennello ottico 60-100 volte al secondo. Il sincornismo video Il sincornismo video Scheda Video Scheda Video VRAM VRAM La scheda video legge dalla propria memoria il colore del pixel da inviare al monitor. Il sincornismo video Se si disegna un'immagine mentre il pennello ottico sta passando... Il sincornismo video La soluzione piu' semplice consiste nell'aspettare il V-Sync per incominciare a trasferire un'immagine. ... questa viene "mozzata"! La parte inferiore dell'immagine viene visualizzata nel primo fotogramma, l'immagine intera in quello successivo! La scheda video avvisa il processore (V-Sync) quando ha iniziato a trasferire una nuova immagine. La CPU ha quindi il tempo di comporre la nuova figura prima che quest'ultima venga raggiunta dal pennello ottico. Il sincornismo video Il sincornismo video L'attesa obbligata del V-Sync rallenta l'animazione. Puo' succedere che i vari elementi che compongono un'animazione si muovano a scatti. Scheda Video VRAM VRAM Se la scheda video ha memoria sufficiente per ospitare due immagini, si puo' adottare la tecnica chiamata doppio buffer. Il sincornismo video Il sincornismo video Scheda Video VRAM VRAM Scheda Video CPU Il processore compone l'immagine in una delle due aree mentre la scheda video invia al monitor l'altra... Il sincornismo video VRAM VRAM CPU ... Non appena l'immagine e' stata composta, la CPU scambia le 2 aree. La scheda video visualizza l'immagine precedente, mentre la CPU compone la nuova. Lo scambio avviene ad un V-Sync. Il sincornismo video Quando l'animazione e' destinata alla televisione si puo' aumentare la fluidita' utilizzando l'interlacciamento. I programmi possono sfruttare questo fatto generando prima le righe pari, poi quelle dispari. La televisione ha una FPS di 25 frame al secondo ma ritraccia l'immagine 50 volte al secondo. In questo modo si crea l'illusione di avere immagini a 50 fps su un mezzo che in realta' ne consente solo 25! La prima volta traccia le righe pari, poi quelle dispari. La pipeline La pipeline I problemi causati dal bus e dal sincronismo si verificano tanto per grafica 2D che 3D. I calcoli necessari a realizzare un'immagine 3D in tempo reale vengono suddivisi in fasi. La grafica 3D richiede pero' calcoli piu' complessi che complicano ulteriormente l'operazione di visualizzazione in tempo reale. La sequenza delle fasi viene chiamata pipeline. La pipeline La pipeline Costruzione Trasformazione Accettazione Illuminazione del modello del modello Trasformazione di visualizzazione Clipping Divisione per w Rasterizzazione Una versione piu' generale della pipeline di visualizzazione puo' includere fino ad 8 fasi. La pipeline Nel modalita' immediata il modello viene ricostruito da zero ad ogni frame. Nella modalita' trattenuta il modello precedentemente memorizzato viene mantenuto. Il programma provvede solamente a modificare le parti necessarie. Vediamo quali tecniche sono state sviluppate per accelerare i singoli stadi della pipeline. Nella fase di costruzione del modello vengono ricercati tutti gli oggetti che compongono un modello. Durante un'animazione un modello puo' cambiare. Esistono due modi con cui si possono aggiornare i cambiamenti: immediato e trattenuto (retained). La pipeline Nella fase di trasformazione del modello vengono applicate tutte le trasformazioni necessarie per calcolare le posizioni dei vertici dei singoli oggetti. In questa fase vengono effettuati numerosi prodotti vettore per matrice per determinare le posizioni dei vertici. La pipeline La pipeline Nella fase di accettazione s'individuano gli oggetti esterni al campo visivo e si eliminano le superfici nascoste. Lo stadio di trasformazione di visualizzazione calcola le proiezioni prospettiche dei vertici degli oggetti. Durante la fase di illuminazione vengono valutati i parametri necessari al calcolo delle luci (le direzioni delle normali alle superfici, le direzioni delle luci nei vari punti...). Non viene pero' ancora effettuato il calcolo dei colori dei pixel. La fase di clipping determina le parti degli oggetti che intersecano la finestra di visualizzazione. La pipeline La fase di rasterizzazione si occupa di: Disegnare le superfici Determinare le superfici visibili Applicare texture e luci La pipeline Si determina quindi il colore effettivo del pixel da disegnare considerando le texture ed effettuando il calcolo delle luci. S'inserisce quindi il pixel nella memoria della scheda video, considerando l'informazione contenuta nello z-buffer. La divisione per w, trasforma le coordinate omogenee in coordinate 2D. La pipeline Il disegno delle superfici esamina semplicemente tutti i triangoli corrispondenti agli oggetti e determina a quali pixel essi corrispondano. La determinazione delle superfici visibili viene generalmente realizzata mediante z-buffer. Corrisponde quindi a calcolare la distanza di ogni pixel dall'osservatore. Schede video accelerate L'ultimo stadio della pipeline e' quello che nasconde la complessita' maggiore. Esso richiede un numero enorme di operazioni tra numeri interi (uno per ogni pixel generato). Fino a pochi anni fa', questo era il punto piu' difficile e che richiedeva alla CPU la massima potenza di calcolo. Schede video accelerate Sono nate quindi numerose schede video accelerate capaci di rendere piu' veloce questo stadio di visualizzazione. Ormai quasi tutte le schede video presenti in commercio forniscono queste funzionalita'. In passato esistevano componenti addizionali che andavano acquistate separatamente (es. 3Dfx). Schede video accelerate Schede video accelerate Il tipo piu' semplice di accelerazione consiste nello z-buffer hardware. La CPU deve solo determinare il colore dei pixel e la loro distanza. La scheda video automaticamente determina le superfici visibili utilizzando lo z-buffer. La scheda deve pero' disporre di un maggiore quantitativo di memoria in modo da memorizzare anche lo z-buffer. Schede video accelerate Il livello di accelerazizone successivo consiste nello spostare la determinazione del colore dei pixel sulla scheda video. La scheda deve avere piu' memoria in quanto deve anche memorizzare le texture. In questo caso la scheda determina i colori dei pixel utilizzando le informazioni relative alle luci ed alle texture. Questo tipo di schede implementa in hardware interamente l'ultimo stadio della pipeline. Schede video accelerate Schede video accelerate Le prime schede accelerate erano in grado di elaborare tramite hardware solamente triangoli. L'accelerazione in hardware fatta direttamente dalla scheda video presenta numerosi vantaggi. I modelli attuali sono in grado di gestire anche oggetti piu' complessi come NURBS e superfici di Hermite. Con l'accelerazione hardware, nè il processore nè la memoria centrale restano coinvolti nel calcolo dell'ultimo stadio di visualizzazione. Schede video accelerate Le estensioni dei processori Il processore puo' quindi dedicare tutta la sua potenza di calcolo ai primi stadi della pipeline. Oltre alle schde video, anche i processori sono stati estesi per accelerare la pipeline di visualizzazione 3D. L'ultimo stadio e' quello piu' facilmente parallelizzabile. La scheda video puo' quindi implementare un'architettura parallela dedicata per questo tipo calcoli ottenendo un'efficienza superiore a quella raggiungibile dal solo processore. Due dei tentativi piu' importanti sono le istruzioni MMX e le estensioni SIMD. Le estensioni MMX Le estensioni MMX Un primo tentativo di accelerare la pipeline di visualizzazione nei PC domestici fu compiuto nel 1995 dall'INTEL con l'introduzione dei processori PENTIUM MMX. Queste istruzioni erano studiate per facilitare la decompressione di filmati MPEG e per velocizzare operazioni comuni come rotazioni e scalamenti di texture 2D. Questi processori includevano alcune istruzioni capaci accelerare i calcoli interi utilizzati nello stadio finale della pipeline. Permettevano inoltre un'implementazione software efficiente dello z-buffer. Le estensioni MMX Le estensioni MMX Sebbene l'idea fosse interessante queste estensioni non ebbero il successo atteso. Come accennato precedentemente, le stesse operazioni vengono fatte in modo migliore dalle schede video accelerate. Esse infatti erano poco utili in un contesto di grafica 3D, in quanto potevano intervenire in modo adeguato solamente nella fase di implementazione dello z-buffer software. Le estensioni MMX sono quindi oggi utilizzate solamente per la decompressione delle immagini JPEG e dei filmati MPEG. Le estensioni SIMD Le estensioni SIMD Le schede video possono accelerare solamente l'ultimo stadio della pipeline di visualizzazione. I processori Intel a partire dal pentium 3, e gli AMD a partire dal K6 - 3, hanno introdotto nuove istruzioni per questo scopo. Occorrono quindi altri meccanismi hardware per accelerare i primi 7 stadi della pipeline. Queste istruzioni prendono il nome di estensioni SIMD (single instruction, multiple data) in quanto permettono di eseguire piu' calcoli con un'unica istruzione in linguaggio macchina. Le estensioni SIMD Le soluzioni proposte dalle due principali marche di processori sono differenti e non sono compatibili tra loro. Entrambe si basano sullo stesso principio: facilitare i calcoli vettoriali e matriciali. Le estensioni SIMD Le estensioni SIMD Le istruzioni SIMD permettono di realizzare con una singola istruzione in linguaggio macchina una somma o un prodotto matriciale o vettoriale. Vengono solamente considerati vettori a 4 componenti e matrici di dimensione 4x4: quelli necessari per effettuare le trasformazioni 3D in coordinate omogenee. Gli standard software Grazie a queste estensioni si riesce a velocizzare di un ordine di grandezza i calcoli necessari nelle prime fasi della pipeline. Le possibilita' di accelerazione fornite dalle schede video variano da modello a modello. In questo modo si possono considerare anche modelli con migliaia di poligoni ed un numero elevato di trasformazioni. Anche i set d'istruzioni per l'accelerazione fornite dai processori non sono compatibili. Occorre quindi un meccanismo uniforme per rendere queste estensioni diponibili ai programmi. Gli standard software Esistono due standard per rendere disponibili le accelerazioni grafiche ai programmi: OpenGL DirectX OpenGL OpenGL e' uno standard aperto per la visualizzazione 3D indipendente dal sistema operativo, dal linguaggio di programmazione e dall'architettura utilizzata. Esiste per Windows e per UNIX, tanto per PC che per macchine piu' specializzate (come ad esempio le Silcon Graphics). DirectX Le DirectX sono un insieme di primitive disponibili in ambiente Windows per facilitare la realizzazione di videogiochi. Includono primitive per il suono, per la grafica, l'accesso alla rete, al Joystick.... Direct3D e' la componente delle DirectX che si occupa della grafica tridimensionale. Gli standard software Entrambi i meccanismi si basano sullo stesso principio: definiscono una serie di funzionalita' che i programmi possono utilizzare per realizzare grafica 3D. Ogni costruttore di scheda grafica o processore fornisce i suoi driver che implementano le funzionalita' richieste sfruttando al meglio le ottimizzazioni messe a disposizione dai propri prodotti. OpenGL Fornisce tutte le primitive necessarie per inserire oggetti nella pipeline e per visualizzarli. Permette di inserire texture, luci e materiali (di tipo Phong). E' meno efficiente delle DirectX, ma trova maggiore compatibilità con sistemi non Windows . DirectX Le DirectX esistono solo su PC ed esclusivamente in ambiente Windows. Consentono di utilizzare superfici complesse con texture e vari meccanismi di illuminazione. DirectX Essendo specifiche per Windows, l'hardware delle schede grafiche e' ottimizzato per la grafica DirectX. Sono piu' potenti ed efficienti rispetto all' OpenGL, ma meno compatibili.