Differences

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

Link to this comparison view

ipg:laboratoare:09 [2025/09/30 12:29]
127.0.0.1 external edit
ipg:laboratoare:09 [2025/12/03 10:25] (current)
andrei.lambru
Line 14: Line 14:
  
 Redarea scenei în fereastra de desenare se realizează,​ de fapt prin redarea scenei într-o textură specială, ce este afișată ulterior în fereastră. API-ul grafic OpenGL nu permite desenarea direct într-o textură, ci impune utilizarea unui obiect suplimentar,​ numit buffer de cadru sau framebuffer. Acest obiect conține: Redarea scenei în fereastra de desenare se realizează,​ de fapt prin redarea scenei într-o textură specială, ce este afișată ulterior în fereastră. API-ul grafic OpenGL nu permite desenarea direct într-o textură, ci impune utilizarea unui obiect suplimentar,​ numit buffer de cadru sau framebuffer. Acest obiect conține:
-  * **Texturile cu format de culoare în care se redă scena**. Pot să fie mai multe texturi pe care se desenează, până la un număr limită dat de procesorul grafic, care este în general 8. Putem să ne gândim la o textură ca la o structură de date în care păstrăm informație oarecare, nu doar culoare. De exemplu: putem păstra poziția în spațiul ​lume a fragmentului,​ obținută prin interpolare între vârfuri, sau vectorul normal în spațiul ​lume al fragmentului,​ obținut prin același proces de interpolare.+  * **Texturile cu format de culoare în care se redă scena**. Pot să fie mai multe texturi pe care se desenează, până la un număr limită dat de procesorul grafic, care este în general 8. Putem să ne gândim la o textură ca la o structură de date în care păstrăm informație oarecare, nu doar culoare. De exemplu: putem păstra poziția în spațiul ​lumii a fragmentului,​ obținută prin interpolare între vârfuri, sau vectorul normal în spațiul ​lumii al fragmentului,​ obținut prin același proces de interpolare.
   * **Textura în care se păstrează informația de adâncime** a fragmentelor desenate în texturile cu format de culoare. Această informație este utilizată în pasul de test de adâncime din procesul de rasterizare.   * **Textura în care se păstrează informația de adâncime** a fragmentelor desenate în texturile cu format de culoare. Această informație este utilizată în pasul de test de adâncime din procesul de rasterizare.
  
Line 59: Line 59:
 </​code>​ </​code>​
  
-Astfel, atașăm textura ''​color_texture''​ la obiectul de tip framebuffer legat la banda grafică pe punctul de atașare ''​pct_atasare''​. Valoarea ''​0''​ de la final ne spune că atașăm primul nivel din mipmap (rezoluția maximă). ​Dupa cum se poate observa, obiectele de tip framebuffer au puncte de atașare ce sunt foarte similare din punct de vedere conceptual cu ideea de pipe, folosită la definirea informației la nivel de vertex. În API-ul grafic OpenGL, acest tip de proiectare este foarte des folosit. Dacă atașăm o textură la un punct de legare pe care deja este legată o altă textură, legătura veche se va pierde și va rămâne doar cea nouă.+Astfel, atașăm textura ''​color_texture''​ la obiectul de tip framebuffer legat la banda grafică pe punctul de atașare ''​pct_atasare''​. Valoarea ''​0''​ de la final ne spune că atașăm primul nivel din mipmap (rezoluția maximă). ​După cum se poate observa, obiectele de tip framebuffer au puncte de atașare ce sunt foarte similare din punct de vedere conceptual cu ideea de pipe, folosită la definirea informației la nivel de vertex. În API-ul grafic OpenGL, acest tip de proiectare este foarte des folosit. Dacă atașăm o textură la un punct de legare pe care deja este legată o altă textură, legătura veche se va pierde și va rămâne doar cea nouă.
  
 Este important să observăm mai sus că punctul de atașare este de tip ''​GL_COLOR_ATTACHMENT''​. Mai există un alt tip de punct de atașare, cu un singur punct (unic!) folosit pentru textura de adâncime, numit ''​GL_DEPTH_ATTACHEMENT''​. Pentru a lega o textură de adâncime, folosim: Este important să observăm mai sus că punctul de atașare este de tip ''​GL_COLOR_ATTACHMENT''​. Mai există un alt tip de punct de atașare, cu un singur punct (unic!) folosit pentru textura de adâncime, numit ''​GL_DEPTH_ATTACHEMENT''​. Pentru a lega o textură de adâncime, folosim:
