This shows you the differences between two versions of the page.
vdvac:lab3 [2024/03/25 17:00] anca.morar [Metode] |
vdvac:lab3 [2024/03/25 17:45] (current) anca.morar [Demo] |
||
---|---|---|---|
Line 12: | Line 12: | ||
* Culorile fragmentelor rezultate din rasterizarea geometriei proxy sunt acumulate în buffer-ul imagine | * Culorile fragmentelor rezultate din rasterizarea geometriei proxy sunt acumulate în buffer-ul imagine | ||
* Culorile fragmentelor rezultate din rasterizarea unui poligon sunt calculate de hardware-ul plăcii grafice (interpolare biliniară) | * Culorile fragmentelor rezultate din rasterizarea unui poligon sunt calculate de hardware-ul plăcii grafice (interpolare biliniară) | ||
- | * Compunerea culorilor: schema din spate în față, folosind formula $C_{dst} = C_{src} + C_{dst} (1 - A_{src})$ | + | * Compunerea culorilor: schema din spate în față, folosind formula $C_{dst} = C_{src} + C_{dst} (1 - A_{src})$ (se realizează printr-un mecanism de blending) |
* Cazurile ideale: când direcția de vizualizare e perpendiculară pe planele poligoanelor geometriei proxy | * Cazurile ideale: când direcția de vizualizare e perpendiculară pe planele poligoanelor geometriei proxy | ||
* În rest, se alege setul de poligoane care este "cel mai perpendicular" pe direcția de vizualizare | * În rest, se alege setul de poligoane care este "cel mai perpendicular" pe direcția de vizualizare | ||
Line 47: | Line 47: | ||
**Determinare stivă de poligoane redate** | **Determinare stivă de poligoane redate** | ||
- | ''detMostPerpendicularAxis()'' determină cea mai perpendiculară axă (''Ox / Oy / Oz'') pe planul de vizualizare, și partea (pozitivă / negativă) pe care se află observatorul | + | ''detMostPerpendicularAxis()'' determină cea mai perpendiculară axă (''Ox / Oy / Oz'') pe planul de vizualizare, și partea (pozitivă / negativă) de care se află observatorul |
* Se calculează produsele scalare dintre vectorul de vizualizare și axele principale (''Ox'', ''Oy'' și ''Oz'') | * Se calculează produsele scalare dintre vectorul de vizualizare și axele principale (''Ox'', ''Oy'' și ''Oz'') | ||
* Se determină cel mai mare produs scalar în valoare absolută. | * Se determină cel mai mare produs scalar în valoare absolută. | ||
Line 55: | Line 55: | ||
**Desenare stivă poligoane** | **Desenare stivă poligoane** | ||
- | ''DesenStivaAxaXNegativa()'' desenează poligoanele de-a lungul axei Ox, de la cel mai îndepărtat de observator (care are coordonata ''xPos = -1'') până la cel mai apropiat (care are coordonata ''xPos = 1'') | + | ''DesenStivaAxaXNegativa()'' desenează poligoanele de-a lungul axei ''Ox'', de la cel mai îndepărtat de observator (care are coordonata ''xPos = -1'') până la cel mai apropiat (care are coordonata ''xPos = 1'') |
- | * Se pornește cu o matrice de modelare care translatează pătratul din planul yOz la ''xPos = -1'': <code>glm::mat4 model_matrix_slice = glm::translate(glm::mat4(1), glm::vec3(xPos, 0, 0));</code> | + | * Se pornește cu o matrice de modelare care translatează pătratul din planul ''yOz'' într-un plan paralel cu acesta, dar care are coordonata ''xPos = -1'': <code>glm::mat4 model_matrix_slice = glm::translate(glm::mat4(1), glm::vec3(xPos, 0, 0));</code> |
- | * Se setează mecanisum de blending: <code>glEnable(GL_BLEND); | + | * Se setează mecanismul de blending: <code>glEnable(GL_BLEND); |
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);</code> | glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);</code> | ||
- | * Funcția aceasta stabilește mecanismul de amestec al culorii. Astfel ''GL_ONE'' este factorul cu care se înmulțește culoarea curentă (culoarea sursă) și ''GL_ONE_MINUS_SRC_ALPHA'' este factorul cu care se înmulțește acumulată (culoarea destinație). | + | * Funcția aceasta stabilește mecanismul de amestec al culorii. Astfel ''GL_ONE'' este factorul cu care se înmulțește culoarea curentă (culoarea sursă) și ''GL_ONE_MINUS_SRC_ALPHA'' este factorul cu care se înmulțește culoarea acumulată (culoarea destinație). |
* Se respectă formula $C_{dst} = C_{src} + C_{dst} (1 - A_{src})$ | * Se respectă formula $C_{dst} = C_{src} + C_{dst} (1 - A_{src})$ | ||
* Se desenează atâtea pătrate cât este dimensiunea ''xsize'' a volumului | * Se desenează atâtea pătrate cât este dimensiunea ''xsize'' a volumului | ||
- | * După fiecare desenare, se actualizează ''xPos'' | + | * După fiecare desenare, se actualizează ''xPos'' (ca să ajungă de la -1 la 1) |
* ''DesenStivaAxaXNegativa()'' desenează poligoanele de-a lungul axei Ox, de la cel mai îndepărtat (care are coordonata ''xPos = 1'') până la cel mai apropiat (care are coordonata ''xPos = -1''). Analog pentru axele ''Oy'' și ''Oz''. | * ''DesenStivaAxaXNegativa()'' desenează poligoanele de-a lungul axei Ox, de la cel mai îndepărtat (care are coordonata ''xPos = 1'') până la cel mai apropiat (care are coordonata ''xPos = -1''). Analog pentru axele ''Oy'' și ''Oz''. | ||
+ | |||
+ | ==== Demo ==== | ||
+ | |||
+ | <html> | ||
+ | <p style="text-align:center;margin:auto;"> | ||
+ | <iframe width="430" height="250" src="https://www.youtube.com/embed/LiY6FlgQrew" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> | ||
+ | </p> | ||
+ | </html> | ||
+ |