Differences

This shows you the differences between two versions of the page.

Link to this comparison view

egc:laboratoare:07 [2020/11/21 15:59]
andrei.lambru
egc:laboratoare:07 [2022/11/22 09:38] (current)
andrei.lambru
Line 1: Line 1:
 ===== Laboratorul 07 ===== ===== Laboratorul 07 =====
 +
 +
 +**Video Laborator 7**: https://​youtu.be/​y1st9QxXbn8 \\
 +**Autor**: [[andrei.lambru@upb.ro | Cristian Lambru]]
  
 ==== Iluminare folosind GLSL ==== ==== Iluminare folosind GLSL ====
Line 5: Line 9:
 Lumina este un factor foarte important în redarea cât mai realistă ​ a unei scene 3D. Împreună cu proprietățile de material ale unui obiect, lumina determină modalitatea în care obiectul este afișat în scena 3D. Lumina este un factor foarte important în redarea cât mai realistă ​ a unei scene 3D. Împreună cu proprietățile de material ale unui obiect, lumina determină modalitatea în care obiectul este afișat în scena 3D.
  
-Există mai multe modele empirice pentru calculul reflexiei luminii într-un punct al unei suprafețe: Phong ([[http://​www.cs.northwestern.edu/​~ago820/​cs395/​Papers/​Phong_1975.pdf|1975]]),​ Blinn ([[https://​www.microsoft.com/​en-us/​research/​wp-content/​uploads/​1977/​01/​p192-blinn.pdf|1977]]),​ Oren-Nayar ([[http://​www1.cs.columbia.edu/​CAVE/​publications/​pdfs/​Oren_SIGGRAPH94.pdf|1994]]),​ Cook-Torrance ([[http://​inst.eecs.berkeley.edu/​~cs283/​sp13/​lectures/​cookpaper.pdf|1981]]),​ Lambert ([[https://​ia600204.us.archive.org/​35/​items/​bub_gb_zmpJAAAAYAAJ/​bub_gb_zmpJAAAAYAAJ.pdf|1760]]),​ etc (la curs veți discuta despre modelul Lambert și despre modelul Phong).+Există mai multe modele empirice pentru calculul reflexiei luminii într-un punct al unei suprafețe: Phong ([[http://​www.cs.northwestern.edu/​~ago820/​cs395/​Papers/​Phong_1975.pdf|1975]]),​ Blinn ([[https://​www.microsoft.com/​en-us/​research/​wp-content/​uploads/​1977/​01/​p192-blinn.pdf|1977]]),​ Oren-Nayar ([[http://​www1.cs.columbia.edu/​CAVE/​publications/​pdfs/​Oren_SIGGRAPH94.pdf|1994]]),​ Cook-Torrance ([[http://​inst.eecs.berkeley.edu/​~cs283/​sp13/​lectures/​cookpaper.pdf|1981]]),​ Lambert ([[https://​ia600204.us.archive.org/​35/​items/​bub_gb_zmpJAAAAYAAJ/​bub_gb_zmpJAAAAYAAJ.pdf|1760]]),​ etc (la curs veți discuta despre modelul Lambert, Phong și Blinn).
  
 ==== Modelul Phong pentru calculul reflexiei luminii ==== ==== Modelul Phong pentru calculul reflexiei luminii ====
  
-Intensitatea luminii care este reflectată într-un punct de pe suprafață către observator este normalizată ​în intervalul \( [0,1] \), unde 0 reprezintă situația în care lumina care ajunge în punctul respectiv nu este reflectată deloc către observator și 1 este situația în care tot fasciculul de lumină care ajunge in punctul respectiv este reflectat către observator. Pentru a calcula această intensitate în punctul ales vom folosi ​un model de reflexie ​care extinde modelul Phong și care conține ​un total de 4 componente ​ale intensității luminii ​pentru a descrie intensitatea finală in punctul de pe suprafață:+Ca model de reflexie vom prezenta ​în continuare ​un model care extinde modelul ​de reflexie ​Phong și care conține ​toate cele 4 componente ​care pot fi folosite ​pentru a calcula iluminarea. Pentru a obține astfel culoarea într-un punct al unei suprafețe vom avea următoarele componente ​
   * Componenta emisivă   * Componenta emisivă
   * Componenta ambientală   * Componenta ambientală
   * Componenta difuză   * Componenta difuză
   * Componenta speculară   * Componenta speculară
-Contribuția fiecărei componente este calculată ca o combinație dintre proprietățile de material ale obiectului (factorul de strălucire și de difuzie al materialului) și proprietățile sursei de lumină (intensitatea ​sursei de lumină, poziția sursei de lumină).+Contribuția fiecărei componente este calculată ca o combinație dintre proprietățile de material ale obiectului (factorul de strălucire și de difuzie al materialului) și proprietățile sursei de lumină (culoarea ​sursei de lumină, poziția sursei de lumină).
  
-Astfel, ​intensitatea ​finală a luminii într-un punct aparținând unei suprafețe este:+Astfel, ​culoarea ​finală a luminii într-un punct aparținând unei suprafețe este:
  
 <code glsl> <code glsl>
-     float intensitate ​= emisiva + ambientala + difuza + speculara; # GLSL+     culoare ​= emisiva + ambientala + difuza + speculara; # GLSL
 </​code>​ </​code>​
  
Line 26: Line 30:
 ==== Componenta emisivă ==== ==== Componenta emisivă ====
  
-Aceasta reprezintă lumina emisă de un obiect și nu ține cont de nicio sursă de lumină. ​Dacă un obiect care are o anumită culoare emisivă s-ar afla într-o scenă complet întunecată atunci el ar apărea exact cu această culoare. +Aceasta reprezintă lumina emisă de un obiect și nu ține cont de nicio sursă de lumină. O utilizare des întâlnită pentru componenta emisivă este aceea de a simula ​obiectele care au strălucire proprie (de ex: sursele de lumina precum neonul sau televizorul).
- +
-O utilizare des întâlnită pentru componenta emisivă este aceea de a simula strălucirea unui obiect.+
  
 Avem astfel: Avem astfel:
 <code glsl> ​ <code glsl> ​
-     float emisiva = Ke; # GLSL+     ​emisiva = Ke; # GLSL
 </​code>​ </​code>​
 <note tip> <note tip>
-  * Ke – intensitatea ​emisivă a materialului+  * Ke – culoarea ​emisivă a materialului
 </​note>​ </​note>​
  
 ==== Componenta ambientală ==== ==== Componenta ambientală ====
  
-Aceasta reprezintă lumina reflectată de catre obiectele din scenă de atât de multe ori încât pare să vină de peste tot.+Aceasta reprezintă lumina reflectată de către ​obiectele din scenă de atât de multe ori încât pare să vină de peste tot.
  
 Astfel, lumina ambientală nu vine dintr-o direcție anume, apărând ca și cum ar veni din toate direcțiile. Din această cauză, componenta ambientală este independentă de poziția sursei de lumină. Astfel, lumina ambientală nu vine dintr-o direcție anume, apărând ca și cum ar veni din toate direcțiile. Din această cauză, componenta ambientală este independentă de poziția sursei de lumină.
  
-Componenta ambientală depinde de intensitatea ​de material ambientală a suprafeței obiectului și de intensitatea ​luminii.+Componenta ambientală depinde de culoarea ​de material ambientală a suprafeței obiectului și de culoarea ambientală ​luminii.
  
-Similar componentei emisive, componenta ambientală este o constantă (se poate extinde modelul atribuind fiecărei lumini din scenă o intensitate ​ambientală).+Similar componentei emisive, componenta ambientală este o constantă (se poate extinde modelul atribuind fiecărei lumini din scenă o culoare ​ambientală).
  
 Avem astfel: Avem astfel:
  
 <code glsl> <code glsl>
-     float ambientala = Ka * intensitateAmbientalaGlobala; # GLSL+     ​ambientala = Ka * culoareAmbientalaGlobala; # GLSL
 </​code>​ </​code>​
  
 <note tip> <note tip>
   * Ka – constanta de reflexie ambientală a materialului   * Ka – constanta de reflexie ambientală a materialului
-  * intensitateAmbientalaGlobala ​– intensitatea ​ambientală a luminii+  * culoareaAmbientalaGlobala ​– culoarea ​ambientală a luminii
 </​note>​ </​note>​
  
Line 68: Line 70:
  
 Avem astfel: Avem astfel:
-$difuza = K_d \cdot intensitateLumina ​\cdot max(\vec{N}\cdot \vec{L}, 0)$+$difuza = K_d \cdot culoareLumina ​\cdot max(\vec{N}\cdot \vec{L}, 0)$
 <code glsl> <code glsl>
-     float difuza = Kd * intensitateLumina ​* max (dot(N,L), 0); # GLSL+     ​difuza = Kd * culoareLumina ​* max (dot(N,L), 0); # GLSL
 </​code>​ </​code>​
 <note tip> <note tip>
   * Kd - constanta de reflexie difuză a materialului   * Kd - constanta de reflexie difuză a materialului
-  * intensitateLumina ​– intensitatea ​luminii ​+  * culoareLumina ​– culoarea ​luminii
   * N – normala la suprafață (normalizată) ​   * N – normala la suprafață (normalizată) ​
   * L – vectorul direcției luminii incidente (normalizat)   * L – vectorul direcției luminii incidente (normalizat)
Line 93: Line 95:
  
 <note tip> <note tip>
-  * Este necesar să se utilizeze -L deoarece reflect() are primul parametru vectorul incident care intră în suprafață, ​ nu cel care iese din ea așa cum este reprezentat în figură+  * Este necesar să se utilizeze -L deoarece ​''​reflect()'' ​are primul parametru vectorul incident care intră în suprafață, ​ nu cel care iese din ea așa cum este reprezentat în figură
 </​note>​ </​note>​
  
-În modelul Phong se aproximează scăderea rapidă a intensității luminii reflectate atunci când $\alpha$ crește prin $cos^n \alpha$, unde $n$ este exponentul de reflexie speculară al materialului (shininess).+În modelul Phong se aproximează scăderea rapidă a intensității luminii reflectate atunci când $\alpha$ crește prin $(cos \alpha)^n$, unde $n$ este exponentul de reflexie speculară al materialului (shininess).
  
-După cum se observă, față de celelalte 3 componente, componenta speculară depinde și de poziția observatorului. ​dacă observatorul nu se află într-o poziție unde poate vedea razele reflectate, atunci nu va vedea reflexie speculară pentru zona respectivă. De asemenea, nu va vedea reflexie speculară dacă lumina se află în spatele suprafeței.+După cum se observă, față de celelalte 3 componente, componenta speculară depinde și de poziția observatorului. ​Dacă observatorul nu se află într-o poziție unde poate vedea razele reflectate, atunci nu va vedea reflexie speculară pentru zona respectivă. De asemenea, nu va vedea reflexie speculară dacă lumina se află în spatele suprafeței.
  
 Astfel avem: Astfel avem:
-$speculara = K_s \cdot intensitateLumina ​\cdot primesteLumina \cdot (max(\vec{V}\cdot \vec{R}, 0))^n$+$speculara = K_s \cdot culoareLumina ​\cdot primesteLumina \cdot (max(\vec{V}\cdot \vec{R}, 0))^n$
 <code glsl> <code glsl>
-     float speculara = Ks * intensitateLumina ​* primesteLumina * pow(max(dot(V,​ R), 0), n) # GLSL+     ​speculara = Ks * culoareLumina ​* primesteLumina * pow(max(dot(V,​ R), 0), n) # GLSL
 </​code>​ </​code>​
  
Line 110: Line 112:
   * V – vectorul direcției de vizualizare (normalizat)   * V – vectorul direcției de vizualizare (normalizat)
   * R – vectorul direcției luminii reflectate (normalizat)   * R – vectorul direcției luminii reflectate (normalizat)
-  * n – coeficientul de strălucire al materialului+  * n – coeficientul de strălucire ​(shininess) ​al materialului
   * primesteLumina – 1 dacă $\vec{N}\cdot \vec{L}$ este mai mare decât 0; sau 0 în caz contrar   * primesteLumina – 1 dacă $\vec{N}\cdot \vec{L}$ este mai mare decât 0; sau 0 în caz contrar
 </​note>​ </​note>​
Line 130: Line 132:
  
 Ținând cont de toate acestea, avem pentru componenta speculară următoarea formulă: ​ Ținând cont de toate acestea, avem pentru componenta speculară următoarea formulă: ​
-$speculara = K_s \cdot  ​intensitateLumina ​\cdot  primesteLumina \cdot  (max(\vec{N}\cdot \vec{H}, 0)^n $+$speculara = K_s \cdot  ​culoareLumina ​\cdot  primesteLumina \cdot  (max(\vec{N}\cdot \vec{H}, 0)^n $
 <code glsl> <code glsl>
-     float speculara = Ks * intensitateLumina ​* primesteLumina * pow(max(dot(N,​ H), 0), n) # GLSL+     ​speculara = Ks * culoareLumina ​* primesteLumina * pow(max(dot(N,​ H), 0), n) # GLSL
 </​code>​ </​code>​
  
Line 139: Line 141:
 Atunci ​ când sursa de lumină punctiformă este suficient de îndepărtată de obiectele scenei vizualizate,​ vectorul $\vec{L}$ este același în orice punct. Sursa de lumină este numită în acest caz direcțională. Aplicând modelul pentru vizualizarea a două suprafețe paralele construite din același material, se va  obține o aceeași intensitate (unghiul dintre $\vec{L}$ și normală este același pentru cele două suprafețe). Dacă proiecțiile suprafețelor se suprapun în  imagine, ​ atunci ele nu se  vor  distinge. ​ Această situație apare deoarece în  model nu se ține cont de faptul că intensitatea luminii descrește proporțional cu inversul pătratului distanței de la sursa de lumină la obiect. Deci, obiectele mai îndepărtate de sursă sunt mai slab luminate. O posibilă corecție a  modelului, care poate fi aplicată pentru surse poziționale (la distanță finită de scenă) este: Atunci ​ când sursa de lumină punctiformă este suficient de îndepărtată de obiectele scenei vizualizate,​ vectorul $\vec{L}$ este același în orice punct. Sursa de lumină este numită în acest caz direcțională. Aplicând modelul pentru vizualizarea a două suprafețe paralele construite din același material, se va  obține o aceeași intensitate (unghiul dintre $\vec{L}$ și normală este același pentru cele două suprafețe). Dacă proiecțiile suprafețelor se suprapun în  imagine, ​ atunci ele nu se  vor  distinge. ​ Această situație apare deoarece în  model nu se ține cont de faptul că intensitatea luminii descrește proporțional cu inversul pătratului distanței de la sursa de lumină la obiect. Deci, obiectele mai îndepărtate de sursă sunt mai slab luminate. O posibilă corecție a  modelului, care poate fi aplicată pentru surse poziționale (la distanță finită de scenă) este:
 <code glsl> <code glsl>
-     float intensitate ​= emisiva + ambientala + factorAtenuare * ( difuza + speculara ); # GLSL+     culoareObiect ​= emisiva + ambientala + factorAtenuare * ( difuza + speculara ); # GLSL
 </​code>​ </​code>​
  
Line 158: Line 160:
 </​note>​ </​note>​
  
-Pentru a include in final culoarea de material a obiectului si culoare luminii (care alternativ pot fi incluse si in formulele de mai sus) se foloseste:​ +====Modele de shading====
- +
-<code glsl> +
-     vec3 culoare = culoareObiect * (emisiva + culoareLumina * (ambientala + factorAtenuare * ( difuza + speculara ))); # GLSL +
-</​code>​ +
- +
-====Modele de shading===+
  
 De asemenea, există mai multe modele de shading, care specifică metoda de implementare a modelului de calcul al reflexiei luminii. Mai exact, modelul de shading specifică unde se evaluează modelul de reflexie. Dacă vrem să calculăm iluminarea pentru o suprafață poligonală:​ De asemenea, există mai multe modele de shading, care specifică metoda de implementare a modelului de calcul al reflexiei luminii. Mai exact, modelul de shading specifică unde se evaluează modelul de reflexie. Dacă vrem să calculăm iluminarea pentru o suprafață poligonală:​
Line 174: Line 170:
 Figura 1. Diferite modele de shading: Lambert (o culoare per primitivă),​ Gouraud (o culoare per vârf), Phong (o culoare per fragment) Figura 1. Diferite modele de shading: Lambert (o culoare per primitivă),​ Gouraud (o culoare per vârf), Phong (o culoare per fragment)
  
-În acest laborator se va discuta modelul de shading Gouraud ​peste modelul de reflexie Phong.+În acest laborator se va discuta modelul de shading Gouraud.
  
 ==== Detalii de implementare ==== ==== Detalii de implementare ====
Line 180: Line 176:
 Pentru simplitate, în cadrul laboratorului vom implementa modelul de shading Gouraud (în vertex shader): Pentru simplitate, în cadrul laboratorului vom implementa modelul de shading Gouraud (în vertex shader):
   * Se vor calcula practic doar componentele difuze și speculare așa cum au fost prezentate anterior; componenta emisivă nu va fi folosită iar calculul componentei ambientale va fi simplificat astfel încât să nu mai trebuiască trimis nimic din program către shader (mai multe detalii la punctul 3).   * Se vor calcula practic doar componentele difuze și speculare așa cum au fost prezentate anterior; componenta emisivă nu va fi folosită iar calculul componentei ambientale va fi simplificat astfel încât să nu mai trebuiască trimis nimic din program către shader (mai multe detalii la punctul 3).
-  * Vom folosi ca materiale ​pentru obiecte doar culoarea de material difuză și speculară (transmise din program către shader) : Ks și Kd. +  * Vom folosi ca proprietăți de material ​pentru obiecte doar culoarea de material difuză și speculară (transmise din program către shader) : Ks și Kd. 
-  * În shader vom aproxima lumina ambientală cu o culoareAmbientalaGlobala care va fi o constantă în shader, iar în loc de Ka (constanta de material ambientală a obiectului) vom folosi Kd (constanta de material difuză a obiectului).+  * În shader vom aproxima lumina ambientală cu o ''​culoareAmbientalaGlobala'' ​care va fi o constantă în shader, iar în loc de Ka (constanta de material ambientală a obiectului) vom folosi Kd (constanta de material difuză a obiectului).
   * Culoarea luminii (difuză și speculară) va fi albă, deci culoareLumina va fi 1 și nu va mai fi necesar să fie folosită la înmulțirile din formulele de calcul pentru componentele difuză și speculară.   * Culoarea luminii (difuză și speculară) va fi albă, deci culoareLumina va fi 1 și nu va mai fi necesar să fie folosită la înmulțirile din formulele de calcul pentru componentele difuză și speculară.
   * Calculele de iluminare se vor face în world space, deci înainte de a fi folosite, poziția și normala vor trebui aduse din object space în world space. Acest lucru se poate face astfel:   * Calculele de iluminare se vor face în world space, deci înainte de a fi folosite, poziția și normala vor trebui aduse din object space în world space. Acest lucru se poate face astfel:
-     ​* ​  ​pentru ​position: <code glsl>​vec3 world_pos = (model_matrix * vec4(v_position,​1)).xyz;</​code>​+     ​* ​  ​pentru ​poziție: <code glsl>​vec3 world_pos = (model_matrix * vec4(v_position,​1)).xyz;</​code>​
      ​* ​  ​pentru normală: <code glsl>​vec3 world_normal = normalize( mat3(model_matrix) * v_normal );</​code>​      ​* ​  ​pentru normală: <code glsl>​vec3 world_normal = normalize( mat3(model_matrix) * v_normal );</​code>​
   * Vectorul direcției luminii L: <code glsl>​vec3 L = normalize( light_position - world_pos );</​code>​   * Vectorul direcției luminii L: <code glsl>​vec3 L = normalize( light_position - world_pos );</​code>​
Line 193: Line 189:
 Funcții GLSL utile care pot fi folosite pentru implementarea modelului de iluminare Funcții GLSL utile care pot fi folosite pentru implementarea modelului de iluminare
   * normalize(V) – normalizează vectorul V    * normalize(V) – normalizează vectorul V 
-  * normalize(L+V) – normalizează vectorul obținut prin L+ +  * normalize(V1+V2) – normalizează vectorul obținut prin V1+V2  
-  * normalize(X1-X2) - returnează un vector de direcție normalizat ​având două puncte X1 și X2 +  * normalize(P1-P2) - returnează un vector de direcție normalizat ​între punctele P1 și P2 
-  * dot(N,L) – calculează produsul scalar dintre ​și L +  * dot(V1,V2) – calculează produsul scalar dintre ​V1 și V2 
-  * pow(L, shininess) – calculează ​la puterea shininess +  * pow(a, shininess) – calculează ​la puterea shininess 
-  * max(N,V) – returnează maximul dintre ​și V+  * max(a,b) – returnează maximul dintre ​și b
   * distance(P1,​P2) – returnează distanța euclidiană dintre punctele P1 și P2    * distance(P1,​P2) – returnează distanța euclidiană dintre punctele P1 și P2 
-  * reflect(L,N) - calculează vectorul de reflexie pornind de la incidenta ​și normala N+  * reflect(V,N) - calculează vectorul de reflexie pornind de la incidenta ​și normala N
 </​note>​ </​note>​
  
egc/laboratoare/07.1605967147.txt.gz · Last modified: 2020/11/21 15:59 by andrei.lambru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0