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 * zsizeslice 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.