Table of Contents

Rastrový zobrazovací řetězec, jeho fixní a programovatelné bloky, programování pomocí shaderů. Typické transformace a jejich reprezentace. Osvětlovací model. Základní parametrické křivky.

B0B39PGR Webové stránky předmětu

1. Rastrový zobrazovací řetězec

1. Popis rastrového zobrazovacího řetězce

Rastrový zobrazovací řetězec (pipeline) je sekvence operací, která převádí 3D scénu na 2D obraz. Obsahuje programovatelné (*) i fixní bloky.

Pipeline kroky:

Poznámka: Fragment je soubor hodnot vytvořený rasterizací, který reprezentuje vzorek z oblasti jednoho pixelu vykreslovaného primitiva. Obsahuje například interpolovanou barvu, hloubku nebo pozici v okně.

2. Perspektivně správná interpolace

Při rasterizaci musí být atributy (barvy, normály, texturovací souřadnice) interpolovány tak, aby respektovaly perspektivní zkreslení. Lineární interpolace v obrazovém prostoru by vedla ke zkreslení.

Postup: 1. Atributy vertexu se vynásobí hodnotou \( W_c \), kde: \[ W_c = -z_{\text{eye}} \] 2. Následuje lineární interpolace mezi vrcholy: \[ A_{\text{interpolated}} = (1 - t) A_1 W_{c1} + t A_2 W_{c2} \] 3. Výsledek se vydělí interpolovanou hodnotou \( W_c \): \[ A = \frac{A_{\text{interpolated}}}{W_{c,\text{interpolated}}} \]

Tím je dosaženo perspektivně správné interpolace.

3. Vrstvy obrazové paměti

Různé vrstvy obrazové paměti slouží k uchovávání informací o scéně během vykreslování.

4. Testy fragmentů

Při vykreslování jsou fragmenty testovány, zda mají být zapsány do framebufferu.

5. Operace s fragmenty

Po úspěšném průchodu testy mohou být fragmenty upraveny před zápisem do framebufferu.

6. Textury

Textura je 2D obrázek nebo vzorek, který se aplikuje na povrch objektu pro zajištění detailu, barvy, lesku nebo průhlednosti.

Texturování

Filtering

Slouží ke zjemnění nebo zrychlení zobrazení textur při zvětšení nebo zmenšení.

Mip-Mapping

Optimalizační technika, kdy jsou předpočítané menší verze textury (pyramida textur různých rozlišení)

Opakování textur

Určuje, jak se textura chová mimo rozsah souřadnic [0, 1].

7. Sjednocení textury a světla

Při vykreslování se barva objektu určuje kombinací textury a světelného modelu:

\[ \text{Barva objektu} = \text{Textura} \times (\text{Ambient} + \text{Diffuse} + \text{Specular}) \]

Lze aplikovat více textur současně pomocí alpha blending (průhlednosti), což umožňuje například kombinovat základní texturu a detailní mapu.

8. Environment mapping

Technika pro simulaci odlesků okolního prostředí na povrchu objektu.

Cube mapping je dnes standard díky své univerzálnosti a podpoře dynamických odrazů v real-time grafice.

2. Programování pomocí shaderů

1. Shader a jeho význam

Shader je program běžící na GPU, který zpracovává grafická data během jednotlivých fází renderovací pipeline. Shadery umožňují velmi rychlé paralelní výpočty (SIMD).

GLSL (OpenGL Shading Language) je jazyk používaný k psaní shaderů.

Typy shaderů:

2. Základní datové typy v GLSL

3. Proměnné a jejich použití

4. Předávání dat z OpenGL do GLSL

Uniformy:

\[ \text{location} = \text{glGetUniformLocation(program, "name")} \]

\[ \text{glUniform*}(location, value) \]

V praxi to je např. glUniform1f, glUniform3fv

Atributy (Vertex Attributes):

\[ \text{location} = \text{glGetAttribLocation(program, "attributeName")} \]

\[ \text{glEnableVertexAttribArray(location)} \]

\[ \text{glVertexAttribPointer(location, size, type, normalized, stride, pointer)} \]

Poznámka: `stride` určuje vzdálenost mezi jednotlivými instancemi atributu, `pointer` určuje offset prvního prvku.

