Computer Graphics
Marco Tarini
Università dell’Insubria
Corso di Laurea in Informatica Anno Accademico 2015/16
Lezione 3: vector and point algebra
fra m m en ti (c an di da ti pi xe ls )
Rasterization based pipeline
Ve rti ci (p un ti in R
3) Ve rti ci pr oi et ta ti (p un ti in R
2)
Z
RASTERIZZAZIONE
z
y
x v
0v
1v
2v
0v
1v
2co m pu ta zi on i pe r v er tic e sc re en b uf fe r
computazioni
per frammento
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 6 / 1 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
fra m m en ti (c an di da ti pi xe ls )
Rasterization based pipeline (più in dettaglio 1/2)
Ve rti ci (p un ti in R
3) Ve rti ci pr oi et ta ti (p un ti in R
2)
Z
RASTERIZZAZIONE
z
y
x v
0v
1v
2v
0v
1v
2co m pu ta zi on i pe r v er tic e pi xe l f in al i
co m pu ta zi on i pe r f ra m m en to sc re en b uf fe r
ou tp ut co m bi ne r
fra m m en ti (c an di da ti pi xe ls )
Rasterization based pipeline (più in dettaglio 2/2)
Ve rti ci (p un ti in R
3) Ve rti ci pr oi et ta ti (p un ti in R
2)
Z
rasterizer segmenti
z
y
x v
0v
1v
2v
0v
1v
2rasterizer triangoli rasterizer
punti
co m pu ta zi on i pe r v er tic e
qui “transform”
Point Lines
om pu ta z C rim va pe r p iti Tris pi xe l f in al i
co m pu ta zi on i pe r f ra m m en to sc re en b uf fe r
ou tp ut co m bi ne r
al video
• Per ogni vertice di ogni primitiva:
• Questa operaz è un caso particolare di
TRASFORMAZIONE SPAZIALE, che vedremo
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 6 / 1 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Transform
z
y
x v
0v
1v
2v
0v
1v
2 coordinate in cuisono definiti i vertici dell’oggetto (“object coords”)
screen Coordinates
stage programmabili: vengono eseguiti dei programmi arbitrari detti shaders.
fra m m en ti (c an di da ti pi xe ls )
Rasterization based pipeline
Ve rti ci (p un ti in R
3) Ve rti ci pr oi et ta ti (p un ti in R
2)
Z
rasterizer segmenti rasterizer triangoli rasterizer
punti
co m pu ta zi on i pe r v er tic e qui
Point Lines
om pu ta z C rim va pe r p iti Tris pi xe l f in al i
co m pu ta zi on i pe r f ra m m en to sc re en b uf fe r
ou tp ut co m bi ne r
e qui opzionalmente qui
stage Hard Wired:
no flessibilità, efficienza, ottimiz HW
Shaders
• Programmi caricati sulla scheda video
– vertex shader, geometry shader, fragment shader…
• Eseguono le operazioni preposte in ogni stage – per es: vertex shader: transform dei vertici
– per es: fragment shader: lighting
• A basso livello: scritti in un assembler specifico – per il linguaggio macchina della scheda video
– che ha un Instruction Set specializzato
• Li scriviamo in un ling. ad alto livello: es GLSL ! – verrà compilato in quell’assembler
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 6 / 1 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
GLSL
• (fa parte delle specifiche OpenGL)
• Linguaggio alto livello per scrivere shaders (di tutti i tipi: per-vertice, per-frammento…)
• Simile al C (C-like)
• Sintassi comoda per gestire l’algebra di punti e vettori , che stiamo per vedere
• (quasi) la stessa identica sintassi è adottata da alcune librerie C++ : es. «GLM»
e alcuni linguaggi simili: HLSL (by Microsoft)
Algebra per CG
• Qui per algebra intendiamo alcuni insiemi di entità e le operazioni definite su di loro
• Le nostre entità e operazioni hanno una immediata interpretazione «intuitiva», «spaziale» in 3D (o in 2D)
– (si possono vedere con gli occhi analitici della matematica o con gli occhi intutivi della mente)
La [ natura ] è scritta in questo grandissimo libro che continuamente ci sta aperto innanzi agli occhi, io dico l’universo, ma non si può intendere se prima non s’impara a intender la lingua e conoscer i caratteri nei quali è scritto. Egli è scritto in lingua matematica.
Galileo
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 6 / 1 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Algebra per CG
• Di ogni entità ci interessa:
– una interpretazione 3D/2D intutiva (semantica intuitiva) – come rappresentarle internamente, con quali dati – cioè con quale «tipo» rappresentarle in GLSL
• Di ogni op ci interessa:
– una interpretazione 3D/2D intuitiva (semantica intuitiva) – come sono implementate, con quali op matematiche
(semantica operazionale) – proprietà
– notazione: come si scrivono «sulla carta» (una sintassi)
– notazione: come si scrivono in GLSL (un’altra sintassi)
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 6 / 1 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Algebra dello Spazio affine
• Tre entità – scalari – vettori – punti
attributi:
lunghezza, direzione unico attributo:
la posizione, rispetto ad un
sistema di riferimento
(vedremo)
• In GLSL – float – vec3 – vec3
tre float componenti: x,y,z
(immaginiamoli pure come come campi
di tipo float in una classe chiamata vec3)
Spazio affine: le due operazioni sui punti
• Somma (punto , vettore ) → punto
• Sottrazione (punto , punto) → vettore
punto a
punto ( a + v ) vettore
v
punto a
punto b vettore
( b – a ) remember:
“punta meno coda”
:-)
l’op inversa
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 6 / 1 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Algebra: Spazio vettoriale
• Due entità:
– scalari – vettori
• Operazioni (1/2)
– somma e prodotto tra scalari (ovviamente)
– somma fra vettori
– prodotto vettore x scalare → vettore
(commutativo)
(lo spazio vettoriale è chiuso rispetto a:
somma vettoriale e al prodotto con scalari)
Ora concentriamoci solo sui vettori e scalari.
I vettori formano uno spazio vettoriale
Operazioni (2/2)
• Prodotto scalare (fra vettori)
– aka prodotto dot ( dot-product , o inner-product ) – vettore x vettore → scalare
• Prodotto vettoriale (fra vettori) <=== solo in R 3
– aka prodotto cross ( cross-product, outer-product ) – aka prodotto esterno
– vettore x vettore → vettore
• Norma
– vettore → scalare
• Normalizzazione
– vettore → vettore
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 6 / 1 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Prodotto scalare
• Prodotto Scalare ("dot-product", "inner product") : vettore x vettore → scalare
) ( ) ( )
( ) (
v u v
u v u
w v w u w v u
u v v u
⋅
=
⋅
=
⋅
⋅ +
⋅
=
⋅ +
⋅
=
⋅
α α
α commuta lineare 1/2 lineare 2/2 Proprietà
z z y y x
x z
y x z
y
x α α β β β α β α β α β
α , , ) ⋅ ( , , ) = + + (
Prodotto scalare
• Prodotto Scalare ("dot-product", "inner product") : vettore x vettore → scalare
( ) ( )
) 0 , 0 , 0 ( 0 ⇔ =
=
⋅
−
⋅
−
=
−
⋅
=
v v
v
Q P Q P Q
P
v v v
nota:
quindi, per calcolare una distanza tra punti:
riscrittura della norma:
Proprietà
z z y y x
x z
y x z
y
x α α β β β α β α β α β
α , , ) ⋅ ( , , ) = + +
(
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 6 / 1 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Prodotto scalare
• Prodotto Scalare ("dot-product", "inner product") : vettore x vettore → scalare
z z y y x
x z
y x z
y
x α α β β β α β α β α β
α , , ) ⋅ ( , , ) = + + (
θ θ
cos 0
cos
=
⋅
⇔
=
⋅
=
⋅
v u
v u v
u
v u v u
e ortogonali
Proprietà
e, se u e v sono unitari:
quindi se u e v non sono nulli:
molto utilmente:
Altre operazioni che possono tornare utili (anche se non sono canoniche)
• Prodotto “componente x componente”
fra punti e/o vettori
(component-wise product)
• O in effetti quasiasi operaz fra scalari eseguita “componente per componente”
(divisione, etc)
=
⋅
z z
y y
x x
z y x
z y x
β α
β α
β α β
β β α
α
α
Sintassi nei linguaggi GLSL (e simili, es HLSL)
• tipi base:
• operazioni:
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 6 / 1 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
vec3 float
punto o vettore
un vett di 3 coordinate x,y,z uno scalare
vec3 a , b ; float k;
vec3 c = a + b; // somma di vettori
vec3 e = k * a; // prodotto vettore per scalare vec3 d = a * b; // prodotto componente x componente float f = dot( a, b ); // prodotto dot
vedi anche note sul sito per più esempi (lez 3)
Nei linguaggi GLSL (e HLSL)
• tipi base:
• operazioni:
vec3 float
un vett di 3 coordinate x,y,z, usato per punti o vettori
uno scalare
vec3 a , b ;
vec3 d = a <op> b; // la <op> fatta comp. per comp.
// per es, con + - * /
float c = length( a ) ; // norma (euclidea) di a vec3 d = normalize( a ); // normalizzazione
// (divisione per la norma) // equivalente a
vec3 d = a / length( a );
Disegno per esercizio 2 (vedi note sul sito)
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 6 / 1 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a