This shows you the differences between two versions of the page.
|
ipg:laboratoare:07 [2025/09/30 12:29] 127.0.0.1 external edit |
ipg:laboratoare:07 [2025/11/20 11:19] (current) andrei.lambru |
||
|---|---|---|---|
| Line 8: | Line 8: | ||
| În laboratoarele anterioare, am analizat modalitatea prin care se poate desena pe ecran geometria unui model 3D. Până în acest moment, culorile atribuite pixelilor în care a fost discretizată suprafața geometriei au fost alese artificial prin diferite abordări, precum interpolarea între culorile vârfurilor. Deoarece ochiul uman „vede” doar lumină :) , culoarea unui pixel în care a fost discretizată o suprafață trebuie să se calculeze pe baza influenței unei surse de lumină asupra zonei din suprafață, reprezentată de pixel. Pentru acest proces, se introduce în procesul de desenare conceptul de //**sursă de lumină**//. Există mai multe tipuri de astfel de surse: | În laboratoarele anterioare, am analizat modalitatea prin care se poate desena pe ecran geometria unui model 3D. Până în acest moment, culorile atribuite pixelilor în care a fost discretizată suprafața geometriei au fost alese artificial prin diferite abordări, precum interpolarea între culorile vârfurilor. Deoarece ochiul uman „vede” doar lumină :) , culoarea unui pixel în care a fost discretizată o suprafață trebuie să se calculeze pe baza influenței unei surse de lumină asupra zonei din suprafață, reprezentată de pixel. Pentru acest proces, se introduce în procesul de desenare conceptul de //**sursă de lumină**//. Există mai multe tipuri de astfel de surse: | ||
| - | * Sursă de lumina **punctiformă**, ce are o poziție în spațiu și împrăștie lumină uniform în toate direcțiile în jurul poziției; | + | * Sursă de lumină **punctiformă**, ce are o poziție în spațiu și împrăștie lumină uniform în toate direcțiile în jurul poziției; |
| * Sursă de lumină de **tip spot**, ce are o poziție în spațiu și împrăștie lumină de la această poziție de-a lungul unei singure direcții. Acest tip de sursă este similar cu o lanternă. | * Sursă de lumină de **tip spot**, ce are o poziție în spațiu și împrăștie lumină de la această poziție de-a lungul unei singure direcții. Acest tip de sursă este similar cu o lanternă. | ||
| Line 19: | Line 19: | ||
| * Componenta de reflexie oglindă, ce se referă, similar cu cea de reflexie difuză, la transportul luminii de la o sursă, prin reflexia pe //o singură suprafață//, într-un punct, la poziția observatorului. | * Componenta de reflexie oglindă, ce se referă, similar cu cea de reflexie difuză, la transportul luminii de la o sursă, prin reflexia pe //o singură suprafață//, într-un punct, la poziția observatorului. | ||
| - | Diferenta dintre ultimele două componente este dată de comportamentul de reflexie, respectiv o reflexie difuză și o reflexie oglindă. | + | Diferența dintre ultimele două componente este dată de comportamentul de reflexie, respectiv o reflexie difuză și o reflexie oglindă. |
| Deoarece lumina este aditivă, cu cât mai mulți fotoni ajung în ochii nostri, cu atât lumina este mai „puternică” :), rezultatul final al influenței iluminării într-un punct este dat de suma celor 4 componente: | Deoarece lumina este aditivă, cu cât mai mulți fotoni ajung în ochii nostri, cu atât lumina este mai „puternică” :), rezultatul final al influenței iluminării într-un punct este dat de suma celor 4 componente: | ||
| Line 29: | Line 29: | ||
| ==== Componenta emisivă ==== | ==== Componenta emisivă ==== | ||
| - | În situația în care ne referim strict la transportul luminii de la suprafața sursei la poziția observatorului, această componenta se poate aproxima printr-o distribuire uniformă a împrăștierii luminii de la suprafață în toate direcțiile, astfel că poate fi utilizată o singură valoare uniformă pentru toată suprafața. | + | În situația în care ne referim strict la transportul luminii de la suprafața sursei la poziția observatorului, această componentă se poate aproxima printr-o distribuire uniformă a împrăștierii luminii de la suprafață în toate direcțiile, astfel că poate fi utilizată o singură valoare uniformă pentru toată suprafața. |
| <note tip> | <note tip> | ||
| Line 184: | Line 184: | ||
| 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. | ||
| - | ==== Atenuarea intensității iluminarii ==== | + | ==== Atenuarea intensității iluminării ==== |
| Factorul de atenuare a intensității iluminării pe bază de distanță se aplică doar componentei difuze și speculare: | Factorul de atenuare a intensității iluminării pe bază de distanță se aplică doar componentei difuze și speculare: | ||
| Line 209: | Line 209: | ||
| În domeniul graficii pe calculator, o astfel de sursă de lumină poartă numele de **sursă de tip spot**. | În domeniul graficii pe calculator, o astfel de sursă de lumină poartă numele de **sursă de tip spot**. | ||
| - | Un punct se află în conul de lumină al unei surse de tip spot dacă condiția următoare este îndepilită: | + | Un punct se află în conul de lumină al unei surse de tip spot dacă condiția următoare este îndeplinită: |
| <code glsl> | <code glsl> | ||
| float cos_theta_angle = dot(-L, light_direction); | float cos_theta_angle = dot(-L, light_direction); | ||
| Line 279: | Line 279: | ||
| * În acest laborator, nu se va utiliza componenta emisivă. | * În acest laborator, nu se va utiliza componenta emisivă. | ||
| * Vectorul normal al fiecărui vârf se regăsește în datele conținute de fișierul modelului încărcat și se primește în vertex shader într-un atribut de intrare spefic vârfului: <code glsl>layout(location = 1) in vec3 v_normal;</code> | * Vectorul normal al fiecărui vârf se regăsește în datele conținute de fișierul modelului încărcat și se primește în vertex shader într-un atribut de intrare spefic vârfului: <code glsl>layout(location = 1) in vec3 v_normal;</code> | ||
| - | * Calculele de iluminare se vor face în spațiul lumii, astfel că poziția și vectorul normal vor trebui transformate din spațiul obiectului, în care se află inițial, în spațiul lumii. Aceste calcule se realizează în vertex shader și noua poziție și vector normal se transmit spre fragment shader. Calculul se poate face astfel: | + | * Calculele de iluminare se vor face în spațiul lumii, astfel că poziția și vectorul normal vor trebui transformate din spațiul obiectului, în care se află inițial, în spațiul lumii. Aceste calcule se realizează în vertex shader și noua poziție și vectorul normal se transmit spre fragment shader. Calculul se poate face astfel: |
| * pentru poziție: <code glsl>vec3 world_position = (model_matrix * vec4(v_position,1)).xyz;</code> | * pentru poziție: <code glsl>vec3 world_position = (model_matrix * vec4(v_position,1)).xyz;</code> | ||
| * pentru vectorul normal: <code glsl>vec3 world_normal = normalize( mat3(model_matrix) * v_normal );</code> | * pentru vectorul normal: <code glsl>vec3 world_normal = normalize( mat3(model_matrix) * v_normal );</code> | ||
| Line 287: | Line 287: | ||
| <note tip> | <note tip> | ||
| - | Funcții GLSL utile care pot fi utilizate 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(V1+V2) – normalizează vectorul obținut prin V1+V2 | * normalize(V1+V2) – normalizează vectorul obținut prin V1+V2 | ||