Î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:
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 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.
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.
Sistemul de particule va trebui sa aiba un control minim de la tastatura care sa vizeze:
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.
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”