Animace, osvětlení a výpočet v reálném čase 3D prostoru

V rámci počítačové grafiky se využívá k vykreslení trojrozměrných reprezentací na display 3D modelování. Pohyb objektů ve scéně je docílen animací. Výpočet 3D prostoru v reálném čase je specifický okamžitou odezvou na uživatelské vstupy, nejtypičtějším příkladem a jeho nejčastějším využitím jsou počítačové hry.

3D rendering

Základním principem výpočtu v reálném čase (real-time rendering) je vykreslování statických snímků na základě 3D modelů, textur a osvětlení v rychlém sledu za sebou. Frekvence obměny obrazů se měří ve fps (frames per second - snímky za sekundu). Pro lidské oko se již při cca 25fps jeví výstup jako plynulá sekvence a jednotlivé snímky nezaznamená, na tomto principu je postaven film. Od zhruba 60fps výše již není člověk schopen rozpoznat rozdíly ve výstupu. Hlavní uplatnění této technologie je v počítačových hrách, dále pak v simulacích a návrhářských programech.[1]

Klasický výpočet (offline rendering) jednotlivé snímky (ať už v sekvenci nebo samostatné) vykreslí podle předem nastavených parametrů a s výsledkem uživatel již nemůže interagovat. Tento druh renderingu používá k vykreslování složitější postupy (např. raytracing) díky kterým má realističtější výstupy, využívá se např. pro tvorbu animovaných filmů a digitálních efektů pro filmy klasické. Více v článku Základy reprezentace trojrozměrného prostoru v počítači.

Při zpracování snímků na základě uživatelských vstupů (např. myš, klávesnice) je pro dojem interaktivity důležitý také reakční čas, tedy za jakou dobu se uživatelský vstup projeví v renderovaném obrazu. Hlavní výhodou výpočtu 3D scén v reálném čase je interaktivita a nevýhodou kompromis v realističnosti výsledných snímků kvůli potřebě jejich rychlé obměny.

Ukázka real time 3D renderu kapalin a částic (2009)

OpenGL a DirectX

Pro vykreslování 3D scény v reálném čase je potřeba velké množství složitých výpočtů. K usnadnění komunikace s hardware vznikly rozhraní pro programování aplikací (API) pro vykreslování 3D grafiky. OpenGL a DirectX jsou dva nejrozšířenější průmyslové standardy. OpenGL je vyvíjena neziskovou organizací Khronos a je multiplatformní. To znamená, že jí lze využít na operačních systémech Windows, Linux a Mac. Existuje i zjednodušená verze OpenGL ES, která je určena pro iOS, Android a PS3[2]. DirectX je vyvíjen společností Microsoft, díky finančnímu zázemí tak obsahuje pokročilejší vykreslovací postupy a efekty než OpenGL.

Hardwarová akcelerace

Hardwarová akcelerace je postavena na myšlence zakódování konkrétního algoritmu přímo do hardware, takže výpočet proběhne zásadně rychleji, obecně se tento hardware nazýva grafická karta. Původně fixní funkce rozšířila společnost NVIDIA zavedením technologie GPU (graphic processing unit - grafická výpočetní jednotka). Prvním zařízením tohoto typu byla NVIDIA GeForce 256 z roku 1999.

První GPU

Základním rozdílem bylo přenesení některých výpočtů z CPU na dedikovanou výpočetní jednotku. Oproti původním grafickým kartám, které umožňovaly pouze fixní funkce, GPU je programovatelná a umožňuje vývojářům implementovat vlastní algoritmy pro grafické výpočty. Výkon GPU je dán množstvím výpočetních jader (Dnešní CPU mají 8 jader, kdežto GPU stovky). To se hodí především pro zpracování velkého množství paralelních úkolů. NVIDIA vytvořila technologii CUDA umožňující využití GPU pro různé druhy výpočtů (tzv. GPGPU - general purpose graphic processing unit - grafická výpočetní jednotka s univerzálním využitím)[3].

Fáze 3D renderu

[1][4][5]

Fáze real time 3D renderu

OpenGL a DirectX jsou softwarová vrstva tvořící aplikační logiku výpočtů v reálném čase, konkrétní hardware (grafické karty) pak tyto postupy vykonávají. Ve způsobu vykonávání výpočtů jsou u různých grafických karet rozdíly. Dále bude popsán tedy principiální proces výpočtu na úrovni softwarového API. Proces renderu vychází z konceptu pipeliningu (zřetězeného zpracování), jehož základní myšlenkou je rozdělení úkonu na několik dílčích částí, které jsou pak vykonávány nezávisle a najednou. Klasickým příkladem principu je pásová výroba např. v automobilkách. 3D render má tři základní fáze - aplikační, geometrickou a rasterizační.

Aplikační fáze

