Table of Contents

Tema1

Redarea volumelor folosind texturi 3D

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

Teorie

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

Metode importante

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

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

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

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

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

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)

7. Afișarea geometriei proxy

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