This shows you the differences between two versions of the page.
ppbg:laboratoare:08 [2024/10/02 09:58] andrei.lambru |
ppbg:laboratoare:08 [2024/11/27 22:13] (current) andrei.lambru |
||
---|---|---|---|
Line 7: | Line 7: | ||
===== Obiecte de tip textură ===== | ===== Obiecte de tip textură ===== | ||
- | Un obiect de tip textură reprezintă o secvență continuă de informație în interiorul memoriei RAM a procesorului grafic. În particular, în cadrul acestui laborator, ne referim la obiecte de tip textură ce pastrează informație din interiorul unei grile de două dimensiuni. | + | Un obiect de tip textură reprezintă o secvență continuă de informație în interiorul memoriei RAM a procesorului grafic. În particular, în cadrul acestui laborator, ne referim la obiecte de tip textură ce păstrează informația din interiorul unei grile de două dimensiuni. |
Într-o grilă de două dimensiuni, putem stoca informația unei imagini :) în care, în fiecare celulă, păstrăm informația unui pixel. | Într-o grilă de două dimensiuni, putem stoca informația unei imagini :) în care, în fiecare celulă, păstrăm informația unui pixel. | ||
Line 70: | Line 70: | ||
</note> | </note> | ||
- | ==== Piramida "mipmap" ==== | + | ==== Piramida „mipmap” ==== |
- | Conceptul de piramidă "mipmap" a fost propus de Lance Williams în anul 1983 și constă în stocarea unei "piramide" de versiuni de diferite rezoluții ale unei imagini. Un astfel de exemplu se poate observa în imaginea de mai jos, în care în aceeași grilă, în partea stângă este stocată imaginea la rezoluția inițială, iar în partea dreaptă sunt stocate versiunile imaginii inițiale la rezoluție de 2, 4, 8, până la 128 de ori mai mică. | + | Conceptul de piramidă „mipma” a fost propus de Lance Williams în anul 1983 și constă în stocarea unei „piramide” de versiuni de diferite rezoluții ale unei imagini. Un astfel de exemplu se poate observa în imaginea de mai jos, în care în aceeași grilă, în partea stângă este stocată imaginea la rezoluția inițială, iar în partea dreaptă sunt stocate versiunile imaginii inițiale la rezoluție de 2, 4, 8, până la 128 de ori mai mică. |
{{ :ppbg:laboratoare:mipmap.jpg?300 |}} | {{ :ppbg:laboratoare:mipmap.jpg?300 |}} | ||
<note tip> | <note tip> | ||
- | Termenul de "mipmap" provine de la primele litere ale cuvintelor din fraza în limba latină //multum in parvo//, mip, ceea ce în limba română se traduce prin //mult în puțin// și de la termenul de "map" din limba engleză, ceea ce în limba română se traduce prin hartă. | + | Termenul de „mipmap” provine de la primele litere ale cuvintelor din fraza în limba latină //multum in parvo//, mip, ceea ce în limba română se traduce prin //mult în puțin// și de la termenul de „map” din limba engleză, ceea ce în limba română se traduce prin hartă. |
</note> | </note> | ||
Line 138: | Line 138: | ||
Procesul de eșantionare este cunoscut sub numele de **filtrare**. | Procesul de eșantionare este cunoscut sub numele de **filtrare**. | ||
- | Pentru parametrul de filtrare în situația în care doi pixeli vecini obținuti prin rasterizare au coordonate de textură la distanță mai mare de o celulă din grila 2D, prin parametrul ''GL_TEXTURE_MIN_FILTER'' se poate specifica: | + | Pentru parametrul de filtrare, în situația în care doi pixeli vecini obținuti prin rasterizare au coordonate de textură la distanță mai mare de o celulă din grila 2D, prin parametrul ''GL_TEXTURE_MIN_FILTER'' se poate specifica: |
* ''GL_NEAREST'' - eșantionare directă doar din imaginea inițială. | * ''GL_NEAREST'' - eșantionare directă doar din imaginea inițială. | ||
* ''GL_LINEAR'' - eșantionare liniară doar din imaginea inițială. | * ''GL_LINEAR'' - eșantionare liniară doar din imaginea inițială. | ||
Line 146: | Line 146: | ||
* ''GL_LINEAR_MIPMAP_LINEAR'': interpolare liniară între valorile obținute prin eșantionare liniară a versiunilor imaginii inițiale ce au rezoluțiile cele mai apropiate de dimensiunea pixelului în spațiul grilei 2D. | * ''GL_LINEAR_MIPMAP_LINEAR'': interpolare liniară între valorile obținute prin eșantionare liniară a versiunilor imaginii inițiale ce au rezoluțiile cele mai apropiate de dimensiunea pixelului în spațiul grilei 2D. | ||
- | Pentru parametrul de filtrare în situația în care doi pixeli vecini obținuti prin rasterizare au coordonate de textură la distanța mai mică de o celulă din grila 2D, prin parametrul ''GL_TEXTURE_MAG_FILTER'' se poate specifica: | + | Pentru parametrul de filtrare, în situația în care doi pixeli vecini obținuti prin rasterizare au coordonate de textură la distanța mai mică de o celulă din grila 2D, prin parametrul ''GL_TEXTURE_MAG_FILTER'' se poate specifica: |
* ''GL_NEAREST'' - eșantionare directă doar din imaginea inițială. | * ''GL_NEAREST'' - eșantionare directă doar din imaginea inițială. | ||
* ''GL_LINEAR'' - eșantionare liniară doar din imaginea inițială. | * ''GL_LINEAR'' - eșantionare liniară doar din imaginea inițială. | ||
Line 153: | Line 153: | ||
</note> | </note> | ||
- | Pentru a genera piramida "mipmap" se utilizează: | + | Pentru a genera piramida „mipmap” se utilizează: |
<code cpp> | <code cpp> | ||
Line 161: | Line 161: | ||
==== Unitatea de texturare ==== | ==== Unitatea de texturare ==== | ||
- | Procesul de esantionare este realizat de o entitate autonoma implementata hardware sub forma unui procesor in interiorul procesorului grafic sau software in driver-ul companion procesorului. Aceasta entitate autonoma este numita **unitate de texturare** si numarul lor este in general limitat la 32. | + | Procesul de eșantionare este realizat de o entitate autonomă implementată hardware sub forma unui procesor în interiorul procesorului grafic sau software în driver-ul companion procesorului. Această entitate autonomă este numită **unitate de texturare** și numărul lor este în general limitat la 32. |
- | Pentru a utiliza procesul de esantionare, trebuie sa asociem obiectul de tip textura pe care dorim sa il esantionam cu o unitate de texturare, numerotat cu identificatori de la 0 la 31 si sa transmitem la un program de tip shader numarul unitatii de texturare: | + | Pentru a utiliza procesul de eșantionare, trebuie să asociem obiectul de tip textură pe care dorim sa îl eșantionăm cu o unitate de texturare, numerotat cu identificatori de la 0 la 31 și să transmitem la un program de tip shader numărul unității de texturare: |
<code cpp> | <code cpp> | ||
Line 173: | Line 173: | ||
</code> | </code> | ||
- | Pentru a utiliza unitatea de texturare, putem folosi intr-un program de tip shader ''texture()'': | + | Pentru a utiliza unitatea de texturare, putem folosi într-un program de tip shader ''texture()'': |
<code glsl> | <code glsl> | ||
Line 199: | Line 199: | ||
{{ egc:laboratoare:lab9texturephoto5.png?600 |}} | {{ egc:laboratoare:lab9texturephoto5.png?600 |}} | ||
- | Pentru a nu asocia pixelului culoarea de la atributul de ieșire a programului de tip fragment shader, se poate folosi directiva ''discard'': | + | Pentru a nu asocia pixelului culoarea de la atributul de ieșire al programului de tip fragment shader, se poate folosi directiva ''discard'': |
<code cpp> | <code cpp> | ||
Line 233: | Line 233: | ||
* În metoda ''Init()'', specificați coordonatele de textură ale vârfurilor unui patrulater. Aveți în vedere că directiva ''glTexImage2D()'' asociază primele celule din memorie cu linia de jos a grilei 2D, astfel că este necesară inversarea componentei y a coordonatelor de textură. | * În metoda ''Init()'', specificați coordonatele de textură ale vârfurilor unui patrulater. Aveți în vedere că directiva ''glTexImage2D()'' asociază primele celule din memorie cu linia de jos a grilei 2D, astfel că este necesară inversarea componentei y a coordonatelor de textură. | ||
* Până în acest punct, rezultatul pe care ar trebui să îl obțineti este următorul: {{ ppbg:laboratoare:textures.png?600 | }} | * Până în acest punct, rezultatul pe care ar trebui să îl obțineti este următorul: {{ ppbg:laboratoare:textures.png?600 | }} | ||
- | - 0.05p - Completați metoda ''CreateStrippedTexture()'' pentru a crea conținutul unei grile 2D ce conține o informație de culoare cu trei componente, rgb, în fiecare celulă. Grila 2D trebuie să conțina același triplet (r, g, b) în toate celulele ce se află pe aceeași linie. Altfel spus, toate valorile de culoare de pe o linie sunt identice. Culoarea celulelor unei linii este aleasă aleatoriu. Un exemplu de rezultat posibil este: {{ ppbg:laboratoare:striped.png?300 | }} | + | - 0.05p - Completați metoda ''CreateStrippedTexture()'' pentru a crea conținutul unei grile 2D ce conține o informație de culoare cu trei componente, rgb, în fiecare celulă. Grila 2D trebuie să conțină același triplet (r, g, b) în toate celulele ce se află pe aceeași linie. Altfel spus, toate valorile de culoare de pe o linie sunt identice. Culoarea celulelor unei linii este aleasă aleatoriu. Un exemplu de rezultat posibil este: {{ ppbg:laboratoare:striped.png?300 | }} |
- 0.05p - Creați un alt program de tip shader în care să eșantionați informația din două obiecte de tip textură și atribuiți la final o culoare obținută prin combinarea celor două culori eșantionate: | - 0.05p - Creați un alt program de tip shader în care să eșantionați informația din două obiecte de tip textură și atribuiți la final o culoare obținută prin combinarea celor două culori eșantionate: | ||
* Utilizați programul de tip shader pentru desenarea cubului din partea dreaptă. | * Utilizați programul de tip shader pentru desenarea cubului din partea dreaptă. | ||
Line 243: | Line 243: | ||
* Utilizați programul de tip shader pentru desenarea planului din depărtare. | * Utilizați programul de tip shader pentru desenarea planului din depărtare. | ||
* Harta de înălțimi este stocată în cel de-al doilea obiect de tip textură. | * Harta de înălțimi este stocată în cel de-al doilea obiect de tip textură. | ||
- | * În atributul de ieșire al programului de tip fragment shader, trimiteți o culoare obținuta prin interpolare liniară între valorile eșantionate din obiectul de tip textură ce pastrează informație de culoare și cel ce păstrează informație de înălțime. | + | * În atributul de ieșire al programului de tip fragment shader, trimiteți o culoare obținută prin interpolare liniară între valorile eșantionate din obiectul de tip textură ce pastrează informație de culoare și cel ce păstrează informație de înălțime. |
* Rezultatul obținut este cel de la secțiunea Stocarea unor informații generice, de mai sus. | * Rezultatul obținut este cel de la secțiunea Stocarea unor informații generice, de mai sus. | ||
- | Bonus: Utilizați imaginile ''lab7/images/snow.png'' și ''lab7/images/water.png'', împreună cu valoarea de înălțime a fiecarui pixel, pentru a obține rezultatul de mai jos. Observați că trecerea de la zona de apă la cea de pământ este graduală. Același lucru este valabil și pentru trecerea de la zona de pământ la cea de zăpadă :) . | + | Bonus: Utilizați imaginile ''lab08/images/snow.png'' și ''lab08/images/water.png'', împreună cu valoarea de înălțime a fiecarui pixel, pentru a obține rezultatul de mai jos. Observați că trecerea de la zona de apă la cea de pământ este graduală. Același lucru este valabil și pentru trecerea de la zona de pământ la cea de zăpadă :) . |
{{ ppbg:laboratoare:terrain2.png?600 | }} | {{ ppbg:laboratoare:terrain2.png?600 | }} | ||