[Iriad Kumbuli]
OpenGL Framebuffer
[Elementi di Grafica Digitale]
19/12/2015
1
Definizione
• Un buffer in OpenGL è un vettore bidimensionale di valori che corrispondono ad
un pixel in una finestra o un’immagine.
• Ogni buffer ha lo stesso numero di righe e
colonne.
19/12/2015
2
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.
19/12/2015
3
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.
19/12/2015
4
Tipi di OpenGL Buffers
• I buffer messi a disposizione da OpenGL sono:





19/12/2015
Color Buffer
Depth Buffer o Z-Buffer
Stencil Buffer
Accumulation Buffer
Auxiliary Buffer
5
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.
19/12/2015
6
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
19/12/2015
7
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.
19/12/2015
8
RGBA
• E' possibile richiedere a OpenGL più di un color
buffer, specificando l'opzione:
– Double Buffer
– Stereo Buffer
19/12/2015
9
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
19/12/2015
10
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.
19/12/2015
11
Depth Buffer
E' il buffer della profondità, ad ogni pixel è
associata una determinata profondità che
naturalmente dipende dalla sua posizione
all'interno della scena.
19/12/2015
12
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à.
19/12/2015
13
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.
19/12/2015
14
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.
19/12/2015
15
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.
19/12/2015
16
Utilizzando Stencil buffer
19/12/2015
17
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.
19/12/2015
18
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.
19/12/2015
19
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'interno
di forme irregolari.
19/12/2015
20
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.
19/12/2015
21
Accumulation Buffer
L'accumulation buffer è utilizzato per ottenere
effetti speciali mediante l'accumulazione di
diverse immagini.
19/12/2015
22
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.
19/12/2015
23
Utilizzando Accumulation buffer
19/12/2015
24
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.
19/12/2015
25
Stereo Buffer
• Il problema principale è il rendering
stereoscopico, ovvero presentare un’immagine
diversa ad ogni occhio.
• La soluzione è utilizzare lo stereo buffer.
19/12/2015
26
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.
19/12/2015
27
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.
19/12/2015
28
Auxiliary Buffer
Sono dei buffer di colore ausiliari che possono
essere utilizzati come “aree di lavoro”.
19/12/2015
29
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.
19/12/2015
30
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.
19/12/2015
31
OpenGL Framebuffer e scheda
video
• Per un display di 1024x768, la memoria totale
che ci serve è di 33792 kB di RAM.
• Ovvero:






19/12/2015
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
32
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.
19/12/2015
33
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
19/12/2015
34
Scarica

KumbuliFramebuffer