Line 98: Line 98:
 </​code>​ </​code>​
  
-După cum s-a menționat mai sus, putem avea mai multe texturi cu format de culoare atașate unui framebuffer. ​Acest mecanism va fi prezentat în detaliu în laboratorul 6. Dar, ca o previzualizare a informației din acel laborator, codul de mai jos scrie în 4 texturi diferite, de tipuri diferite și se poate observa că textura din atașamentul de culoare numărul 0 este complet roșie, iar cea din atașamentul de culoare numărul 1 este complet albastră.+După cum s-a menționat mai sus, putem avea mai multe texturi cu format de culoare atașate unui framebuffer. ​Codul de mai jos scrie în 4 texturi diferite, de tipuri diferite și se poate observa că textura din atașamentul de culoare numărul 0 este complet roșie, iar cea din atașamentul de culoare numărul 1 este complet albastră.
  
 <code glsl> <code glsl>
Line 158: Line 158:
  
 Metoda conține 2 pași: Metoda conține 2 pași:
-  - Redarea scenei într-un framebuffer nou. Această desenare se realizează din poziția sursei de lumină, pe direcția de iluminare a sursei, specifică tipului de sursă spot. Practic, dorim să vedem ceea ce "vede" ​sursa de lumină. Pentru simplitate, în laboratorul acesta, sursa va avea un unghi de iluminare de 90 de grade, motiv pentru care se va folosi o proiecție perspectivă cu un unghi de vizualizare atât vertical cât și orizontal de 90 de grade. Texturile obiectului de tip framebuffer,​ obținute în urma desenării, **conțin toate punctele din scenă ce sunt iluminate de către sursa de lumină**. +  - Redarea scenei într-un framebuffer nou. Această desenare se realizează din poziția sursei de lumină, pe direcția de iluminare a sursei, specifică tipului de sursă spot. Practic, dorim să vedem ceea ce vede” sursa de lumină. Pentru simplitate, în laboratorul acesta, sursa va avea un unghi de iluminare de 90 de grade, motiv pentru care se va folosi o proiecție perspectivă cu un unghi de vizualizare atât vertical cât și orizontal de 90 de grade. Texturile obiectului de tip framebuffer,​ obținute în urma desenării, **conțin toate punctele din scenă ce sunt iluminate de către sursa de lumină**. 
-  - Redarea scenei în texturile obiectului de tip framebuffer implicit din perspectiva observatorului. În această desenare, se folosește textura cu format de adâncime obținută la pasul anterior. În fragment shader, fiecare fragment se verifică daca este iluminat de către sursa de lumină sau nu. Dacă pozitia ​în spațiul ​lume a fragmentului,​ obținută prin interpolare între vârfuri, ​"apare" ​în texturile de culoare ale obiectului de tip framebuffer,​ obținut prin desenarea scenei de la pasul anterior, înseamnă că acel fragment este iluminat și trebuie să se calculeze intensitatea iluminării pentru acesta. Acest "apare" ​este descris puțin mai în detaliu mai jos.+  - Redarea scenei în texturile obiectului de tip framebuffer implicit din perspectiva observatorului. În această desenare, se folosește textura cu format de adâncime obținută la pasul anterior. În fragment shader, fiecare fragment se verifică daca este iluminat de către sursa de lumină sau nu. Dacă poziția ​în spațiul ​lumii a fragmentului,​ obținută prin interpolare între vârfuri, ​apare” în texturile de culoare ale obiectului de tip framebuffer,​ obținut prin desenarea scenei de la pasul anterior, înseamnă că acel fragment este iluminat și trebuie să se calculeze intensitatea iluminării pentru acesta. Acest apare” este descris puțin mai în detaliu mai jos.
  
 ==== Umbrirea unui fragment ==== ==== Umbrirea unui fragment ====
  
