Tema 1 - Mirrored Particles

  • Responsabili: Alex Grădinaru, Cristi Lambru
  • Lansare: 25 noiembrie 2022
  • Termen de predare: 18 decembrie 2022, ora 23:55
  • Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!

În cadrul acestei teme va trebui să implementați un demo tehnic ce utilizează și prezintă cunoștințele acumulate. Un video demonstrativ ce înfățișează o posibilă implementare îl puteți viziona în continuare:

Sistemul de particule

Elementul central al acestei teme este realizarea unui sistem de particule.

Se va genera un numar mic de particule (de ex 10 particule sunt suficiente) la pozitii aleatoare in interiorul unui spatiu cubic de dimensiune 20 (spatiul este cel deja folosit in cadrul laboratorului).

Particulele sunt caracterizate de urmatoarele aspecte:

  • fiecare particula va fi animata
    • va avea o miscare simpla de translatie continua, pe o singura directie. Directia si viteza de miscare pentru fiecare particula trebuie sa fie diferite (pot fi alese aleator)
    • va avea o transformare de rotatie pe toate axele. Directia si unghiurile de rotatie pentru fiecare particula trebuie sa fie diferite (pot fi alese aleator)
  • fiecare particula este construita ca o suprafata de rotatie determinata de o curba Bezier
  • culoarea particulelor poate fi unitara: nu este necesara texturarea particulei, puteti folosi o culoare simpla RGB (de ex alb) pentru afisarea particulelor

Geometria particulei

Fiecare particula este construita ca o suprafata de rotatie, plecand de la o curba Bezier. Astfel, pentru fiecare particula veti considera 4 puncte de control pentru care generati puncte pe o curba Bezier folosind Geometry Shader.

Aveti grija la numarul maxim de vertecsi pe care ii poate genera GS.

Intrucat numarul de vertecsi generati in GS este limitat va fi necesar sa folositi o desenare cu instante (glDrawElementsInstanced) astfel incat sa generati pentru fiecare instanta cate o 'banda' de suprafata (o suprafata generata de 2 curbe consecutive).

Daca folositi sistemul de particule din laborator, puteti modifica acest lucru din clasa care gestioneaza particulele (mai exact din functia de particleEffect→Render).

Numarul de puncte generate pe curba nu trebuie sa fie foarte mare, dar stabilit astfel incat sa puteti genera suficienta geometrie (daca folositi prea multe puncte e posibil sa pierdeti geomtrie daca nr de vertecsi generat este mai mare decat limita hardware a GS). Similar, numarul de instante trebuie sa fie suficient astfel incat sa generati o suprata de rotatie de 360 de grade.

Controlul sistemului de particule

Sistemul de particule va trebui sa aiba un control minim de la tastatura care sa vizeze:

  • controlul vitezei sistemului (va afecta intreg sistemul de particule, suplimentar fata de viteza de baza a fiecarei particule) - trebuie sa puteti controla de la tastatura viteza de 'play' folosind 2 taste (increment pozitiv si negativ)
  • buton de pauza totala a sistemului de particule (doar sistemul de particule trebuie oprit, camera din scena trebuie sa fie functionala)
  • buton de reset: va reseta pozitia curenta fiecarei particule generate la pozitia initiala de pornire

Desenarea pe fețele oglinzii

Particulele se vor afla în interiorul unui cub cu fețe oglindă. Pe fețele interioare ale cubului se vor vedea reflexiile particulelor din scenă. Acest efect va fi obținut prin desenarea geometriei din punctul de vizualizare a 6 camere diferite. Se stabilește poziția centrului fiecărei fețe și direcția de vizualizare spre centrul cubului și se desenează geometria cu camerele descrise de aceste poziții și direcții de vizualizare. Pentru simplitate, toate cele 6 camere vor utiliza o proiecție ortografică. Geometria cubului se va realiza prin 6 quad-uri diferite pe care se va aplica textura specifică fiecărei fețe.

Desenarea cu cele 6 camere se va realiza într-un singur pas de rasterizare. Acest lucru va fi posibil prin utilizarea unui framebuffer ce conține 6 texturi de culoare. În fiecare textură se va desena geometria din punctul de vizualizare a uneia din cele 6 camere descrise mai sus.

