This is an old revision of the document!
Tema1
Redarea volumelor folosind texturi 3D
Să se implementeze redarea volumelor folosind texturi 3D (cursul 6).
Teorie
Generarea poligoanelor
Se calculează intersecția dintre planul de secționare și liniile drepte pe care se află laturile volumului încadrator
Se elimină punctele de intersecție duplicat (care coincid cu un colț al volumului) și cele nevalide (care nu sunt pe segmentele volumului)
Se sortează punctele de intersecție rămase pentru a forma un poligon închis (fie în ordine trigonometrică, fie în ordine orară)
Detalii de implementare
Se poate porni de la laboratoarele 2 (Ray casting) și 3 (Redarea folosind texturi 2D)
Atribute importante
volumul de date (volumeData
) și dimensiunea acestuia (xsize
, ysize
, zsize
)
textura 3D, cu datele din volum (volumeTexture
)
vectorul de vizualizare (viewVec
)
numărul de poligoane care se vor genera (poligsNo
)
Metode importante
Citirea și încărcarea datelor: Citirea dintr-un fișier .raw și încărcarea datelor în volum
Crearea unui cub cu vârfurile în intervalul (0,0,0)-(1,1,1)
Generarea texturii 3D și încărcarea datelor din volum în această textură
Intersecția dintre o dreaptă și un plan
Sortarea punctelor în ordine trigonometrică sau orară
Se poate folosi algoritmul prezentat
aici
Generarea unui poligon din geometria proxy în funcție de vectorul de vizualizare, poziția observatorului (obsPos
) și distanța de la observator la planul de secționare (viewDist
)
Pentru fiecare latură a cubului, se calculează intersecția dintre dreapta pe care stă latura și planul de secționare curent
Se elimină punctele nevalide (punctele duplicat sau punctele din afara laturilor)
Punctele rămase se sortează în ordine trigonometrică/orară
Afișarea geometriei proxy
Funcția de generare a unui poligon proxy se apelează de poligNo
ori, modificând distanța de la observator la planul curent de secționare (se randează poligoanele în ordinea de la cel mai îndepărtat la cel mai apropiat)
Se activează blending-ul și se setează funcția de blending pentru acumularea din spate în față (la fel ca în laboratorul 3)
Indicații suplimentare
Tema va fi implementată în OpenGL și C++. Este indicat să folosiți framework-ul și Visual Studio.
Pentru implementarea temei, în folderul src/lab_m1 puteți crea un nou folder, de exemplu Tema1, cu fișierele Tema1.cpp și Tema1.h (pentru implementare POO, este indicat să aveți și alte fișiere). Pentru a vedea fișierele nou create în Visual Studio în Solution Explorer, apăsați click dreapta pe filtrul lab_m1 și selectați Add→New Filter. După ce creați un nou filtru, de exemplu Tema1, dați click dreapta și selectați Add→Existing Item. Astfel adăugați toate fișierele din folderul nou creat. În fișierul lab_list.h trebuie adăugată și calea către header-ul temei. De exemplu: #include “lab_m1/Tema1/Tema1.h”
Generarea geometriei proxy se poate realiza fie în programul aplicație (fișierul .cpp), fie în vertex shader (mai complicat) sau geometry shader (recomandat).
Dacă alegeți implementarea în shadere, aveți grijă la următoarele aspecte:
Dacă folosiți instrucțiunea
for
, mergeți cu număr fix de iterații. De exemplu, dacă vreți să procesați elementele unui vector de puncte de dimensiune
nrPuncte
(care e o variabilă cu valoarea maximă 12), puteți folosi următorul artificiu:
for (int i = 0; i < 12; i++)
{
if (i >= nrPuncte)
break;
....
//procesare punct curent
....
}
Dacă generați geometria proxy în geometry shader, intrarea programului shader poate fi un obiect bogus (de exemplu, un punct sau o linie formată din două puncte). Totuși, aveți grijă la limita de puncte care se pot genera pentru o singură primitivă. Astfel, este indicat ca o rulare a programului geometry shader să genereze un singur poligon al geomtriei proxy, și nu toată geometria.
Barem (Total 250 puncte)
Încărcarea datelor în volum, generarea texturii 3D, crearea cubului încadrator (30p)
Generarea corectă a unui poligon proxy (120p)
Calculul corect al intersecției dintre o dreaptă a cubului și un plan de secționare (50p)
Calculul punctelor de intersecție dintre planul de secționare și toate dreptele cubului (20p)
Sortarea corectă a punctelor de intersecție valide în sens orar/trigonometric (30p)
Generarea întregii geometrii proxy (50p)
Texturarea corectă a poligoanelor și acumularea din spate în față (50p)
Bonusuri posibile(Total 50 puncte)
Generarea geometriei proxy în geometry shader / vertex shader
Alte elemente interesante