-Pentru a verifica dacă un fragment obținut prin redarea scenei din perspectiva observatorului este iluminat sau se află în umbră, putem folosi textura cu format de adâncime din obiectul de tip framebuffer obținut la pasul 1. Se verifică dacă distanța dintre poziția în spațiul ​lume a fragmentului este aceeași cu cea din textura cu format de adâncime de la pasul 1, când poziția fragmentului este proiectată în această textură.+Pentru a verifica dacă un fragment obținut prin redarea scenei din perspectiva observatorului este iluminat sau se află în umbră, putem folosi textura cu format de adâncime din obiectul de tip framebuffer obținut la pasul 1. Se verifică dacă distanța dintre poziția în spațiul ​lumii a fragmentului este aceeași cu cea din textura cu format de adâncime de la pasul 1, când poziția fragmentului este proiectată în această textură.
  
 O exemplificare a acestui proces se regăsește în imaginea de mai jos, unde pixelul marcat cu roșu în panoul a) este proiectat în pixelul marcat cu roșu din textura cu formatul de adâncime, vizibilă în panoul b). Se poate observa că fragmentul marcat cu roșu în panoul a) a fost obținut prin rasterizarea modelului ce descrie terenul, dar proiecția lui pe textura de adâncime, întâlnește un pixel rezultat în urma rasterizării modelului de bambus. O exemplificare a acestui proces se regăsește în imaginea de mai jos, unde pixelul marcat cu roșu în panoul a) este proiectat în pixelul marcat cu roșu din textura cu formatul de adâncime, vizibilă în panoul b). Se poate observa că fragmentul marcat cu roșu în panoul a) a fost obținut prin rasterizarea modelului ce descrie terenul, dar proiecția lui pe textura de adâncime, întâlnește un pixel rezultat în urma rasterizării modelului de bambus.
Line 169: Line 169:
 {{ :​ipg:​laboratoare:​sm.png?​700 |}} {{ :​ipg:​laboratoare:​sm.png?​700 |}}
  
-În situația în care distanța dintre poziția în spațiul ​lume a fragmentului pentru care se calculează iluminarea și sursa de lumină este mai mare decat cea din textura cu format de adâncime, înseamnă că în această textură este desenat un obiect ce se află mai aproape de sursa de lumină și astfel umbrește fragmentul pentru care calculăm intensitatea iluminării. Acest exemplu este chiar în imaginea de mai sus, unde poziția în spațiul ​lume a fragmentului din panoul a), de pe teren, este mai departe de sursa de lumină față de pixelul ce se regăsește la poziția proiecției lui în textura cu format de adâncime, unde se află un fragment din frunza bambusului. O observație importantă de care trebuie să se țină cont este ca cele două distanțe ​sa se compare în același spațiu.+În situația în care distanța dintre poziția în spațiul ​lumii a fragmentului pentru care se calculează iluminarea și sursa de lumină este mai mare decat cea din textura cu format de adâncime, înseamnă că în această textură este desenat un obiect ce se află mai aproape de sursa de lumină și astfel umbrește fragmentul pentru care calculăm intensitatea iluminării. Acest exemplu este chiar în imaginea de mai sus, unde poziția în spațiul ​lumii a fragmentului din panoul a), de pe teren, este mai departe de sursa de lumină față de pixelul ce se regăsește la poziția proiecției lui în textura cu format de adâncime, unde se află un fragment din frunza bambusului. O observație importantă de care trebuie să se țină cont este ca cele două distanțe ​să se compare în același spațiu.
  
 Trimiterea texturii cu format de adâncime se poate realiza la fel ca trimiterea unei texturi cu format de culoare. API-ul grafic OpenGL are și un alt mecanism special pentru aceste tipuri de texturi, nefolosit în acest laborator. Vedeți observația de mai jos. Trimiterea texturii cu format de adâncime se poate realiza la fel ca trimiterea unei texturi cu format de culoare. API-ul grafic OpenGL are și un alt mecanism special pentru aceste tipuri de texturi, nefolosit în acest laborator. Vedeți observația de mai jos.
ipg/laboratoare/09.1759224575.txt.gz · Last modified: 2025/12/03 10:15 (external edit)
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