This is an old revision of the document!


Laboratorul 3

Redarea directă folosind texturi 2D

Redarea directă folosește o geometrie proxy (ajutătoare): 3 seturi de “poligoane-felie”, fiecare set fiind paralel cu unul din planele principale

Figura 1

Concepte teoretice

  • La un moment dat se rasterizează un singur set de poligoane-felie, pe care se aplică stiva corespunzătoare de texturi
  • 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ă)
    • Compunerea culorilor: schema din spate în față, folosind formula $C_{dst} = C_{src} + C_{dst} (1 - A_{src})$
  • 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
    • Când unghiul dintre direcția de vizualizare și normala la planele poligoanelor devine mai mare de 45 grade, trebuie schibată geometria proxy

Figura 2

Implementare

Atribute

Î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; 

Metode

Generare stive texturi

load2DTexturesRAW_X() generează stiva de texturi de-a lungul axei Ox, citind datele din volumeData

  • feliile sunt imagini de rezoluție 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)
  • Atunci (reminder cum se adresează elementele unor matrici multi-dimensionale care sunt liniarizate):
    currentSlice[k * ysize + j] = ((float)volumeData[k * ysize * xsize + j * xsize + slice]) / 255.0f;
  • Atenție! În metoda 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:

  • Toate coordonatele x ale vârfurilor sunt egale cu 0
  • Coordonatele y ș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).
  • Coordonatele de textură ale vârfurilor pătratului sunt în intervalul [0,1]: (0,0), (1,0), (1,1) și (0,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

  • 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ă.
  • Dacă acel produs (fără modul) e pozitiv, înseamnă că observatorul este de partea pozitivă a acelei axe. Pentru acumulare din spate în față, poligoanele se desenează de la cel mai îndepărtat la cel mai apropiat. Astfel, urmează să se deseneze stiva unei axe negative (care pornește de la -1 și merge până la 1)
  • Dacă produsul e negativ, se desenează stiva unei axe pozitive (care pornește de la 1 și merge până la -1)

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)

  • Se pornește cu o matrice de modelare care translatează pătratul din planul yOz la xPos = -1:
    glm::mat4 model_matrix_slice = glm::translate(glm::mat4(1), glm::vec3(xPos, 0, 0));
  • Se setează mecanisum de blending:
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
    • 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).
    • 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
  • După fiecare desenare, se actualizează xPos
  • 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.
vdvac/lab3.1711378913.txt.gz · Last modified: 2024/03/25 17:01 by anca.morar
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0