Differences

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

Link to this comparison view

egc:laboratoare:07 [2017/11/08 23:25]
florin_eugen.iancu [Atenuarea intensitatii luminii]
egc:laboratoare:07 [2022/11/22 09:38] (current)
andrei.lambru
Line 1: Line 1:
 ===== Laboratorul 07 ===== ===== Laboratorul 07 =====
  
-==== Iluminare folosind GLSL ==== 
  
-Lumina este un factor foarte important in redarea cat mai realista a unei scene 3DImpreuna cu proprietatile de material ale unui obiect, lumina determina modalitatea in care obiectul este afisat in scena 3D.+**Video Laborator 7**: https://​youtu.be/​y1st9QxXbn8 \\ 
 +**Autor**: [[andrei.lambru@upb.ro | Cristian Lambru]]
  
-Exista mai multe modele empirice pentru calculul reflexiei luminii intr-un punct al unei suprafete: Phong ([[http://​www.cs.northwestern.edu/​~ago820/​cs395/​Papers/​Phong_1975.pdf|1975]]),​ Blinn-Phong ([[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 veti discuta despre modelul Lambert si despre modelul Phong).+==== Iluminare folosind GLSL ====
  
-De asemenea, exista ​mai multe modele de shading, care specifica metoda de implementare a modelului de calcul al reflexiei luminii. Mai exact, modelul de shading specifica unde se evalueaza modelul de reflexie. Daca vrem sa calculam iluminarea pentru o suprafata poligonala:​ +Lumina este un factor foarte important în redarea cât mai realistă ​ ​a ​unei scene 3DÎmpreună cu proprietățile ​de material ale unui obiectlumina determină modalitatea în care obiectul este afișat în scena 3D.
-  * in modelul de shading Lambert, se calculeaza o singura culoare pentru un poligon al suprafetei +
-  * in modelul de shading Gouraud ([[https://​collections.lib.utah.edu/​pdfjs/​web/​viewer.html?​v=1&​file=/​dl_files/​3b/​70/​3b70218f4236a783b37dbb283cf29c18e7842c7d.pdf|1971]]),​ se calculeaza cate o culoare pentru fiecare varf al unui poligon. Apoi, culorile fragmentelor poligonului se calculeaza prin interpolare intre varfuri (interpolarea liniara ​culorilor varfurilor, pentru fragmentele de pe laturi si interpolare liniara intre culorile capetelor fiecarui segment interior, pentru fragmentele interioare poligonului)Calcularea culorilor varfurilor se poate efectua in vertex shader. +
-  * in modelul ​de shading Phong ([[http://​www.cs.northwestern.edu/​~ago820/​cs395/​Papers/​Phong_1975.pdf|1975]]),​ se calculeaza cate o normala pentru fiecare varf al unui poligon. Apoipentru fiecare fragment se determina o normala prin interpolare intre normalele din varfuriAstfel, se calculeaza o culoare pentru fiecare fragment al unui poligon (in fragment shader) +
- +
-{{ :​egc:​laboratoare:​lab07:​iluminareglsl.png?​300 |}} +
-Figura 1. Diferite modele de shading: Lambert (o culoare per primitiva), Gouraud (o culoare per varf), Phong (o culoare per fragment)+
  
-In acest laborator sa va discuta modelul ​de shading Gouraud peste modelul de reflexie ​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 ====
  
-Ca model de reflexie vom prezenta ​in continuare un model care extinde modelul de reflexie Phong si care contine ​toate cele 4 componente care pot fi folosite pentru a calcula iluminarea. ​ +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 :  
-Pentru a obtine ​astfel culoarea ​intr-un punct al unei suprafete ​vom avea urmatoarele ​componente : +  * Componenta ​emisivă 
-  * Componenta ​emisiva +  * Componenta ​ambientală 
-  * Componenta ​ambientala +  * Componenta ​difuză 
-  * Componenta ​difuza +  * Componenta ​speculară 
-  * Componenta ​speculara +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ă).
-Contributia fiecarei ​componente este calculata ​ca o combinatie ​dintre ​proprietatile ​de material ale obiectului (factorul de stralucire, culoarea ​materialului) ​si proprietatile ​sursei de lumina ​(culoarea sursei de luminapozitia ​sursei de lumina).+
  
-Astfel culoarea ​finala ​unui punct apartinand ​unei suprafete ​este:+Astfelculoarea ​finală ​luminii într-un ​punct aparținând ​unei suprafețe ​este:
  
 <code glsl> <code glsl>
-     ​culoare = emisiva + ambientala + difuza + speculara+     ​culoare = emisiva + ambientala + difuza + speculara; # GLSL
 </​code>​ </​code>​
  
-In cele ce urmeaza prezentam ​pe scurt ce reprezinta ​cele 4 componente ​si cum pot fi calculate.+În cele ce urmează prezentăm ​pe scurt ce reprezintă ​cele 4 componente ​și cum pot fi calculate.
  
-==== Componenta ​emisiva ​====+==== Componenta ​emisivă ​====
  
-Aceasta ​reprezinta ​lumina ​emisa de un obiect ​si nu tine cont de nici o sursa de lumina. Daca un obiect care are o anumita culoare emisiva s-ar afla intr-o scena complet intunecata atunci el ar aparea exact cu aceasta 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 intalnita ​pentru componenta ​emisiva ​este aceea de a simula ​stralucirea unui obiect.+
  
 Avem astfel: Avem astfel:
 <code glsl> ​ <code glsl> ​
-     ​emisiva = Ke+     ​emisiva = Ke; # GLSL
 </​code>​ </​code>​
 <note tip> <note tip>
-  * Ke – culoarea ​emisiva ​a materialului+  * Ke – culoarea ​emisivă ​a materialului
 </​note>​ </​note>​
  
-==== Componenta ​ambientala ​====+==== Componenta ​ambientală ​====
  
-Aceasta ​reprezinta ​lumina ​reflectata ​de catre obiectele din scena de atat de multe ori incat pare sa vina 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 ​ambientala ​nu vine dintr-o ​directie ​anume, ​aparand ​ca si cum ar veni din toate directiile. Din aceasta cauza componenta ​ambientala ​este independenta ​de pozitia ​sursei de lumina.+Astfellumina ​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 ​ambientala ​depinde de culoarea de material ​ambientala ​suprafetei ​obiectului ​si de culoarea ​ambientala a luminii.+Componenta ​ambientală ​depinde de culoarea de material ​ambientală ​suprafeței ​obiectului ​și de culoarea ​ambientală ​luminii.
  
-Similar componentei emisive, componenta ​ambientala ​este o constanta ​(se poate extinde modelul atribuind ​fiecarei ​lumini din scena o culoare ​ambientala).+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>
-     ​ambientala = Ka * culoareaAmbientalaGlobala+     ​ambientala = Ka * culoareAmbientalaGlobala;​ # GLSL
 </​code>​ </​code>​
  
 <note tip> <note tip>
-  * Ka – culoarea ambientala ​de material ​obiectului +  * Ka – constanta ​de reflexie ambientală ​materialului 
-  * culoareaAmbientalaGlobala – culoarea ​ambientala ​a luminii+  * culoareaAmbientalaGlobala – culoarea ​ambientală ​a luminii
 </​note>​ </​note>​
  
-==== Componenta ​difuza ​====+==== Componenta ​difuză ​====
  
-Aceasta ​reprezinta ​lumina ​reflectata ​de suprafata ​obiectului ​in mod egal in toate directiile.+Aceasta ​reprezintă ​lumina ​reflectată ​de suprafața ​obiectului ​în mod egal în toate direcțiile.
  
-Cantitatea de lumina reflectata ​este proportionala ​cu unghiul de incidenta ​al razei de lumina ​cu suprafata ​obiectului.+Cantitatea de lumină reflectată ​este proporțională ​cu unghiul de incidență ​al razei de lumină ​cu suprafața ​obiectului.
  
-{{ :​egc:​laboratoare:​lab07:​difuza.jpg?300 |}}+{{ :​egc:​laboratoare:​lab07:​difuză.jpg?300 |}}
  
 Avem astfel: Avem astfel:
 +$difuza = K_d \cdot culoareLumina \cdot max(\vec{N}\cdot \vec{L}, 0)$
 <code glsl> <code glsl>
-     ​difuza = Kd * culoareLumina * max (N L, 0)+     ​difuza = Kd * culoareLumina * max (dot(N,L), 0); # GLSL
 </​code>​ </​code>​
 <note tip> <note tip>
-  * Kd - culoarea ​de material difuza ​obiectului ​ +  * Kd - constanta ​de reflexie difuză ​materialului 
-  * culoareLumina – culoarea ​difuza a luminii  +  * culoareLumina – culoarea luminii 
-  * N – normala la suprafata ​(normalizata)  +  * N – normala la suprafață ​(normalizată)  
-  * L – vectorul ​directei ​luminii incidente (normalizat) +  * L – vectorul ​direcției ​luminii incidente (normalizat) 
-  * $max(N\cdot L, 0)$ – produsul scalar $N\cdot L$ reprezinta masura ​unghiului dintre ​acesti ​2 vectori; astfel ​daca i este mai mare decat $\pi/2$ valoarea produsului scalar va fi mai mica decat 0, acest lucru insemnand ca suprafata ​nu primeste lumina ​( sursa de lumina ​se afla in spatele ​suprafetei ​si de aici si formula care asigura ca in acest caz suprafata ​nu primeste lumina difuza+  * $max(\vec{N}\cdot \vec{L}, 0)$ – produsul scalar $\vec{N}\cdot \vec{L}reprezintă măsura ​unghiului dintre ​acești ​2 vectori; astfel, dacă $ieste mai mare decât ​$\pi/2$ valoarea produsului scalar va fi mai mică decât ​0, acest lucru însemnând că suprafața ​nu primește lumină ​( sursa de lumină ​se află în spatele ​suprafeței ​și de aici și formula care asigură că în acest caz suprafața ​nu primește lumină difuză
 </​note>​ </​note>​
  
-==== Componenta ​speculara ​====+==== Componenta ​speculară ​====
  
-Un reflector perfect, de exemplu o oglindareflecta ​lumina numai intr-o singura directie ​$R$, care este simetrica ​cu $L$ fata de normala la suprafata. Prin urmare, doar un observator situat exact pe directia respectiva ​va percepe raza reflectata.+Un reflector perfect, de exemplu o oglindăreflectă ​lumina numai într-o singură direcție ​$\vec{R}$, care este simetrică ​cu $\vec{L}față ​de normala la suprafață. Prin urmare, doar un observator situat exact pe direcția respectivă ​va percepe raza reflectată.
  
 {{ :​egc:​laboratoare:​lab07:​specular.jpg?​300 |}} {{ :​egc:​laboratoare:​lab07:​specular.jpg?​300 |}}
  
-Componenta ​speculara reprezinta ​lumina ​reflectata ​de suprafata ​obiectului numai in jurul acestei ​directii, $R$.+Componenta ​speculară reprezintă ​lumina ​reflectată ​de suprafața ​obiectului numai în jurul acestei ​direcții, $\vec{R}$. Acest vector se obține prin:
  
-In modelul Phong se aproximeaza scaderea rapida ​intensitatii ​luminii reflectate atunci ​cand $\alpha$ creşte prin $cos^n \alpha$, unde $n$ este exponentul de reflexie speculară al materialului (shininess).+<code glsl> 
 +     vec3 R = reflect (-L, N) # GLSL 
 +</​code>​ 
 + 
 +<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ă 
 +</​note>​ 
 + 
 +În modelul Phong se aproximează scăderea rapidă ​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.
  
 Astfel avem: Astfel avem:
-$speculara = K_s \cdot culoareLumina \cdot primesteLumina \cdot (max(V\cdot R, 0))^n$+$speculara = K_s \cdot culoareLumina \cdot primesteLumina \cdot (max(\vec{V}\cdot \vec{R}, 0))^n$
 <code glsl> <code glsl>
      ​speculara = Ks * culoareLumina * primesteLumina * pow(max(dot(V,​ R), 0), n) # GLSL      ​speculara = Ks * culoareLumina * primesteLumina * pow(max(dot(V,​ R), 0), n) # GLSL
 </​code>​ </​code>​
  
-O altă formulare ​modelului Phong se bazează pe vectorul median, notat cu $H$. El face unghiuri egale cu $L$  ​şi cu $V$. Dacă suprafaţa ar fi orientată astfel încât normala sa să aibă direcţia lui $H$, atunci ​ observatorul ​ ar  percepe ​ lumina speculară ​ maximă (deoarece ar fi pe direcţia razei reflectate specular).+<note tip> 
 +  * Ks - constanta speculară de reflexie ​materialului 
 +  * V – vectorul direcției de vizualizare (normalizat) 
 +  * R – vectorul direcției luminii reflectate (normalizat) 
 +  * 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 
 +</​note>​ 
 + 
 +Un alt model de iluminare (Blinn ([[https://​www.microsoft.com/​en-us/​research/​wp-content/​uploads/​1977/​01/​p192-blinn.pdf|1977]])) pentru componenta speculară ​se bazează pe vectorul median, notat cu $\vec{H}$. El face unghiuri egale cu $\vec{L}$  ​și cu $\vec{V}$. Dacă suprafața ar fi orientată astfel încât normala sa să aibă direcția lui $\vec{H}$, atunci ​ observatorul ​ ar  percepe ​ lumina speculară ​ maximă (deoarece ar fi pe direcția razei reflectate specular).
  
 {{ :​egc:​laboratoare:​lab07:​specular1.jpg?​300 |}} {{ :​egc:​laboratoare:​lab07:​specular1.jpg?​300 |}}
  
 Termenul care exprimă reflexia speculară este în acest  caz:  Termenul care exprimă reflexia speculară este în acest  caz: 
-$(N_u \cdot H_u)^n$+$(\vec{N} ​\cdot \vec{H})^n$
 <code glsl> <code glsl>
-     ​pow(dot(NuHu), n) # GLSL+     ​pow(dot(NH), n) # GLSL
 </​code>​ </​code>​
 <note tip> <note tip>
-  * $H_u = (L_u V_u)$ (normalizat)+  * $\vec{H} ​= (\vec{L} ​\vec{V})$ (normalizat)
 </​note>​ </​note>​
  
-Atunci când sursa de lumină ​şi observatorul sunt la infinit, utilizarea termenului $N_u\cdot H_u$  este avantajoasă deoarece $H_u$ este constant.+Atunci când sursa de lumină ​și observatorul sunt la infinit, utilizarea termenului $\vec{N}\cdot \vec{H}$  este avantajoasă deoarece $\vec{H}$ este constant.
  
-Dupa cum se observa, fata de celelalte 3 componente, componenta speculara depinde si de pozitia observatorului. Daca observatorul nu se afla intr-o pozitie unde poate vedea razele reflectate atunci nu va vedea reflexie speculara pentru zona respectiva. De asemenea, nu va vedea reflexie speculara daca lumina se afla in spatele suprafetei. +Ținând ​cont de toate acesteaavem pentru componenta ​speculară următoarea formulă:  
- +$speculara = K_s \cdot  culoareLumina \cdot  primesteLumina \cdot  (max(\vec{N}\cdot \vec{H}, 0)^n $
-Tinand ​cont de toate acestea avem pentru componenta ​speculara urmatoarea formula:  +
-$speculara = K_s \cdot  culoareLumina \cdot  primesteLumina \cdot  (max(N\cdot H, 0)^n $+
 <code glsl> <code glsl>
      ​speculara = Ks * culoareLumina * primesteLumina * pow(max(dot(N,​ H), 0), n) # GLSL      ​speculara = Ks * culoareLumina * primesteLumina * pow(max(dot(N,​ H), 0), n) # GLSL
 </​code>​ </​code>​
-<note tip> 
-  * Ks - culoarea de material speculara a obiectului 
-  * culoareLumina – culoarea speculara a luminii 
-  * N – normala la suprafata (normalizata) 
-  * L – vectorul directei luminii incidente (normalizat) 
-  * H – vectorul median (normalizat) 
-  * primesteLumina – 1 daca $N\cdot L$ este mai mare decat 0; sau 0 in caz contrar 
-</​note>​ 
  
-==== Atenuarea ​intensitatii ​luminii ====+==== Atenuarea ​intensității ​luminii ====
  
-Atunci ​ când sursa de lumină punctiformă este suficient de îndepărtată de obiectele scenei vizualizate,​ vectorul ​ $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 $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.  ​Aceasta ​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 aplicata ​pentru surse pozitionale ​(la distanta finita ​de scena) 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: 
-     ​culoareObiect = emisiva + ambientala + factorAtenuare * ( difuza + speculara )+<code glsl> 
 +     ​culoareObiect = emisiva + ambientala + factorAtenuare * ( difuza + speculara ); # GLSL 
 +</​code>​
  
 <note tip> <note tip>
-  * factorAtenuare = $1/d^2$ este o funcţie de atenuare +  * factorAtenuare = $1/d^2$ este o funcție de atenuare 
-  * $d$ este distanţa de la sursă la punctul de pe suprafaţă considerat+  * $d$ este distanța de la sursă la punctul de pe suprafață considerat
 </​note>  ​ </​note>  ​
  
-Corecţia de mai sus nu satisface cazurile în care sursa este foarte îndepărtată. De asemenea, dacă sursa este la distanţă foarte mică de scenă, intensităţile obţinute pentru două suprafeţe cu acelaşi unghi  $i$, între $L$ şi $N$, vor fi mult diferite. ​+Corecția de mai sus nu satisface cazurile în care sursa este foarte îndepărtată. De asemenea, dacă sursa este la distanță foarte mică de scenă, intensitățile obținute pentru două suprafețe cu același unghi  $i$, între $\vec{L}și $\vec{N}$, vor fi mult diferite. ​
  
 <note tip> <note tip>
Line 157: Line 159:
   * $K_q$ - factorul de atenuare patratic   * $K_q$ - factorul de atenuare patratic
 </​note>​ </​note>​
 +
 +====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ă:​
 +  * în modelul de shading Lambert, se calculează o singură culoare pentru un poligon al suprafeței
 +  * în modelul de shading Gouraud ([[https://​collections.lib.utah.edu/​pdfjs/​web/​viewer.html?​v=1&​file=/​dl_files/​3b/​70/​3b70218f4236a783b37dbb283cf29c18e7842c7d.pdf|1971]]),​ se calculează câte o culoare pentru fiecare vârf al unui poligon. Apoi, culorile fragmentelor poligonului se calculează prin interpolare între vârfuri (interpolarea liniară a culorilor vârfurilor,​ pentru fragmentele de pe laturi și interpolare liniară între culorile capetelor fiecărui segment interior, pentru fragmentele interioare poligonului). Calcularea culorilor vârfurilor se poate efectua în vertex shader.
 +  * în modelul de shading Phong ([[http://​www.cs.northwestern.edu/​~ago820/​cs395/​Papers/​Phong_1975.pdf|1975]]),​ se calculează câte o normală pentru fiecare vârf al unui poligon. Apoi, pentru fiecare fragment se determină o normală prin interpolare între normalele din vârfuri. Astfel, se calculează o culoare pentru fiecare fragment al unui poligon (în fragment shader)
 +
 +{{ :​egc:​laboratoare:​lab07:​iluminareglsl.png?​300 |}}
 +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.
  
 ==== Detalii de implementare ==== ==== Detalii de implementare ====
  
-Pentru simplitate, ​in cadrul laboratorului vom implementa modelul de shading Gouraud (in vertex shader): +Pentru simplitate, ​în cadrul laboratorului vom implementa modelul de shading Gouraud (în vertex shader): 
-  * Se vor calcula practic doar componentele difuze ​si speculare ​asa cum au fost prezentate anterior; componenta ​emisiva ​nu va fi folosita ​iar calculul componentei ambientale va fi simplificat astfel ​incat sa nu mai trebuiasca ​trimis nimic din program ​catre 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 ​difuza si speculara ​(transmise din program ​catre shader) : Ks si 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. 
-  * In shader vom aproxima lumina ​ambientala ​cu o culoareAmbientalaGlobala care va fi o constanta in shader iar in loc de Ka (constanta de material ​ambientala ​a obiectului) vom folosi Kd (constanta de material ​difuza ​a obiectului). +  * În shader vom aproxima lumina ​ambientală ​cu o ''​culoareAmbientalaGlobala'' ​care va fi o constantă în shaderiar în loc de Ka (constanta de material ​ambientală ​a obiectului) vom folosi Kd (constanta de material ​difuză ​a obiectului). 
-  * Culoarea luminii (difuza si speculara) va fi alba, deci culoareLumina va fi 1 si nu va mai fi necesar ​sa fie folosita ​la inmultirile ​din formulele de calcul pentru componentele ​difuza si speculara+  * 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 in world space deci inainte ​de fi folosite, ​pozitia si normala vor trebui aduse din object space in world space. Acest lucru se poate face astfel: +  * Calculele de iluminare se vor face în world spacedeci înainte ​de 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 ​normala: <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 ​directiei ​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>​ 
-  * Vectorul ​directiei ​din care priveste observatorul V: <code glsl>​vec3 V = normalize( eye_position - world_pos );</​code>​+  * Vectorul ​direcției ​din care priveste observatorul V: <code glsl>​vec3 V = normalize( eye_position - world_pos );</​code>​
   * Vectorul median H: <code glsl>​vec3 H = normalize( L + V );</​code>​   * Vectorul median H: <code glsl>​vec3 H = normalize( L + V );</​code>​
  
 <note tip> <note tip>
-Functii ​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) – normalizeaza ​vectorul V  +  * normalize(V) – normalizează ​vectorul V  
-  * normalize(L+V) – normalizeaza ​vectorul ​obtinut ​prin L+ +  * normalize(V1+V2) – normalizează ​vectorul ​obținut ​prin V1+V2  
-  * normalize(X1-X2) - returneaza ​un vector de directie ​normalizat ​avand doua puncte X1 si X2 +  * normalize(P1-P2) - returnează ​un vector de direcție ​normalizat ​între punctele P1 și P2 
-  * dot(N,L) – calculeaza ​produsul scalar dintre ​N si L +  * dot(V1,V2) – calculează ​produsul scalar dintre ​V1 și V2 
-  * pow(L, shininess) – calculeaza L la puterea shininess +  * pow(a, shininess) – calculează a la puterea shininess 
-  * max(N,V) – returneaza ​maximul dintre ​N si V +  * max(a,b) – returnează ​maximul dintre ​a și b 
-  * distance(P1,​P2) – returneaza distanta euclidiana ​dintre punctele P1 si P2  +  * distance(P1,​P2) – returnează distanța euclidiană ​dintre punctele P1 și P2  
-  * reflect(L,N) - calculeaza ​vectorul de reflexie pornind de la incidenta ​L si normala N+  * reflect(V,N) - calculează ​vectorul de reflexie pornind de la incidenta ​V și normala N
 </​note>​ </​note>​
  
-==== Cerinte ​laborator ====+==== Cerințe ​laborator ====
  
 <note tip> <note tip>
  
-tasta **F5** - reincarca shaderele in timpul ​rularii aplicatiei. Nu este nevoie ​sa opriti aplicatia intrucat shaderele sunt __compilate si rulate ​de catre placa video__ si nu au legatura ​cu codul sursa C++ propriu zis.+Tasta **F5** - reîncarcă programele shader în timpul ​execuției aplicației. Nu este nevoie ​să opriți aplicația întrucât un program shader este __compilat și executat ​de către procesorul grafic__ și nu are legătură ​cu codul sursă ​C++ propriu-zis.
  
 </​note>​ </​note>​
  
-  - Descarcati ​[[https://​github.com/​UPB-Graphics/​Framework-EGC/​archive/​master.zip|framework-ul de laborator]] +  - Descărcați ​[[https://​github.com/​UPB-Graphics/​Framework-EGC/​archive/​master.zip|framework-ul de laborator]] 
-  - Completati functia ​''​RenderSimpleMesh''​ astfel ​inca sa trimiteti ​corect valorile ​uniform catre Shader: +  - Completați funcția ​''​RenderSimpleMesh''​ astfel ​încât să trimiteți ​corect valorile ​uniforme către ​Shader: 
-    * Pozitia ​luminii +    * poziția ​luminii 
-    * Pozitia ​camerei +    * poziția ​camerei 
-    * Proprietatile ​de material (Kd, Ks, ShininessCuloare ​obiect) +    * proprietățile ​de material (Kd, Ks, shininessculoare ​obiect) 
-  - Implementati ​iluminarea ​in Vertex Shader +  - Implementați ​iluminarea ​în Vertex Shader 
-    * Vectorii N, V, L si pozitia in spatiul ​global +    * Vectorii N, V, L și poziția în spațiul ​global 
-    * Componenta ​ambientala +    * Componenta ​ambientală 
-    * Componenta ​difuza +    * Componenta ​difuză 
-    * Componenta ​speculara ​(atat in varianta de baza cat si folosind vectorul median)+    * Componenta ​speculară ​(atât în varianta de bază cât și folosind vectorul median)
     * Factor de atenuare     * Factor de atenuare
-    * Culoarea ​finala +    * Culoarea ​finală 
-  - Completati Fragment Shaderul ​astfel ​incat sa aplicati ​iluminarea ​calculata in Vertex Shader +  - Completați fragment shader-ul ​astfel ​încât să aplicați ​iluminarea ​calculată în Vertex Shader 
-  - Colorati ​sfera si planul din scena (de ex: sfera - albastru, planul - gri)+  - Colorați ​sfera și planul din scenă ​(de ex: sfera - albastru, planul - gri)
  
egc/laboratoare/07.1510176313.txt.gz · Last modified: 2017/11/08 23:25 by florin_eugen.iancu
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