[iriad kumbuli] opengl framebuffer [elementi di grafica digitale] 28/01/2014 1

34
[Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 14/06/22 1

Upload: tiziana-martinelli

Post on 01-May-2015

227 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

[Iriad Kumbuli]OpenGL Framebuffer [Elementi di Grafica Digitale]

11/04/23 1

Page 2: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Definizione

• Un buffer in OpenGL è un vettore bi-dimensionale di valori che corrispondono ad un pixel in una finestra o un’immagine.

• Ogni buffer ha lo stesso numero di righe e colonne.

11/04/23 2

Page 3: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Ruolo del buffer in OpenGL

Il ruolo svolto dai buffer in OpenGL e' essenziale:

a seconda del loro ruolo essi memorizzano particolari informazioni su ogni pixel del

frame che si sta renderizzando.

11/04/23 3

Page 4: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

OpenGL Buffers

• OpenGL utilizza diversi buffer per mantenere in memoria le informazioni riguardanti i pixel dell'area di rendering.

• I buffer differiscono tra loro per il tipo di informazioni che contengono o per la loro posizione.

• L'insieme di tutti i buffer si definisce OpenGL Frame Buffer.

11/04/23 4

Page 5: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Tipi di OpenGL Buffers

• I buffer messi a disposizione da OpenGL sono:

Color Buffer Depth Buffer o Z-Buffer Stencil Buffer Accumulation Buffer Auxiliary Buffer

11/04/23 5

Page 6: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

OpenGL Buffers

• Le applicazioni non sono costrette ad utilizzare tutti i buffer disponibili.

• Ogni programma OpenGL prima di iniziare qualsiasi operazione di rendering si occupa di selezionare e attivare un Frame Buffer adatto alle proprie esigenze.

11/04/23 6

Page 7: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Color Buffer

• Il buffer del colore è senza dubbio il più importante. Esso è indispensabile dato che memorizza il colore di ogni pixel del frame.

• OpenGL mette a disposizione due tipi di color buffer:– RGBA– Index

11/04/23 7

Page 8: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

RGBA

• La modalità più diffusa è quella RGBA dato che consente di memorizzare le informazioni di colore per ogni componente (Red, Green, Blue e Alpha).

• Essa consente un maggiore numero di colori e la possibilità di creare effetti speciali.

11/04/23 8

Page 9: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

RGBA

• E' possibile richiedere a OpenGL più di un color buffer, specificando l'opzione:

– Double Buffer– Stereo Buffer

11/04/23 9

Page 10: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Double Buffering

• Quando chiediamo ad OpenGL un double buffer essa crea due buffer colore:

– Uno è il buffer principale, il Front buffer– L’altro è il Back buffer oppure il buffer

nascosto

11/04/23 10

Page 11: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Color Buffer e scheda video

• Quasi tutte le schede video oggi utilizzano un color buffer a 32 bit. Questo corrisponde a 4 byte per pixel.

• Per un display a 1024x768, un buffer richiede precisamente 3 MB di memoria video. Ricordando che ci sono due di questi buffer il requisito di memoria passa a 6MB.

11/04/23 11

Page 12: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Depth Buffer

E' il buffer della profondità, ad ogni pixel èassociata una determinata profondità che naturalmente dipende dalla sua posizione all'interno della scena.

11/04/23 12

Page 13: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Depth Buffer• Questo buffer è indispensabile per

visualizzare gli oggetti in base alla distanza dal punto di vista invece che in base all'ordine nel quale vengono disegnati.

• Il modo esatto per controllare la profondità del pixel è utilizzando la funzione: glDepthFunc()

• Di norma tutte le applicazioni OpenGL utilizzano il Depth Buffer e la sua dimensione è di solito di 16 bit con evidentemente 2^16 livelli di profondità.

11/04/23 13

Page 14: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Depth buffer e scheda grafica

• La precisione standard per il buffer della profondità è 24 bit per pixel. Questo produce un buffer di 2304 kB.

• Aggiungendo 2304 kB ai 6 MB che abbiamo utilizzato per il buffer di colore, arriviamo ad utilizzare attualmente 8448 kB di RAM della scheda video.

11/04/23 14

Page 15: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Stencil Buffer

Lo Stencil buffer permette di renderizzare sul frame buffer attraverso una maschera che ci consente di disegnare solo su alcune porzioni del frame.

11/04/23 15

Page 16: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Stencil Buffer

• Per creare una maschera dobbiamo renderizzare sullo stencil buffer, per ogni pixel che andremo a modificare verrà memorizzato un 1. Renderizzando sempre sullo stesso frame un nuovo oggetto possiamo indicare di modificare un pixel solo se il valore relativo al dato pixel nello stencil buffer è uguale 1 ovvero appartenente alla maschera.

• In questo modo il nuovo oggetto verrà renderizzato solo all'interno dell'area precedentemente delimitata.

11/04/23 16

Page 17: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Utilizzando Stencil buffer

11/04/23 17

Page 18: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Stencil Buffer e libreria OpenGL

• OpenGL ha un insieme abbastanza potente di operazioni stencil

• Possiamo incrementare, diminuire, sostituire o solo tenere il valore nello stencil buffer.

11/04/23 18

Page 19: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Stencil buffer e libreria OpenGL

• Le funzioni di OpenGL che sono usate in questo contesto sono glStencilFunc (), mettere le funzioni usate per la prova stencil e glStencilOp (), usato per specificare quale operazione compiere quando un frammento passa o fallisce la prova.

11/04/23 19

Page 20: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Stencil Buffer

• In base alla dimensione in bit dello stencil buffer è possibile creare diversi strati di maschere.

• Viene utilizzato per le ombre realistiche, riflessioni, filtri, rendering all'internodi forme irregolari.

11/04/23 20

Page 21: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Stencil buffer e scheda video

• Lo stencil buffer non richiede una massima precisione come gli altri buffer. La profondità standard è 8 bit per pixel. Questo vuole dire che lo stencil buffer aggiunge altri 768 kB al nostro consumo di memoria. Questo mette il nostro totale a 9216 kB.

• Su molte schede grafiche, lo stencil buffer è integrato col buffer di profondità. Quindi il 24 bit di Z-buffer e lo stencil buffer di 8 bit offrono un buffer singolo di 32 bit.

11/04/23 21

Page 22: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Accumulation Buffer

L'accumulation buffer è utilizzato per ottenere

effetti speciali mediante l'accumulazione di diverse immagini.

11/04/23 22

Page 23: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Accumulation Buffer

• L'accumulation buffer di norma ha un numero di bit per canale doppio rispetto a quello del color buffer ed è piuttosto lento dato che raramente è supportato direttamente in hardware.

• Viene utilizzato per soft shadows, motion blur, effetto depth field etc.

11/04/23 23

Page 24: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Utilizzando Accumulation buffer

11/04/23 24

Page 25: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Accumulation buffer e scheda video

• La risoluzione standard per il buffer di accumulazione è 64 bit per pixel. Al nostro esempio bisogna aggiungere 6 MB al nostro totale che ora è 15360 kB.

11/04/23 25

Page 26: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Stereo Buffer

• Il problema principale è il rendering stereoscopico, ovvero presentare un’immagine diversa ad ogni occhio.

• La soluzione è utilizzare lo stereo buffer.

11/04/23 26

Page 27: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Stereo Buffer

• Bisogna affermare che non è possibile controllare direttamente il rendering stereo da una applicazione OpenGL.

• l driver della scheda video forzeranno le applicazioni di essere avviati in modo stereo.

11/04/23 27

Page 28: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Stereo Buffer e scheda video

• L'inconveniente del modo stereo è che raddoppia efficacemente la grandezza del nostro buffer di colore. Quindi abbiamo bisogno di un buffer di colore per ogni occhio, (ed abbiamo bisogno anche del Front buffer e Back buffer).

• Di conseguenza, possiamo aggiungere altri 6MB al nostro utilizzo di memoria. Il nostro framebuffer adesso adopererà 21504 kB di RAM.

11/04/23 28

Page 29: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Auxiliary Buffer

Sono dei buffer di colore ausiliari che possono

essere utilizzati come “aree di lavoro”.

11/04/23 29

Page 30: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Auxiliary Buffer

• I buffer ausiliari devono il loro nome al fatto che loro non sono molto utili.

• I buffer ausiliari sono buffer di colore "provvisori" che possono essere usati solo come il buffer di colore regolare.

• Li possiamo usare per immagazzinare i risultati di rendering pesanti.

11/04/23 30

Page 31: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Auxiliary buffer e scheda video

• Utilizzare i buffer ausiliari è utile, ma bisogna ricordare che ogni buffer ausiliario aggiunge altri 3 Mb al nostro consumo di memoria.

• OpenGL definisce 4 buffer ausiliari, così abbiamo bisogno di 12 Mb di memoria supplementare per poter contenere l'OpenGL framebuffer intero.

11/04/23 31

Page 32: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

OpenGL Framebuffer e scheda video

• Per un display di 1024x768, la memoria totale che ci serve è di 33792 kB di RAM.

• Ovvero: 6144 kB, per l’utilizzo del Color Buffer 2304 kB, per il Depth Buffer 768 kB, per lo Stencil Buffer 6144 kB, per l’Accumulation Buffer 6144 kB, per lo Stereo Buffer 12288 kB, per l’Auxiliary Buffer

11/04/23 32

Page 33: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Riepilogo

• Ovviamente con la tecnologia di oggi queste cifre possono sembrare assurde perché le schede video montano anche 256/512 MB di memoria, e non hanno problemi di accumulation, stereo e auxiliary buffer.

11/04/23 33

Page 34: [Iriad Kumbuli] OpenGL Framebuffer [Elementi di Grafica Digitale] 28/01/2014 1

Bibliografia e sitografia

• Sito Web OpenGL ufficiale: http://www.opengl.org

• OpenGL Overview: http://openskills.info

• Articles about OpenGL: http://www.delphi3d.net

• OpenGL Superbible, Third edition di Richard S. Wright e Benjamin Lipchak

• OpenGL Programming Guide di Jackie Neider, Tom Davis, Mason Woo

11/04/23 34