This shows you the differences between two versions of the page.
egc:laboratoare:07 [2020/11/23 02:34] andrei.lambru |
egc:laboratoare:07 [2022/11/22 09:38] (current) andrei.lambru |
||
---|---|---|---|
Line 13: | Line 13: | ||
==== Modelul Phong pentru calculul reflexiei luminii ==== | ==== Modelul Phong pentru calculul reflexiei luminii ==== | ||
- | Intensitatea luminii 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 acel punct 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 34: | Line 34: | ||
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> | ||
Line 46: | Line 46: | ||
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 70: | 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 103: | Line 103: | ||
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 112: | 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 132: | 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 141: | 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 159: | Line 159: | ||
* $K_q$ - factorul de atenuare patratic | * $K_q$ - factorul de atenuare patratic | ||
</note> | </note> | ||
- | |||
- | Pentru a include în final culoarea de material a obiectului și culoarea luminii (care alternativ pot fi incluse și în formulele de mai sus) se folosește: | ||
- | |||
- | <code glsl> | ||
- | vec3 culoare = culoareObiect * (emisiva + culoareLumina * (ambientala + factorAtenuare * ( difuza + speculara ))); # GLSL | ||
- | </code> | ||
====Modele de shading==== | ====Modele de shading==== | ||
Line 182: | 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 proprietăți de material pentru obiecte doar intensitatea 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 ''intensitateAmbientalaGlobala'' 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). |
- | * Intensitatea luminii 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 poziție: <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> |