Pentru a obține acest rezultat, în geometry shader se emite de 6 ori geometria, o dată pentru fiecare față. Cele 6 versiuni ale geometriei sunt identice în spatiul obiectului. Se folosesc 6 matrici de transformare în spații de vizualizare diferite, câte una pentru fiecare cameră și se calculează pozițiile vertecșilor emiși în spațiul de vizualizare a fiecărei camere. Cele 6 versiuni diferite ale geometriei în spațiul de vizualizare sunt trimise spre rasterizare și sunt desenate într-una din cele 6 texturi de culoare ale framebuffer-ului. Textura în care se va desena se alege pe baza feței corespunzătoare spațiului de vizualizare al camerei în care a fost proiecată geometria.

Cele 6 texturi de culoare ale framebuffer-ului vor fi pătrate pentru a se mapa fără deformare pe fețele interioare ale cubului. Nu este necesară o rezoluție mare a fiecărei texturi. Rezoluția de 512×512 este suficientă.

Deoarece geometria din 6 spații de vizualizare este desenată într-un singur pas de rasterizare și poate fi folosit un singur buffer de adâncime, va trebui să dezactivăm testul de adâncime. Pentru simplitate, geometria va fi desenată cu aceeași culoare pe o întreagă față interioară a cubului, dar se vor folosi culori diferite între fețe. Menționăm că mecanismul de blend trebuie utilizat pentru desenarea particulelor.

Notare (150p)

  • Sistemul de particule (100p in total)
    • Animare
      • Miscare de translatie continua pe o singura directie aleatoare (15p)
      • Viteza diferita de miscare pentru fiecare particula (10p)
      • Animatie de rotatie pe toate axele (15p)
      • Directii si unghiuri de rotatie diferite pentru fiecare particula (10p)
    • Generarea suprafetelor de rotatie
      • Desenarea suprafetelor de rotatie (20p)
      • Desenare instantiata (10p)
    • Controlul sistemului de particule
      • Controlul vitezei (5p)
      • Buton de pauza (5p)
      • Buton de reset (10p)
  • Desenarea pe fețele oglinzii (50p in total)
    • Pozitionarea oglinzilor in forma de cub (10p)
    • Generarea matricilor de vizualizare din perspectiva fiecarei oglinzi (10p)
    • Desenarea ortogonala si colorarea geometriei din directia fiecarei oglinzi (15p)
    • Salvarea imaginilor rezultate intr-un framebuffer nou creat (5p)
    • Aplicarea texturilor din framebuffer pe oglinzi (10p)

Bonusuri posibile

  • Aplicarea unei texturi pe suprafața particulelor.
  • Implementarea testului de adâncime manual în 2 pași. Prima dată se desenează doar informația de adâncime în 6 texturi de culoare diferite și apoi se desenează culoarea propriu-zisă a geometriei. La al doilea pas de desenare se folosesc texturile obținute anterior pentru a testa dacă fragmentele generate și procesate în fragment shader trebuie să fie desenate în textura de culoare.
  • Efecte de post-procesare pe texturile obținute în urma desenării fețelor oglinzii, exemple: Depth of Field (DoF), Bloom, Screen Space Ambient Occlusion (SSAO).

Indicații suplimentare

Tema va fi implementată în OpenGL și C++. Este indicat să folosiți framework-ul și Visual Studio.

Pentru implementarea temei, in folderul src/lab_m2 puteti crea un nou folder, de exemplu Tema1, cu fisierele Tema1.cpp si Tema1.h (pentru implementare POO, este indicat sa aveti si alte fisiere). Pentru a vedea fisierele nou create in Visual Studio in Solution Explorer, apasati click dreapta pe filtrul lab_m2 si selectati Add→New Filter. Dupa ce creati un nou filtru, de exemplu Tema1, dati click dreapta si selectati Add→Existing Item. Astfel adaugati toate fisierele din folderul nou creat. In fisierul lab_list.h trebuie adaugata si calea catre header-ul temei. De exemplu: #include “lab_m2/Tema1/Tema1.h”

Arhivarea proiectului

  • In mod normal arhiva trebuie sa contina toate resursele necesare compilarii si rularii
  • inainte de a face arhiva asigurati-va ca ati curatat proiectul Visual Studio:
    • click dreapta pe proiect in Solution ExplorerClean Solution
    • si stergeti folderul /build/.vs (daca nu il vedeti, este posibil sa fie ascuns)
  • SAU stergeti complet folderul /build
  • in cazul in care arhiva tot depaseste limita de 50MB (nu ar trebui), puteti sa stergeti si folderul /deps sau /assets intrucat se pot adauga la testare. Nu este recomandat sa faceti acest lucru intrucat ingreuneaza mult testarea in cazul in care versiunea curenta a librariilor/resurselor difera de versiunea utilizata la momentul scrierii temei.

spg/teme/2022/01.txt · Last modified: 2022/12/13 15:25 by andrei.lambru
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