This is an old revision of the document!
$$ t = \frac{y}{TREE\_HEIGHT}\\ scale = 1 - t\\ x_{final} = x_{original} \cdot scale\\ z_{final} = z_{original} \cdot scale $$
$$ t = \frac{y}{TREE\_HEIGHT}\\ wave = \sin(Time \cdot BendFrequency + t \cdot 0.5 + BendPhase)\\ offset = wave \cdot BendStrength \cdot t\\ x_{new} = x_{original} + offset $$
Amplitudine:
$$ Trunchi: offset = wave \cdot A_{trunchi} \cdot t = wave \cdot 0.0 \cdot t = 0 \\ Frunze\_Jos: offset = wave \cdot A_{mic} \cdot t\\ Frunze\_Mijloc: offset = wave \cdot A_{mediu} \cdot t\\ Frunze\_Varf: offset = wave \cdot A_{mare} \cdot t $$
wrapping_mode-ului texturii cu GL_REPEAT.
De asemenea, vă recomandăm utilizarea unei texturi de tip “seamless” pentru acest task.
\[ x = C_x + R \cdot \cos(\omega t + \phi) \\ z = C_z + R \cdot \sin(\omega t + \phi) \\ y = C_y + h_0 + A \cdot \sin(\omega_v t + \phi_v) \]
\((C_x, C_y, C_z)\)\(R\)\(A\)
\[ d = \|\vec{P} - \vec{C}\| \]
\([0, 1]\)
\[ f_{\text{fog}} = \text{clamp}\left(\frac{d}{d_{\text{max}}}, 0, 1\right) \]
mix
\[ \vec{C}_{\text{final}} = \text{mix}(\vec{C}_{\text{obiect}}, \vec{C}_{\text{fog}}, f_{\text{fog}}) \]
\(\vec{C}_{\text{obiect}}\)după iluminare și texturare\(\vec{C}_{\text{fog}}\)
punctiformăspotlight
==== Lumini Spotlight ====
Spotlight-urile emit lumină într-un con limitat, definit prin poziție, direcție și unghi de cutoff (\(\alpha\)). Un fragment este iluminat doar dacă se află în interiorul conului, iar intensitatea luminii scade gradual către margini. Implementarea luminii de tip spotlight se bazează pe cea pe care ați realizat-o în Laboratorul 08.
==== Light Cookies (Gobo Lights) ====
Light cookies sunt texturi proiectate prin conul de lumină al unui spotlight pentru a crea pattern-uri de umbră și lumină.
În iluminatul fizic (teatru, cinematografie) există două concepte înrudite:
În grafica pe calculator, cei doi termeni sunt folosiți interschimbabil – ambii se referă la aplicarea unei texturi (textură alpha sau RGB) asupra unei lumini pentru a modula intensitatea și/sau culoarea acesteia.
Mai jos puteți observa câteva example de light cookies din diverse aplicații grafice.
==== Proiecția unei texturi de tip light cookie folosind o lumină spotlight ====
Pentru un spotlight, putem proiecta o textură (light cookie) pe fragmentele iluminate, similar unei proiecții tip perspectivă. În această secțiune sunt prezentați pașii matematici necesari pentru a determina coordonatele de textură corespunzătoare fiecărui fragment.
În figura următoare puteți observa o diagramă ce prezintă notațiile necesare pentru a calcula proiecția texturii de tip light cookie. Reveniți la diagramă când este necesar pentru a face corespondența cu derivarea matematică prezentată în subsecțiunile ce urmează.
cut_off, spot_light, spot_light_limit, light_att_factor pentru a obține contribuția difuză și speculară a luminii - contribuția de bază)
Considerăm:
Definim vectorul dintre sursa de lumină și punctul iluminat:
\[ \vec{v} = \vec{X} - \vec{L} \]
=== Sistemul de coordonate al spotlight-ului ===
Pentru a putea exprima punctele în raport cu direcția spotului, definim un sistem local de coordonate al spotlight-ului, format din trei vectori ortogonali (forward, right, up), care definesc un sistem de coordonate ortonormat \((\hat{x}, \hat{y}, \hat{z})\).
Direcția spotlight-ului este dată de vectorul \(\vec{d}_{light}\) (corespunzător variabilei light_direction din shader-ul laboratorului 8). Acest vector este considerat deja normalizat și definește axa \(\hat{z}\) (forward) a sistemului local de coordonate al spotlight-ului.
Pentru a construi o bază ortonormată completă, avem nevoie de un vector arbitrar \(\vec{a}\) care să nu fie paralel cu \(\hat{z}\). Putem defini:
\[ \vec{a} = \begin{cases} (0, 1, 0), & \text{daca } | \hat{z} \cdot (0, 1, 0)| \neq 1 \\ (1, 0, 0), & \text{altfel} \end{cases} \]
Cu alte cuvinte, găsim \(\vec{a}\) astfel încât produsul scalar dintre acesta și \(\hat{z}\) să fie diferit de 1 (să nu fie paraleli).
Axa \(\hat{x}\) (right) a spotlight-ului se obține prin produs vectorial între vectorul de referință și axa \(\hat{z}\) (forward), urmat de normalizare:
\[ \hat{x} = \frac{\vec{a} \times \hat{z}}{\|\vec{a} \times \hat{z}\|} \]
Axa \(\hat{y}\) (up) este apoi determinată ca produs vectorial între două axe unitare ortogonale:
\[ \hat{y} = \hat{z} \times \hat{x} \]
Obținem astfel baza ortonormată \((\hat{x}, \hat{y}, \hat{z})\) ce reprezintă sistemul de coordonate al spotlight-ului.
=== Punct în spațiul spotlight-ului ===
Pentru a exprima poziția punctului \(\vec{X}\) de coordonate \((x, y, z)\) în sistemul local al spotlight-ului, proiectăm vectorul \(\vec{v}\) pe axele noului sistem de coordonate:
\[ x = \vec{v} \cdot \hat{x} \\ y = \vec{v} \cdot \hat{y} \\ z = \vec{v} \cdot \hat{z} \]
Coordonata \(z\) măsoară distanța punctului de-a lungul axei principale a spotului.
=== Proiecția pe planul de referință \(z = 1\) ===
Pentru proiecția texturii de tip light cookie, considerăm un plan de referință perpendicular pe axa \(\hat{z}\), situat la coordonata:
\[ z = 1 \]
Coordonatele punctului proiectat pe acest plan se obțin printr-o împărțire perspectivă:
\[ \vec{p} = \begin{pmatrix} \dfrac{x}{z} \\ \dfrac{y}{z} \end{pmatrix} \]
Punctul \(\vec{p}\) reprezintă intersecția razei de lumină cu planul de proiecție.
=== Normalizare în funcție de unghiul spotului ===
Fie \(\alpha\) unghiul de deschidere al spotului. La coordonata \(z = 1\), raza conului este:
\[ R = \tan(\alpha) \]
Pentru a normaliza coordonatele proiectate astfel încât interiorul spotului să corespundă domeniului \([-1, 1]\), împărțim coordonatele lui \(\vec{p}\) la această rază:
\[ \vec{n} = \dfrac{1}{\tan(\alpha)} \, \vec{p} = \begin{pmatrix} \dfrac{x}{z \tan(\alpha)} \\ \dfrac{y}{z \tan(\alpha)} \end{pmatrix} \]
=== Maparea către coordonate de textură ===
Coordonatele normalizate \(\vec{n}\) sunt în domeniul \([-1, 1]\). Texturile sunt adresate în domeniul \([0, 1]\), așadar facem o mapare liniară:
\[ \mathbf{t} = (u, v) = \dfrac{\vec{n}}{2} + \dfrac{1}{2} \]
unde \(\mathbf{t}\) reprezintă coordonatele de textură (UV) folosite pentru eșantionare.
=== Eșantionarea texturii light cookie ===
Coordonatele \(\mathbf{t} = (u, v)\) sunt folosite pentru a eșantiona textura light cookie, obținând culoarea în punctul respectiv:
\[ \vec{c} = (c_R, c_G, c_B) \]
Valoarea \(\vec{c}\) este utilizată pentru a modula contribuția luminii spotului asupra fragmentului, pe fiecare canal RGB separat. Mai concret, această eșantionare se realizeză în GLSL folosind funcția texture2D:
c = texture2D(cookieTexture, vec2(u, v)).rgb
===== Barem [150p] =====
===== Exemple de Funcționalități Bonus =====
===== Întrebări și răspunsuri =====
Pentru întrebări vom folosi forumurile de pe Moodle. Orice nu este menționat în temă este la latitudinea fiecărui student!
===== Notare =====
Baremul este orientativ. Fiecare asistent are o anumită libertate în evaluarea temelor (de exemplu, să dea punctaj parțial pentru implementarea incompletă a unei funcționalități sau să scadă pentru hard coding). Același lucru este valabil atât pentru funcționalitățile obligatorii, cât și pentru bonusuri.
===== Indicații suplimentare =====
Tema va fi implementată în OpenGL și C++. Este indicat să folosiți framework-ul și Visual Studio.
===== Arhivarea Proiectului =====
</hidden>