5. Proces aplikace shaderů

  1. Vytvoření a kompilace shaderů (vertex, fragment) pomocí GLSL zdrojového kódu.
  2. Připojení shaderů k programu (`glAttachShader`) pro vytvoření kompletního pipeline.
  3. Aktivace programu (`glUseProgram`) před vykreslováním geometrie.
  4. Naplnění bufferů daty (`VBO`, `EBO`) obsahujícími vrcholy a indexy objektů.
  5. Přiřazení dat shaderům (nastavení vertex atributů a uniformních proměnných).
  6. Vykreslení scény voláním (`glDrawArrays`, `glDrawElements`) podle dat v bufferech.
  7. Update scénických dat / animace pro dynamické změny v průběhu vykreslování.
  8. Vyčištění frame bufferu (`glClear`) pro přípravu na další snímek.

3. Typické transformace a jejich reprezentace

1. Transformace a reprezentace

Transformace v grafice upravují pozice vertexů v prostoru a jsou reprezentovány maticemi (4×4). Rozlišujeme:

2. Lineární a afinní transformace a jejich maticová reprezentace

Lineární transformace

\[ R_x(\theta) = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\theta & -\sin\theta & 0 \\ 0 & \sin\theta & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]

\[ R_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ -\sin\theta & 0 & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]

\[ R_z(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 & 0 \\ \sin\theta & \cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]

\[ S(s_x, s_y, s_z) = \begin{bmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]

Afinní transformace

\[ T(t_x, t_y, t_z) = \begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \]

\[ A = \begin{bmatrix} L & T \\ 0 & 1 \end{bmatrix} \]

Rigidita (Proper Rigidity)

3. Homogenní souřadnice

\[ (x, y, z) \to (xw, yw, zw, w) \]

4. Nastavení kamery (LookAt) a záběru (Viewport)

LookAt matice

Definuje pohled kamery na bod ve scéně, vstupy jsou:

\[ Z = \text{normalize}(E - C),\\ X = \text{normalize}(\text{up} \times Z),\\ Y = Z \times X \]

\[ E = \begin{bmatrix} X & Y & Z & e \end{bmatrix} \]

Viewport

\[ O_x = x \frac{w}{2} + \frac{w}{2}, \\ O_y = y \frac{h}{2} + \frac{h}{2} \]

5. Souřadné systémy a jejich transformace

\[ v_{obj} = \begin{bmatrix} x_0 \\ y_0 \\ z_0 \\ w_0 \end{bmatrix} \]

\[ v_{world} = M \cdot v_{obj} \]

\[ v_{view} = V \cdot v_{world} \]

\[ v_{clip} = P \cdot v_{view} \]

\[ v_{NDC} = \frac{v_{clip}}{w} \]

\[ v_{window} = V_p \cdot v_{NDC} \]

6. Projekční matice

\[ \begin{bmatrix} \frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2fn}{f-n} \\ 0 & 0 & -1 & 0 \end{bmatrix} \]

\[ \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2}{t-b} & 0 & 0 \\ 0 & 0 & -\frac{2}{f-n} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]