Zahrnuje načítání zdrojových dat (modely, textury), které je třeba z pevného disku načíst do operační paměti pro rychlejší přístup. Dále zpracovává uživatelské vstupy a jejich dopad na objekty ve scéně. Zároveň může obsahovat pokročilejší funkce, které simulují fyzikální jevy a detekují kolize objektů. Tato fáze a její nastavení je především v rukou programátorů konkrétních aplikací, zpracovává ji CPU. Výstupem jsou geometrická primitiva (linie, trojúhelníky), která jsou zpracovávána v další fázi.

Geometrická fáze

Hlavním úkolem této fáze je vypočítat zobrazení 3D objektů do 2D prostoru. Zpracovávána je na GPU a je rozdělena do několika fází.

Transformace modelu a záběru (Model and view transformations)

Nejprve jsou ve scéně rozmístěny jednotlivé modely a poté je manipulováno s výsledným záběrem. Stejný model může být ve scéně umístěn mnohokrát v různých lokacích, orientacích a velikostech. Narozdíl od tvorby záběru v reálném světě pomocí kamery, kdy je manipulováno s kamerou pro dosažení cíleného záběru, je kamera na fixní pozici a záběr se tvoří manipulací s celou scénou kolem statické kamery.

Stínování vertexů (Vertex shading)

V této fázi se na model aplikují materiály. Ty mají různé vlastnosti z hlediska barvy, reakce na světelné zdroje (průhlednost, odlesky). Operace rozhodující jaký efekt má světlo na daný materiál se jmenuje shading (stínování). V této fázi se kromě stínování mohou vykreslovat i jednoduché animace modelů. Vertex shadery jsou tedy programy určující proměnu jednotlivých bodů modelu v dané scéně.

Projekce (Projection)

V této fázi se vypočítává viditelná část scény "co kamera vidí". Principem je vytvoření geometrického tvaru, který definuje viditelnou část scény. Pro ilustraci si jej lze představit jako kužel světla ze svítilny. Dva základní principy zobrazení jsou paralelní a perspektivní. V paralelním zobrazení má tvar krychle, v perspektivním tvar tzv frustrum, což je pyramida s useknutou špičkou. Paralelní zobrazení nemá úběžný bod, souběžné linie zůstávají souběžnými. Perspektivní zobrazení simuluje náš způsob vidění, kdy vzdálenější objekty se jeví menší a souběžné linie se protínají v úběžném bodu na horizontu.


Oříznutí (Clipping)

Všechny objekty scény, které nejsou obsaženy v pohledu (geometrickém tvaru z předchozí fáze) jsou ze scény odstraněny. Je zbytečné je renderovat, protože se ve výsledném snímku neobjeví. Objekty, které jsou protnuty hranicemi pohledu, jsou oříznuty.

Mapování na obrazovku (Screen mapping)

V této fázi je výsledný 3D prostor přepočítáván z geometrických souřadnic na 2D prostor obrazovky s daným rozlišením. Každý bod v prostoru je namapován na pixel obrazovky.

Rasterizační fáze

Pro každý pixel je zjištěno co je na něm ze scény vidět a vypočítána jeho výsledná barva. Pro zjištění viditelných pixelů probíhá proces testování hloubky (Depth testing), z 3D dat známe umístění bodů v prostoru na ose z, zjistí se tedy pro daný pixel objekt nacházející se nejblíže ke kameře. Další z procesů v této fázi je texturování. Modely obsahují UV mapy, které určují přesné umístění textury na modelu. Při rasterizaci tak proces zná konkrétní bod modelu, který se má na pixel vykreslit a přes UV mapu zjistí jaká část textury se na něm nachází. Obdobně jako vertex shadery umožňují provádět naprogramované operace s body v 3D prostoru, pixel shadery umožňují programovatelné úpravy již s pixely v 2D prostoru. Mohou při to využívat i data z vertex shaderů (např. informace o osvětlení). Díky kombinaci těchto dvou přístupů lze docílit v reálném čase i pokročilejších osvětlovacích technik, např. ambientního osvětlení.

Odkazy

Reference

  1. 1,0 1,1 AKENINE-MÖLLER, Tomas, Eric HAINES a Naty HOFFMAN. Real-time rendering. 3rd ed. Wellesley, Mass.: A K Peters, c2008. ISBN 9781568814247.
  2. OpenGL. Opengl.org [online]. [cit. 2016-06-08]. Dostupné z: https://www.opengl.org/about/
  3. NVIDIA CUDA. NVIDIA [online]. [cit. 2016-06-08]. Dostupné z: http://www.nvidia.com/object/cuda_home_new.html
  4. SHIRLEY, Peter a Stephen Robert MARSCHNER. Fundamentals of computer graphics. 3rd ed. Natick, Mass.: A K Peters, c2009. ISBN 1568814690.
  5. BAO, Hujun. a Wei. HUA. Real-time graphics rendering engine. Hangzhou: Zhejiang Univ. Press, 2011. ISBN 3642183417.

Klíčová slova

Počítačová grafika, 3D modelování, Rendering