Redarea directă folosește o geometrie proxy (ajutătoare): 3 seturi de “poligoane-felie”, fiecare set fiind paralel cu unul din planele principale
Figura 2
În plus față de elementele din laboratoarele anterioare, se folosesc 3 stive de texturi:
unsigned int* textures_idX; unsigned int* textures_idY; unsigned int* textures_idZ;
Generare stive texturi
load2DTexturesRAW_X()
generează stiva de texturi de-a lungul axei Ox
, citind datele din volumeData
ysize * zsize
slice
este iteratorul pentru parcurgerea axei Ox
(la volumeData
)j
este iteratorul pentru parcurgerea axei Oy
, iar k
este iteratorul pentru parcurgerea axei Oz
(atât la currentSlice
cât și la volumeData
)currentSlice[k * ysize + j] = ((float)volumeData[k * ysize * xsize + j * xsize + slice]) / 255.0f;
load2DTexturesRAW_Y()
, se generează texturi de-a lungul axei Oy
, deci feliile sunt imagini de rezoluție xsize * zsize
, slice
o sa fie iteratorul pentru parcurgerea axei Oy
, i
o sa fie iteratorul pentru parcurgerea axei Ox
, iar k
, iteratorul pentru parcurgerea axei Oz
. Analog și pentru load2DTexturesRAW_Z()
Creare poligoane în planele principale
createPoligX()
creează un poligon care este în planul yOz
, pentru afișarea poligoanelor de-a lungul axei Ox
:
x
ale vârfurilor sunt egale cu 0y
și z
sunt coordonatele unui pătrat centrat în origine, de latură 2, în planul yOz
: (-1,-1), (1,-1), (1,1) și (-1,1). Determinare stivă de poligoane redate
detMostPerpendicularAxis()
determină cea mai perpendiculară axă (Ox / Oy / Oz
) pe planul de vizualizare, și partea (pozitivă / negativă) de care se află observatorul
Ox
, Oy
și Oz
)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
)
yOz
într-un plan paralel cu acesta, dar care are coordonata xPos = -1
: glm::mat4 model_matrix_slice = glm::translate(glm::mat4(1), glm::vec3(xPos, 0, 0));
glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
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).xsize
a volumuluixPos
(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
.