\[ \begin{bmatrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & fn \\ 0 & 0 & -1 & 0 \end{bmatrix} \]

\[ P_{perspective} = P_{orthographic} \cdot P_{perspective\_depth} \]

7. Gimbal Lock

8. Interpolace translace a rotace

Kvaterniony poskytují stabilní a efektivní způsob reprezentace a interpolace rotací v počítačové grafice. Oproti maticové reprezentaci nevedou k problémům jako je Gimbal Lock a umožňují plynulejší interpolaci.

Kvaterniony

\[ q = q_0 + \mathbf{q} = q_0 + q_1 i + q_2 j + q_3 k \]

\[ q^* = q_0 - \mathbf{q} \]

\[ q^{-1} = \frac{q^*}{|q|^2} \]

\[ pq = -\mathbf{p} \cdot \mathbf{q} + \mathbf{p} \times \mathbf{q} \]

\[ p q = p_0 q_0 - \mathbf{p} \cdot \mathbf{q} + p_0 \mathbf{q} + q_0 \mathbf{p} + \mathbf{p} \times \mathbf{q} \]

Kvaternion jako rotace

\[ q = \cos \frac{\alpha}{2} + \mathbf{u} \sin \frac{\alpha}{2} \]

Interpolace kvaternionů v animaci

Interpolace mezi dvěma kvaterniony se používá k plynulé změně rotace v čase.

\[ LERP(q_1, q_2, t) = (1 - t) q_1 + t q_2 \]

\[ nLERP(q_1, q_2, t) = \text{normalize}((1 - t) q_1 + t q_2) \]

\[ SLERP(q_1, q_2, t) = \frac{\sin((1 - t) \theta)}{\sin \theta} q_1 + \frac{\sin(t \theta)}{\sin \theta} q_2 \]

4. Osvětlovací model

1. Normálový vektor a jeho použití při výpočtu osvětlení

\[ \vec{n}_{normalized} = \frac{\vec{n}}{|\vec{n}|} \]

2. Výpočet normály trojúhelníka

\[ \vec{n} = \text{normalize}(\vec{CB} \times \vec{CA}) \]

3. Interpolace normály a proč se musí normalizovat

Bonus: Transformace normálových vektorů

Proč je nutné transformovat normály

\[ N = (M^{-1})^T \]

\[ M^{-1} = M^T \Rightarrow N = M_{3 \times 3} \]

Škálování a normály

\[ \vec{n'} = \frac{\vec{n}}{k} \]

Výpočet normál pro základní tvary

\[ \vec{n} = \text{normalize}(P - \text{origin}) \]

\[ \vec{n} = \text{normalize}(\text{crossProduct}(\text{edge}_1, \text{edge}_2)) \]

\[ \vec{N} = \text{normalize}(\sum_{i=0}^{pcount} \vec{N}_i) \]

4. Phongův osvětlovací model

\[ \text{color} = \text{emission} + \text{globalAmbient}_\text{reflected} + \sum \text{light}_i \]

\[ \text{light}_i = \text{spotlightEffect} \times \text{attenuationFactor} \times (\text{ambient}_\text{reflected} + \text{diffuse}_\text{reflected} + \text{specular}_\text{reflected}) \]

4.1 Ambientní složka

\[ \text{ambient}_\text{reflected} = \text{ambient}_\text{light} \cdot \text{ambient}_\text{material} \]

\[ \text{globalAmbient}_\text{reflected} = \text{globalAmbient}_\text{environment} \cdot \text{ambient}_\text{material} \]

4.2 Difuzní složka

\[ \text{diffuse}_\text{reflected} = \max(\cos\alpha, 0) \cdot \text{diffuse}_\text{light} \cdot \text{diffuse}_\text{material} \]

4.3 Spekulární složka

\[ \text{specular}_\text{reflected} = [\max(cos\,\beta,0)]^\text{shininess} \cdot \text{specular}_\text{light} \cdot \text{specular}_\text{material} \]

\[ \vec{r} = -\vec{l} + 2(\vec{l} \cdot \vec{n})\vec{n} \]

4.4 Emisivní složka

4.5 Skládání složek

\[ \text{color} = \text{emission} + \text{globalAmbient}_\text{reflected} + \sum \text{light}_i \]

Bonus: Illuminační modely

Vstupní parametry

5. Metamerismus

Bonus: Vnímání barev a spektrální odrazivost

\[ L_{\text{reflected}}(\lambda) = L_{\text{incoming}}(\lambda) \cdot \rho(\lambda) \]

6. Typy světelných zdrojů ve Phongově modelu

6.1 Směrové světlo (Directional Light)

\[ \text{light}_i = \text{ambient}_\text{reflected} + \text{diffuse}_\text{reflected} + \text{specular}_\text{reflected} \]

6.2 Bodové světlo (Point Light)

\[ \vec{l} = \text{normalize}(\text{pozice}_\text{světla} - \text{bod}) \]

\[ \text{attenuationFactor} = \frac{1.0}{k_C + k_L \cdot d + k_Q \cdot d^2} \]

\[ \text{light}_i = \text{attenuationFactor} \times (\text{ambient}_\text{reflected} + \text{diffuse}_\text{reflected} + \text{specular}_\text{reflected}) \]

6.3 Reflektor (Spotlight)

\[ \text{spotlightEffect} = (\vec{\text{spot}} \cdot \vec{l})^\text{SPOT\_EXPONENT} \]

\[ \text{light}_i = \text{spotlightEffect} \times \text{attenuationFactor} \times (\text{ambient}_\text{reflected} + \text{diffuse}_\text{reflected} + \text{specular}_\text{reflected}) \]

Bonus: Materiály

Způsoby zadávání materiálů v shaderech

7. Metody stínování

5. Základní parametrické křivky

1. Parametrická reprezentace křivek

Křivky můžeme popsat třemi hlavními způsoby:

\[ x = x(t),\ y = y(t),\ z = z(t) \] Výhody:

2. Spojitost křivek

Křivky používané v počítačové grafice bývají složené z více segmentů – dílčích úseků, které dohromady tvoří celou křivku \( Q(t) \). Každý segment (např. \( Q_0(t), Q_1(t), \ldots \)) je typicky popsán polynomiálně a má zajištěnou plynulost uvnitř sebe.

Aby však celá složená křivka působila plynule, je potřeba řešit spojitost v místech napojení segmentů – tzv. uzlech (join points, knot points). Uzel je bod, kde končí jeden segment a začíná další, např. \( Q_0(1) = Q_1(0) \).

V praxi vyžadujeme, aby jednotlivé segmenty na sebe navazovaly nejen v poloze, ale i ve směru nebo rychlosti – podle toho rozlišujeme různé typy spojitosti:

Parametrická spojitost (C)

Zohledňuje směr i velikost derivací (rychlost, zrychlení). Pokud je parametrická spojitost splněna, je zaručena i geometrická spojitost.

Geometrická spojitost (G)

Zohledňuje pouze směr derivací bez ohledu na velikost. Poskytuje vizuálně hladké přechody, ale bez zajištění konzistentní rychlosti.

3. Interpolační křivky

Interpolační křivky vždy procházejí všemi zadanými kontrolními body. Jsou vhodné například pro animace trajektorií, protože přesně sledují zadané pozice. Změna polohy jednoho bodu ovlivní i sousední segmenty.

Fergusonova (Hermitova) křivka

Parametrická kubická křivka definovaná dvěma body a jejich tečnami (směry v daných bodech). Používá 4 bázové funkce, které kombinují pozice a tečny: \[ P(t) = h_1(t)P_0 + h_2(t)P_1 + h_3(t)T_0 + h_4(t)T_1 \]

Catmull-Rom spline

Speciální typ kubické Hermitovy křivky, která automaticky generuje tečny z okolních bodů. Tečna ve středu mezi dvěma body se určuje jako: \[ T_i = \frac{P_{i+1} - P_{i-1}}{2} \]

4. Aproximační křivky

Aproximační křivky neprocházejí přímo kontrolními body, ale jejich poloha a váha určují tvar křivky. Používají se tam, kde je důležitá hladkost a flexibilita křivky. Výhodou je i lokální vliv změn – posun kontrolního bodu ovlivní jen část křivky.

Bézierova křivka

Křivka definovaná pomocí Bernsteinových polynomů: \[ B(t) = \sum_{i=0}^{n} b_i B_{i,n}(t) \] kde: \[ B_{i,n}(t) = \binom{n}{i} (1 - t)^{n - i} t^i \]

Bonus: Bernsteinovy polynomy

Bernsteinovy polynomy tvoří základní bázové funkce Bézierových křivek. Pro stupeň \( n \) a index \( i \) jsou definovány jako: \[ B_{i,n}(t) = \binom{n}{i} (1 - t)^{n - i} t^i \] kde \( t \in [0,1] \). Mají tyto vlastnosti:

\[ \sum_{i=0}^{n} B_{i,n}(t) = 1 \] Tím zajišťují stabilitu a plynulou interpolaci mezi kontrolními body.

Algoritmus de Casteljau

Stabilní numerická metoda pro výpočet bodu na Bézierově křivce:

\[ P_{i}^{r}(t) = (1 - t) P_{i}^{r-1} + t P_{i+1}^{r-1} \] kde \( P_{i}^{0} = P_i \) jsou původní kontrolní body.

Rozdíl: de Casteljau algoritmus přímo počítá body Bézierovy křivky a umožňuje její stabilní dělení.

B-Spline

Segmentovaná polynomiální křivka s možností řízení tvaru přes tzv. uzlový vektor:

Coonsova křivka

Speciální případ uniformního kubického B-Spline:

\[ P(t) = \sum_{i=0}^{3} B_i(t) P_i \] kde \( B_i(t) \) jsou uniformní kubické B-Spline funkce.

Rozdíl: Coonsova křivka je aproximační (křivka neprochází kontrolními body), zatímco de Casteljau je interpolační pro Bézierovy křivky.

Bonus: Výpočetní náročnost křivek

Při práci s křivkami v grafice je důležitá i efektivita výpočtu a vhodnost použití pro různé účely.

Obecně platí:

NURBS (Non-Uniform Rational B-Spline)

NURBS (neuniformní racionální B-Spline) jsou nejobecnější formou křivek používaných v počítačové grafice a modelování. Umožňují velmi přesně řídit tvar pomocí vážených kontrolních bodů a nepravidelného rozložení uzlů.

\[ P(t) = \frac{\sum N_{i,p}(t) w_i P_i}{\sum N_{i,p}(t) w_i} \]

Důležité vlastnosti a pojmy:

NURBS jsou dnes standardem v CAD systémech, 3D grafice a průmyslovém návrhu, protože spojují přesnost, flexibilitu a efektivní výpočet.