Tema1

Redarea volumelor folosind texturi 3D

Să se implementeze redarea volumelor folosind texturi 3D (cursul 6).

Teorie

  • Geometria proxy - un set de poligoane paralele cu planul de vizualizare
    • Poligoanele - rasterizate în ordinea din spate în față
    • Geometria trebuie recalculată la fiecare schimbare a direcției de vizualizare
  • Volumul de date - textură 3D
    • Textura 3D - texeli care pot fi adresați prin coordonate de textură 3D
      0 <= s, t, r <=1
    • Vârfurile geometriei proxy - coordonate
      0 <= x, y, z <= 1

Generarea poligoanelor

  1. Se calculează intersecția dintre planul de secționare și liniile drepte pe care se află laturile volumului încadrator
  2. Se elimină punctele de intersecție duplicat (care coincid cu un colț al volumului) și cele nevalide (care nu sunt pe segmentele volumului)
  3. 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

1. Citirea și încărcarea datelor: Citirea dintr-un fișier .raw și încărcarea datelor în volum

  • Se poate folosi funcția loadRAWFile() din laboratoarele anterioare

2. Crearea unui cub cu vârfurile în intervalul (0,0,0)-(1,1,1)

  • Se poate folosi funcția createCube() din laboratorul 2

3. Generarea texturii 3D și încărcarea datelor din volum în această textură

  • Se poate folosi funcția createVolumeTexture() din laboratorul 2

4. Intersecția dintre o dreaptă și un plan

  • Intersecția se poate calcula cu formulele de aici (forma algebrică)
  • Planul este caracterizat prin:
    • normala la plan
    • un punct de pe plan
  • Dreapta este caracterizată prin
    • versorul acesteia
    • un punct de pe dreaptă

5. Sortarea punctelor în ordine trigonometrică sau orară

  • Se poate folosi algoritmul prezentat aici

6. 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
    • Planul de secționare e caracterizat prin
      • normala la plan: vectorul de vizualizare viewVec:
        • - glm::normalize(camera→m_transform→GetLocalOZVector())
      • un punct de pe plan (de exemplu, dat de obsPos + viewVec * viewDist)
    • Dreapta curentă e caracterizată prin
      • versorul acesteia (deoarece dreptele conțin laturile cubului, versorii pot fi (0,0,1), (0,1,0) sau (1,0,0))
      • Un punct de pe dreaptă (se pot alege vârfuri ale cubului care aparțin și dreptei curente)
  • Se elimină punctele nevalide (punctele duplicat sau punctele din afara laturilor)
  • Punctele rămase se sortează în ordine trigonometrică/orară

7. 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)
    • poligNo poate fi modificat de la tastatură
    • o valoare rezonabilă inițială pentru poligNo poate fi dimensiunea volumului (pe una din axe). De exemplu, pentru volumul de date din fișierul engine.raw, valoarea inițială poligNo = 256
  • 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.

Generarea geometriei proxy se poate realiza fie în programul aplicație (fișierul .cpp), fie în vertex shader (mai complicat) sau geometry shader (recomandat).

Pentru implementarea temei, în folderul src/lab_vdvac 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, puteți să rulați din nou cmake, sau să apăsați click dreapta pe filtrul lab_vdvac și să 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_vdvac/Tema1/Tema1.h”

Dacă alegeți implementarea în shadere, trebuie să aveți grijă la câteva aspecte.

Instrucțiuni repetitive

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
   ....
}

Limită hardware

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 vârfuri 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)

  1. Încărcarea datelor în volum, generarea texturii 3D, crearea cubului încadrator (30p)
  2. Generarea corectă a unui poligon proxy (120p)
    1. Calculul corect al intersecției dintre o dreaptă a cubului și un plan de secționare (50p)
    2. Calculul punctelor de intersecție dintre planul de secționare și toate dreptele cubului (20p)
    3. Sortarea corectă a punctelor de intersecție valide în sens orar/trigonometric (30p)
  3. Generarea întregii geometrii proxy (50p)
  4. Texturarea corectă a poligoanelor și acumularea din spate în față (50p)

Bonusuri posibile(Total 50 puncte)

  1. Generarea geometriei proxy în geometry shader / vertex shader
  2. Alte elemente interesante

Demo

vdvac/tema1.txt · Last modified: 2024/04/03 13:24 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