Animace chemických reakcí - DCGI - České vysoké učení technické
Transkript
České vysoké učení technické v Praze Fakulta elektrotechnická Katedra počítačové grafiky a interakce Diplomová práce Animace chemických reakcí Filip Hřebačka Vedoucí práce: Ing. Sloup Jaroslav Studijní program: Otevřená Informatika, strukturovaný, magisterský Obor: Počítačová grafika a interakce 11. května 2011 ii Poděkování Děkuji svému vedoucímu Ing. Jaroslavu Sloupovi za pomoc při tvorbě této diplomové práce. iii iv Prohlášení Prohlašuji, že jsem práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu paragrafu 60 Zákona L. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon). V Praze dne 11.5.2011 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v vi Abstract In this thesis we introduce methods for simulation and visualisation of the proces of chemical reactions. Main attention is paid to methods which can be effectively simulated on the graphics processor. Simulation of reactants (fluids and gas) movement is described by the Navier-Stokes equations for incompressible Newtonian fluid flow. Simulation and visualization is rendered on the graphics card. The result of the work is the application which enables simulation of smoke and chemical reactions, and real-time visualization for grid size up to 80^3. Implemented simulator operates in 3D and for examination of the effectiveness of the solution on the graphics procesor, we programmed a simplified 2D version for the CPU and GPU. Abstrakt Práce se zabývá analýzou a implementací metod, které umožňují simulovat a zobrazovat průběh chemických reakcí. Hlavní pozornost je věnována metodám, které lze efektivně zpracovávat na grafickém procesoru. Simulace pohybu reaktantů (kapalin a plynů) je popsána pomocí Navier-Stokesových rovnic pro proudění nestlačitelné Newtonské tekutiny. Simulace i vizualizace probíhá na grafické kartě. Výsledkem práce je aplikace umožňující simulaci kouře, simulaci chemických reakcí a jejich vizualizaci v reálném čase pro velikost mřížky až 80^3. Implementovaný simulátor pracuje ve 3D a pro posouzení efektivnosti řešení na grafickém procesoru byla naprogramována zjednodušená 2D verze simulátoru na CPU i GPU. vii viii Obsah 1. Úvod ................................................................................................................................................... 1 2. Přehled existujících řešení .................................................................................................................. 3 2.1 Simulace tekutin ........................................................................................................................... 3 2.1.1 Navier-Stokesovy rovnice pro nestlačitelné proudění ........................................................... 4 2.1.2 Řešení Navier-Stokesových rovnic ......................................................................................... 6 2.1.3 Okrajové podmínky ............................................................................................................... 9 2.1.4 Zvýšení detailů ..................................................................................................................... 10 2.2 Simulace chemických reakcí ....................................................................................................... 12 2.2.1 Animace reaktivních plynných tekutin přes kinetiku chemických reakcí ............................. 14 2.2.2 Animace chemicky reaktivních tekutin za pomoci hybridní metody ................................... 19 2.3 Vizualizace volumetrických dat .................................................................................................. 24 2.3.1 Ray-marching....................................................................................................................... 24 2.3.2 Hloubkové stínové mapy ..................................................................................................... 26 2.3.3 Světelné mapy ..................................................................................................................... 31 3. Návrh řešení ..................................................................................................................................... 33 3.1 Programovatelná GPU ................................................................................................................ 33 3.2 Odlišnosti oproti původní předloze ............................................................................................ 34 3.2.1 Simulace tekutin .................................................................................................................. 34 3.2.2 Simulace chemických reakcí ................................................................................................ 34 3.2.3 Vizualizace ........................................................................................................................... 34 3.3 Návrh řešení ............................................................................................................................... 35 3.4 Vlastnosti aplikace ...................................................................................................................... 36 4. Implementace .................................................................................................................................. 37 4.1 CUDA .......................................................................................................................................... 37 4.2 Implementace na CPU ................................................................................................................ 38 4.3 Implementace na GPU ................................................................................................................ 39 4.3.1 Simulace tekutin .................................................................................................................. 39 4.3.2 Simulace chemických reakcí ................................................................................................ 44 4.3.3 Vizualizace ........................................................................................................................... 46 4.4 Problémy při implementaci ........................................................................................................ 50 ix 5. Výsledky a testování .........................................................................................................................51 5.1 Reakce dvou plynů......................................................................................................................51 5.2 Scéna s kahanem ........................................................................................................................52 5.3 Scéna s komplexní geometrií ......................................................................................................53 5.4 2D simulace ................................................................................................................................55 5.5 Testování ....................................................................................................................................55 5.5.1 Porovnání rychlosti 2D CPU a GPU verze: ............................................................................55 5.5.2 Vliv počtu vláken: ................................................................................................................56 5.5.3 Vliv velikosti mřížky na výkon ..............................................................................................57 5.5.4 Vliv osvětlení na výkon ........................................................................................................57 6. Závěr .................................................................................................................................................59 7. Seznam použité literatury.................................................................................................................61 A Uživatelská příručka ..........................................................................................................................65 A.1 Spuštění pod Windows ...............................................................................................................65 A.2 Otevření projektu v Microsoft Visual Studio 2008 .....................................................................65 B Obsah přiloženého DVD ....................................................................................................................69 x Seznam obrázků Obrázek 1: Příklad jednoduché chemické reakce. .................................................................................. 1 Obrázek 2: Rozdělení prostoru na buňky. .............................................................................................. 4 Obrázek 3:Simulační smyčka. ................................................................................................................. 6 Obrázek 4: Advekce. ............................................................................................................................... 7 Obrázek 5: Součet hmotu zachovávajícího pole a gradientního pole. .................................................... 9 Obrázek 6: Okrajové podmínky pro hustotu.. ........................................................................................ 9 Obrázek 7: Okrajové podmínky pro tlak. .............................................................................................. 10 Obrázek 8: Omezován MacCormackovo Advekčního Schématu .......................................................... 11 Obrázek 9: Ukázka víření ...................................................................................................................... 12 Obrázek 10: Vysokofrekvenční šum ..................................................................................................... 12 Obrázek 11: Dva příklady jednoduché chemické reakce A + B → 2E. ................................................... 17 Obrázek 12: Vytvoření efektu exploze za použití jednoduché reakce .................................................. 17 Obrázek 13: Vytvoření efektu exploze za použití řetězové reakce. ...................................................... 18 Obrázek 14: Dva příklady katalýzy. ....................................................................................................... 19 Obrázek 15: Hybridní reprezentace reakčního mechanizmu ................................................................ 20 Obrázek 16: Materiálové a vířivé částice .............................................................................................. 20 Obrázek 17: Vliv poloměru mourových částic na renderování ............................................................. 21 Obrázek 18: Výsledky animací chemických reakcí metodou *2+ ........................................................... 23 Obrázek 19: Různé případy rozvrstveného vzorkování ........................................................................ 27 Obrázek 20: Funkce viditelnosti ........................................................................................................... 27 Obrázek 21: Konstrukce funkce Propustnosti ...................................................................................... 28 Obrázek 22: Použitý kompresní algoritmus .......................................................................................... 29 Obrázek 23: Mrak s a bez vlastních stínů. ............................................................................................ 30 Obrázek 24: Mrak s trubkami vrhajícími stíny. ..................................................................................... 31 Obrázek 25:Stínový prostor a rozptylová světelná mapa (převzato z [6]). ........................................... 32 Obrázek 26: Rozdíl ve výkonu mezi CPU a GPU .................................................................................... 33 Obrázek 27: GPU dává více tranzistorů na zpracování dat .................................................................. 34 Obrázek 28: Simulační smyčka ............................................................................................................. 35 Obrázek 29: Vzhled navrhovaného uživatelského rozhraní. ................................................................. 36 Obrázek 30: Rozdíl mezi Stamovou a McCormackovou advekcí........................................................... 41 Obrázek 31: Vliv parametru víření........................................................................................................ 43 Obrázek 32: Závislost rychlosti reakce na teplotě. ............................................................................... 44 Obrázek 33: Vliv parametrů reakce na průběh simulace. ..................................................................... 45 Obrázek 34: Vliv délky kroku na vizualizaci. ......................................................................................... 47 Obrázek 35: Rozdíl v maximální přípustné chybě při kompresi hloubkové stínové mapy. ................... 49 Obrázek 36: Scéna s různými druhy světla. .......................................................................................... 50 Obrázek 37: Průběh chemickou reakce . .......................................................................... 51 Obrázek 38: Průběh chemickou reakce . .......................................................................... 52 Obrázek 39: Reakce ( ) dvou plynů zahřívaných kahanem. .............................................. 52 Obrázek 40: Reakce s komplexní geometrií. Mřížka 64x80x64............................................................. 53 Obrázek 41: Reakce s komplexní geometrií. Mřížka 144x144x144....................................................... 54 Obrázek 42: Simulace 2D Stam............................................................................................................. 55 Obrázek 43: Zrychlení GPU oproti CPU ................................................................................................ 56 xi Obrázek 44: Vliv počtu vláken na mřížce na výkon ...............................................................................56 Obrázek 45: Vliv velikosti mřížky na výkon. ..........................................................................................57 Obrázek 46: Vliv velikosti mřížky na výkon. ..........................................................................................58 Obrázek 48: Popis uživatelského rozhraní 1 .........................................................................................65 Obrázek 49: Popis uživatelského rozhraní 2 .........................................................................................66 xii Seznam tabulek Tabulka 1: Nové kontrolní parametry popisující chemické reakce. ...................................................... 16 Tabulka 2: Srovnání metody *1+ a *2+ ................................................................................................... 23 Tabulka 3: Porovnání rychlosti 2D CPU a GPU verze. ........................................................................... 56 Tabulka 4: Vliv počtu vláken na mřížce na výkon ................................................................................. 56 Tabulka 5: Vliv velikosti mřížky na výkon. ............................................................................................ 57 Tabulka 6: Vliv velikosti mřížky na výkon. ............................................................................................ 58 Tabulka 7: parametry uživatelského rozhraní a jejich význam ............................................................. 67 xiii xiv 1. Úvod Chemické reakce jsou hojné v reálném světě a často obsahují důležité prvky pro různé vizuální efekty, které jsou běžně tvořeny ve filmovém a herním průmyslu. Katalýza, eroze, zvětrávání, oheň, plameny a exploze jsou pouze některé z příkladů chemických reakcí. Pokud mají být takové přírodní jevy animované, reaktivní plyny jsou jedním z nejsnazších způsobů, jak popsat celou řadu zajímavých chemických efektů. V CFD (computational fluid dynamics) byly reagující tekutiny obecně simulovány tím, že se rozšíří Navier-Stokesovy rovnice, aby zvládly příslušné reakční mechanismy *35]. Nicméně, tyto obecné simulační modely jsou často příliš komplikované, aby mohly být přímo používány pro tvorbu vizuálních efektů. Tato práce se zabývá popisem a implementací metody animace reaktivních plynných tekutin přes kinetiku chemických látek [1]. Nejprve potřebujeme chemické sloučeniny nějakým způsobem reprezentovat a pohybovat s nimi. Aby například horký plyn stoupal a studený klesal. Tomuto problému se říká simulace tekutin. K tomuto účelu se nejvíce hodí stabilní simulátor tekutin [4] od Jose Stama. Dále potřebujeme modelovat změnu sloučenin a prostředí vlivem chemických reakcí. Sloučeniny mohou vlivem chemických reakcí měnit svoje chemické složení, spojovat se, či rozdělovat, měnit teplotu, nebo se dokonce smršťovat nebo rozpínat. Posledním krokem je vizualizace, kde jsme zvolili ray-marching v kombinaci s hloubkovými stínovými mapami *5+, případně se světelnými mapami *6+. Na obrázku 1 můžeme vidět jednoduchý příklad chemické reakce dvou plynů. Obrázek 1: Příklad jednoduché chemické reakce A + B = 2C (převzato z [1]). V poslední době rychle roste výkon grafických karet. Při implementaci stejného problému na CPU a GPU se dá na grafické kartě dosáhnout velmi výrazného zrychlení a to až o dva řády. Proto se stále více využívají k složitým výpočtům. Řešením simulace tekutin na GPU se zabývalo již několik prací například [3]. Proto jsme se rozhodli na rozdíl od autorů [1] naimplementovat všechny výpočty na grafickém procesoru. Naším cílem bylo dosáhnout simulace chemických reakcí v reálném čase. 1 V další části práce je proveden rozbor existujících řešení. Důraz je kladen na metody, které jsme se rozhodli implementovat. Ve třetí části naleznete analýzu řešení následovanou implementací. V páté části se seznámíme s výsledky naší implementace. 2 2. Přehled existujících řešení Problém simulace chemických reakcí lze rozdělit do tří částí. První částí je simulace tekutin. S tímto problémem se setkáváme každý den. Ať už je to nalévání vody do skleničky nebo oheň a kouř v krbu. Další částí jsou chemické reakce. Chemická reakce je proces vedoucí za vhodných podmínek ke změně chemické struktury chemických látek. Látky, které do reakce vstupují nazýváme reaktanty, látky z reakce vystupující jsou produkty. Pokud máme matematický model těchto procesů, tak je můžeme simulovat. Abychom viděli, jak simulace probíhá, tak musíme výsledek vhodně zobrazit. V této kapitole popíšeme metody simulace chemických reakcí a postupy, které jsou potřebné k tomu, abychom mohli tyto metody použít a zobrazit jejich výsledky. Nejprve si popíšeme metodu, díky které můžeme simulovat pohyb kapalin a plynů, poté dvě metody simulace chemických reakcí a nakonec si ukážeme, jak výsledek zobrazit. 2.1 Simulace tekutin Tekutiny nás obklopují, od vzduchu, který dýcháme po oceány pokrývající dvě třetiny Země a jsou základem pro některé z nejkrásnějších a nejzajímavějších úkazů co známe. Od vody tříštící se o zem po oheň a kouř vířící ve vzduchu se tekutiny staly důležitou součástí počítačové grafiky. Jsou známy dvě nejdůležitější reprezentace tekutin (nebo jiného kontinua jako deformovatelné pevné látky) a to Lagrangovská a Eulerovská [12]. Lagrangovský přístup, pojmenovaný po francouzském matematikovi Lagrangovi označuje kontinuum jako částicový systém. Každý bod v tekutině, nebo pevné látce je označen jako samostatná částice, s pozicí x a rychlostí u. Dalo by se to představit, jako že každá částice je jedna molekula tekutiny. Pevné látky jsou skoro vždy simulovány touto metodou, kdy je diskrétní množina částic spojena do meshe. Eulerovský přístup, pojmenovaný po švýcarském matematikovi Eulerovi, je obvykle používaný pro tekutiny. Místo sledování každé částice se díváme na pevné body v prostoru a sledujeme jak se množství substancí v tekutině (např. hustota, rychlost, teplota, atd.), mění v těchto bodech v čase. Numericky Lagrangovský přístup odpovídá částicovému systému a Eulerovský odpovídá použití fixní mřížky, která se v prostoru nemění, ani když skrze ní proudí tekutina. Mezi Lagrangovské metody patří například vířivé metody (vortex methods) popsané v [11, 13, 14], nebo SPH (smoothed particle hydrodynamics) popsaná v [15, 16]. V této práci se budeme dále věnovat Eulerovskému přístupu, protože při jeho využití se je jednodušeji 3 pracuje s prostorovými derivacemi jako je gradient tlaku a viskozita v Eulerovském přístupu. Také je mnohem jednodušší numericky aproximovat tyto derivace na fixní Eulerovské mřížce, než na mraku svévolně se pohybujících částic. Což je podstatné pro efektivní implementaci na GPU. Abychom mohli simulovat chování tekutin, tak musíme mít matematickou reprezentaci stavu tekutiny v kterémkoliv daném čase. Nejdůležitější částí je reprezentace rychlosti tekutiny, protože rychlost určuje, jak tekutina pohybuje sama sebou a věcmi v ní obsaženými. Rychlost tekutiny se mění v čase a prostoru a proto jí reprezentujeme jako vektorové pole. Klíčem k simulaci tekutin je rozdělení času na kroky a prostoru na buňky. Prostor můžeme chápat jako třírozměrné pole krychlových elementů (buněk), jak můžeme vidět na obrázku 2. V každém časovém kroku musíme správně určit nové rychlostní pole diskretizovaného prostoru. To můžeme udělat vyřešením rovnic, které popisují změnu rychlostního pole v čase za přítomnosti různých externích sil. Jakmile máme toto pole, tak ho lze použít například k pohybu hustoty prvků a dalších elementů obsažených v tekutině. Obrázek 2: Rozdělení prostoru na buňky (převzato z [7]). 2.1.1 Navier-Stokesovy rovnice pro nestlačitelné proudění Ve fyzice je běžné používat zjednodušenou formu komplexního problému. Dynamika tekutin není vyjímkou. Budeme uvažovat nestlačitelnou, homogení tekutinu. Tekutina je nestlačitelná, jestliže objem každé části tekutiny je konstantní v čase. Tekutina je homogenní, jestliže je její hustuta konstantní v prostoru. Dohromady to znamená, že je hustota konstantní v čase i prostoru. Tato zjednodušení nesnižují použitelnost simulace reálných tekutin, jako jsou voda nebo vzduch. 4 V naší práci simulujeme dynamiku tekutin na pravidelné kartézské mřížce s prostorovými souřadnicemi x = (x,y,z) a časovou konstantou t. Tekutina je popsána pomocí rychlostního pole u(x,t) a skalárního pole tlaků p(x,t). Jestliže tato pole známe pro úvodní čas t = 0, tak můžeme popsat stav tekutiny v čase pomocí Navier-Stokesových rovnic pro nestlačitelné proudění: (1) (2) kde: u t ϱ p v F Vektor rychlosti Čas Hustota Tlak Vizkozita Externí síly m/ s s kg /m3 hPa m2/ s N Advekce (přenos) Rychlost tekutiny způsobuje přenos objektů, hustot a dalších substancí spolu s tekutinou. Můžeme si představit, že obarvíme pohybující se tekutinu. Barva se pak bude po tekutině šířit. Tekutina pohybuje „sama sebou“, stejně jako pohybuje barvou. První člen rovnice 1 reprezentuje advekci rychlostního pole sama sebou. Říká se mu advekční člen. Tlak Když na tekutinu působí síla, tak se neprojeví okamžitě po celém objemu. Místo toho molekuly blízko zdroje síly působí na ty vzdálenější a tak vzniká tlak. Tlak v tekutině vede přirozeně k zrychlení. Druhým členem rovnice 1 je tlakový člen, který reprezentuje zrychlení tekutiny. Viskozita Ze zkušenosti víme, že některé tekutiny jsou hustější. Například olej teče pomalu, naproti tomu voda teče rychle. Tento vnitřní odpor k pohybu se nazývá viskozita. A proto třetí člen nazýváme viskozní člen. Pokud simulujeme něco velmi málo viskózního, například kouř, tak můžeme tento člen zanedbat. 5 Externí síly Poslední člen první rovnice zapouzdřuje zrychlení způsobené vnějšími silami působícími na tekutinu. Může to být například gravitace, vztlak, nebo vítr rozfoukávající vzduch. 2.1.2 Řešení Navier-Stokesových rovnic Navier-Stokesovy rovnice se dají analyticky vyřešit jen pro několik jednoduchých fyzikálních konfigurací. Nicméně je možno je řešit inkrementálně za pomoci numerických integračních technik. Protože chceme sledovat vývoj tekutiny v čase, tak tyto techniky vyhovují našim požadavkům. V naší práci vycházíme z metody „stable fluids“ (stabilní tekutiny) popsané Stamem v roce 1999 [4], protože je stabilní pro libovolný časový krok a dá se snadno paralelizovat. Obrázek 3: Na obrázku vidíme rozdělení simulace do několika částí pro každý časový úsek (převzato z [3]). Dle *4+ lze simulaci rozdělit na několik po sobě jdoucích kroků. Nejprve je potřeba si nainicializovat vstupní pole. Poté vždy v každém časovém kroku provedeme sled operací – advekce, působení vnějších sil a projekce tlaku (řešení viskózního členu vynecháme, protože je v našem případě zanedbatelný). Schéma můžeme vidět na obrázku 3. 6 Advekce Pro advekci můžeme použít explicitní nebo implicitní metodu. Při explicitní metodě posuneme částici (například hustotu kouře, nebo vektor rychlosti) dle rychlostního pole. Tato metoda je nestálá pro větší časové kroky a jen velmi těžko paralelizovatelná. Naopak Stamova implicitní metoda je stabilní a snadno paralelizovatelná. Tato metoda je založena na zpětném trasování částic tzv. backtrackingu. Pro každou buňku určuje obrácením vektoru rychlosti, co by do ní bylo uneseno. Protože se tato informace většinou nebere ze středu jiné buňky, tak se musí provést interpolace. Na obrázku 4 můžeme vidět advekci hustoty rychlostním polem. Obrázek 4a: Advekce pro časový úsek t. Hodnoty jsou interpolovány z nejbližších buňek (převzato z [3]). Obrázek 4b: Advekce pro časový úsek t+1. Nová hodnota je určena pomocí backtrackingu (převzato z [3]). 7 Působení vnějších sil Tato část je velmi jednoduchá. Pouze přičteme vnější síly do rychlostního pole, nebo hustotu, teplotu, nebo jiné sledované substance do patřičných polí. Gravitace ovlivňuje pouze y složku rychlostního pole. Sílu gravitace spočítáme jako násobek gravitační konstanty, hustoty, molární váhy plynu a velikosti časového kroku. Tuto hodnotu pak odečteme od y složky rychlostního pole. Horké plyny mají tendenci stoupat, kdežto studené plyny klesají. Tomuto efektu se říká vztlak a řídí se podle rovnice 3. Abychom mohli simulovat vztlak, tak musíme do naší simulace přidat teplotu. Teplotu můžeme aproximovat teplotním polem, které bude také unášeno rychlostním polem. Hodnoty konstant je možno nastavit tak, abychom dostali požadovaný efekt. Tuto sílu zohledníme do rychlostního pole tak, že výsledek přičteme k y složce. (3) kde: FVz P m g R To T z Vztlaková síla Tlak Molární hmotnost plynu Gravitační zrychlení Univerzální plynová konstanta Ambientní teplota Teplota Vektor (0,1,0) Projekce Z rovnice 2 nám vyplývá, že výsledné rychlostní pole nesmí být divergentní (musí být zachován princip nestlačitelnosti). Tuto divergenci lze eliminovat pomocí HelmholtzHodgeovy dekompozice, která říká, že každé rychlostní pole je součtem hmotu zachovávajícího pole a gradientního pole. Ukázku můžeme vidět na obrázku 5. Z obrázku je také vidět, že nedivergentní pole obsahuje spletité víry, kdežto gradientní pole buď teče z jednoho bodu, nebo do jednoho bodu, což je přesně to, čemu se chceme vyhnout. Počítání gradientního pole je podobné počítání výškového pole (obsahuje krátery a kopce). Po matematických úpravách dostaneme Poissonovu tlakovou rovnici, která se dá řešit například Jacobiho iterační metodou. Po spočítání gradientního pole nám stačí toto pole odečíst a tím dostaneme hledané nedivergentní pole. 8 Obrázek 5: Součet hmotu zachovávajícího pole a gradientního pole (převzato z [8]). 2.1.3 Okrajové podmínky V předchozí kapitole jsme se dozvěděli, jak řešit Navier-Stokesovy rovnice. Neukázali jsme si ale, co dělat na okrajích a u překážek. Na okrajích můžeme zvolit několik strategií. První možností je přenesení (wrap). Když chceme hodnotu mimo okraj, tak uděláme modulo. Kdyby například kouř vytékal z levého okraje, tak by se objevoval na pravém. Další možností je zrcadlení (mirror). V tomto případě při přetečení hodnoty bereme hodnotu uvnitř, která je stejně daleko od okraje, jako původní hodnota. Poslední možností je oříznutí (clamp). V tomto případě bereme při přetečení hodnotu na nejbližším okraji. U překážek musí platit několik následujících podmínek. Podmínka pro hustotu Žádná hustota nesmí být přidána, nebo přenesena do překážky. Ukázku můžete vidět na obrázku 6. Obrázek 6: Okrajové podmínky pro hustotu. V buňkách s překážkami je hustota 0 (převzato z [3]). Okrajové podmínky pro tlak Okrajové podmínky pro tlak se nazývají Neumannovy okrajové podmínky. Říkají, že rozdíl tlaku podél hranice musí být roven 0. 9 Obrázek 7: Okrajové podmínky pro tlak. Tlak v buňce 1 se musí rovnat tlaku v buňce 2 (převzato z [3]). 2.1.4 Zvýšení detailů Vzhledem k tomu, že simulace probíhá na diskrétní mřížce, tak dochází k numerickému vyhlazování. Tzn. ztrácí se drobné detaily. Dále jsme řekli, že hustota je uvnitř buňky konstantní, což také není v reálném světě pravda. Vzhledem k tomu, že chceme co nejpřesnější simulaci, tak se chceme těmto problémům vyhnout nebo je alespoň omezit. Aby nedocházelo k tak výraznému numerickému vyhlazování, tak můžeme použít přesnější advekční schéma. Dále je dobré vrátit do simulace víření, čímž dosáhneme velmi výrazného zvýšení detailů. Aby nebyla hustota v buňce konstantní, tak můžeme přidat šum, který nám náhodně změní rozložení hustoty uvnitř buněk. MacCormackovo advekční schéma Stamovo implicitní řešení je sice bezpodmínečně stabilní pro libovolný časový krok, ale na druhou stranu může nastat nechtěné numerické vyhlazení. Díku tomu může voda vypadat viskózně nebo kouř ztrácet detail. Abychom dosáhli vyšší přesnosti, tak použijeme MacCormackovo schéma [3], které se skládá ze dvou kroků. Máme-li danou velišinu f a advekční schéma A (například Stamovo) vyšší přesnosti dosáhneme následující sekvencí operací: (4) Kde fn je veličina, která má být přenesena. Fn^ a Fn+1^ jsou přechodné stavy. AR značí opačný průběh advekce (čas běží pozpátku). Toto schéma však není stabilní a musíme výslednou hodnotu ořezat v závislosti na minimální a maximální hodnotě sousedů, jak můžeme vidět na obrázku 8. 10 Obrázek 8: Omezování aplikované na MacCormackovo Advekční Schéma ve 2D (převzato z [3]). Víření Aby byla naše simulace vizuálně zajímavá, tak chceme vrátit některé malé detaily ztracené během simulace na hrubé mřížce. Kdybychom jen přidali turbulence s náhodným chováním, tak bychom riskovali, že bude kouř nebo jiná instance vypadat „živě“. Abychom zajistili vizuálně přijatelný a fyzikálně hodnověrný výsledek, tak chceme přidat víření jen tam, kde by vznikalo přirozeně [8, 10, 11]. Abychom toho dosáhli, tak nejprve spočítáme vír (curl) podle rovnice 5. Ten je dobrý pro měření množství cirkulace v daném bodě našeho rychlostního pole. Vektor víru je kolmý na rovinu rotace a dokážeme si ho představit jako malé lopatkové kolo, které se točí okolo vektoru víru proti směru hodinových ručiček. Délka vektoru víru je měřítko velikosti síly působící na lopatkové kolo. (5) (6) (7) Spočítáním normalizovaného gradientu │ω│ dostaneme vektorové pole, které roste od oblastí s malým vířením k oblastem s velkým vířením. Poté jsme schopni spočítat aktuální směr vířivé síly podle rovnice 7, kde ε > 0 je proměnná určená k řízení množství cirkulace přidané zpátky do rychlostního pole. Na obrázku 9 můžeme vidět rozdíl v simulaci s vířením a bez. 11 Obrázek 9: Vlevo kouř bez víření, vpravo s vířením pro stejné rozlišení mřížky. (převzato z [11]). Perlinův šum Perlinův šum [31, 32] je procedurální textura používaná tvůrci vizuálních efektů ke zvýšení realičnosti v počítačové grafice. Je to gradientní, pseudo-náhodný šum. Používá se především pro tvorbu plamenů ohně, kouře, vodní hladiny, tekoucí vody nebo mraků. Dá se použít i k tomu, aby byla hustota v buňce nepravidelně rozložená tím, že při vzorkování vynásobíme hodnotu vzorku hodnotou šumu. Obrázek 10: Vysokofrekvenční šum (převzato z [32]). 2.2 Simulace chemických reakcí Chemické reakce tvoří jedny z nejzajímavějších vizuálních efektů, jako jsou exploze, oheň a kouř. Bez těchto efektů si těžko umíme představit akční film, nebo počítačovou hru. Abychom mohli tyto reakce simulovat, tak musíme mít vhodný model chování chemických látek. 12 V počítačové grafice se mnoho výzkumníků snažilo vizualizovat speciální efekty reaktivních tekutin. Exploze patří mezi nejčastěji používaný jev v zábavním průmyslu. Mnoho studií bylo věnováno tomuto problému k vytvoření praktické techniky modelování realistických explozí založených na fyzikálních, či nefyzikálních principech modelu tekutin. Například *17, 18, 19, 20+. Oheň a plameny jsou dalším typem často používaných vizuálních efektů v animaci tekutin a byly modelovány v několika výzkumech jako [21, 22, 23, 24]. Mnoho prací se zaměřilo na jeden problém, ale málo se jich zajímá o komplexní simulaci chemických reakcí v počítačové animaci. Mezi ně patří například práce *25+, kde jsou přenos a reakční procesy vyjádřeny za pomoci množiny diferenciálních rovnic. Dále pak práce *1+ a *2+, které přidávají chemické reakce do simulátoru tekutin *4+. Tyto dvě práce si popíšeme podrobněji. Úvod do kinetiky chemických látek Kinetika chemických látek neboli reakční kinetika je odvětví kinetiky, které studuje rychlost a mechanismus chemických reakcí a popisuje nevyvážený stav systému tekutin obsahujících několik reaktivních prvků. Představte si jednoduchou chemickou reakci (8) kde A, B, E a F jsou chemické prvky a a, b, e a f jsou jejich stechiometrické koeficienty. Chemická reakce je popsána diferenciální rovnicí 9 pro změnu koncentrace reaktantů a produktů. (9) Rychlost reakce r je také zvána rychlostní zákon a je to časově závislá funkce r = fr(*A+,*B+,*C+,*D+) koncentrace prvků v čase t. Pro velkou skupinu chemických reakcí bylo experimentálně zjištěno, že je úměra mezi koncetrací každého reaktantu/produktu zvýšeného na některou úroveň. Například, kdyby probíhala jenom dopředná reakce, tak bychom mohli vyjádřit rychlost reakce jako r = k*A+α[B] β pro některé řády α a β. Kde, rychlostní konstanta k je funkcí teploty a tlaku. Ačkoliv je závislost na tlaku obvykle ignorována, tak konstanta silně závisí na teplotě, kde Arrheniusova rovnice (rovnice 10) vyhovuje dobře pro mnoho homogenních reakcí. Rychlost reakce je určena z měření z koncentrací reaktantů a produktů jako funkce času. Celková rychlost reakce je r = rf - rb , kde rf a rb jsou dopředná a zpáteční rychlost. (10) 13 Daná stechiometrická rovnice neurčuje nutně aktuální mechanismus, podle kterého rekce probíhá. Jednoduchá reakce může probíhat v jednom kroku. Na druhé straně je většina reakcí složena ze série elementárních kroků. Například pro rozklad N 2O5, který má celkovou stechiometrickou rovnici 2N2O5 → 4NO2 + O2 je známo, že se odehrává ve třech krocích: (11) Katalytické reakce jsou formou složených reakcí, které mohou zajímat animátory. Jsou tvořeny sekvencí kroků, ve kterých je spotřebován katalyzátor, reaktanty se přemění na produkty a katalyzátor je obnoven. Regenerace katalyzátoru umožňuje reakčnímu cyklu, aby byl opakován stále dokola. Takže malé množství katalyzátoru produkuje velké množství produktu. Většina hoření a explozí spadá do této kategorie, která je důležitou složkou tvorby animací. Podrobnější popis lze nalézt v učebnicích chemie zabývajících se kinetikou chemických reakcí jako [34]. 2.2.1 Animace reaktivních plynných tekutin přes kinetiku chemických reakcí Cílem autorů této práce *1+ bylo vytvořit jednoduchý framework, který by umožňoval animátorům snadno generovat efekty spadající do kategorie reaktivních tekutin. Jejich technika je založena na simulaci tekutin *4+, která dokáže generovat pohyb plynů, jako je kouř. Koncept kinetiky chemických látek je přidán do simulačního procesu, aby zvládnul reakci množiny plynů obsahující reálné, nebo hypotetické chemické sloučeniny, které vzájemně interagují. Autoři uvažují nestlačitelné plyny, což zaručuje relativně stabilní snadno spočitatelné numerické řešení. Jejich extenze je snadná na implementaci a dostatečně flexibilní, aby zvládla širokou škálu vizuálních efektů obsahujících chemické reakce. S rozšířením simulace tekutin přibyla množina fyzikálně založených parametrů pro řízení chemických reakcí. Simulační metoda Simulační metoda se skládá ze čtyř částí. Metodu si vysvětlíme na jednoduché reakci: aA + bB → eE + fF . První částí je spočítání rychlostního pole tekutiny. To se počítá stejně jako v sekci 2.1, až na rovnici 2, kterou v tomto případě nahradíme rovnicí 12, díky čemu již nebudeme mít nedivergentní pole. Parametrem Φ pak můžeme určit, zda nám tekutina poteče do, nebo z místa s nenulovou hodnotou parametru. Tím můžeme například simulovat výbuchy, které jsou následkem náhlého vypaření kapaliny. (12) 14 Dalším krokem je přenos hustoty a teploty rychlostním polem. Toto je opět shodné jako v kapitole 2.1 , až na to, že tekutina neobsahuje pouze jednu sloučeninu. Hustota plynu d se spočítá jako , kde m je množství a V je objem. Předpokládejme, že molární hmotnost čtyř plynů A, B, E a F je MA , MB, ME a MF . Když je zde nA , nB, nE a nF molů každé substance ve směsi plynů, tak platí následující rovnice: (13) To znamená, že hmotnost směsi plynů je suma jejich molárních koncentrací vážená jejich molární hmotností. Když pohybujeme substancemi ve směsi plynů, tak pohybujeme každou substancí zvlášť. Třetím krokem je aplikace kinetiky chemických reakcí. Poté co jsme posunuli tekutinu, tak přichází na řadu chemická reakce aA + bB → eE + fF. V této fázi je nejdůležitější správně určit rychlost reakce r = fr([A],[B],[E],[F]), abychom dosáhli požadovaného efektu. V realitě je rychlost reakce určena různými druhy měření a je naprosto správná jen pro ideální systémy. Teorie obvykle předpokládá, že je rychlost reakce stejná v celém uzavřeném systému, kde reakce probíhá. Tato podmínka je těžko splnitelná, když je kinetika chemických látek aplikovaná na animaci tekutin. Abychom mohli simulovat neuniformní reakce, tak diskretizujeme celý reakční systém, vytvoříme buňky zarovnané s výpočetní mřížkou, na které jsou simulovány tekutiny. Vektor molární koncentrace c = ([A],[B],[E],[F]) je definován ve středu každé buňky a předpokládá se, že rychlost reakce je v buňce konstantní. Jakmile je rychlost reakce definována animátorem, tak je nová molární koncentrace c odvozena ze staré integrováním následující diferenciální rovnice přes Δt: (14) Když je podmínka rychlosti reakce r jednoduchá, tak může být systém diferenciálních rovnic integrován analyticky. Když je komplikovaný, tak musí být použity numerické integrační techniky. Zjistili jsme, že je většinou modifikovaná Eulerova metoda druhého řádu dostatečná pro tento účel, ačkoliv můžou být použity metody vyšších řádů pro opravdu přesný systém. Posledním krokem je přidání externích sil a hodnoty Φ. Rychlost, hustota a teplota kapaliny na sebe vzájemně působí. Hustota a teplota jsou uneseny rychlostním polem. Na druhé straně aktualizovaná hustota a teplota působí na rychlost přes externí síly f a hodnotu Φ, která je funkcí tlaku. Mezi nejpodstatnější vnější síly patří gravitace, vztlak a víření, které jsou popsány v kapitole 2.1. Teplota je také ovlivněna chemickými reakcemi. V našem případě autoři zvolili uživatelsky definovanou teplotní funkci σT = fT(r,...). Navíc k vnějším 15 silám zvolili další cestu ke kontrole toku tekutiny přes hodnotu parametru Φ , který je nastaven další definovanou funkcí Φ = fΦ(r,...), nebo = fΦ(r,...) . Vhodným zvolením této funkce může animátor volně nastavit vzhled, se kterým plynné tekutiny expandují, nebo smršťují jako důsledek chemických reakcí. Výsledky animace Autoři implementovali jejich simulační techniku a aplikovali ji k vytvoření různých vizuálních efektů obsahujících reaktivní plyny. Aby byla tvorba efektů efektivní, tak je důležité, aby byl vyvinutý jednoduchý kontrolní mechanismus, který by dovoloval animátorovi snadno popsat požadované efekty. Autoři přidali k standardní simulaci tekutin *4+ další fyzikálně založené ovládací parametry, které jsou popsané v tabulce 1. Jakmile si animátor zvolí typ chemické reakce aA + bB → eE + fF, tak musí vhodně zvolit zbývající parametry, aby popsal reakci, kterou chce vytvořit. Každý parametr může být popsán jednoduchým matematickým výrazem, nebo procedurou. Definice těchto parametrů nemusí být nutně fyzikálně založená. Při experimentování dospěli autoři k závěru, že vhodně zvolené nefyzikálně založené parametry často vedou k velmi realisticky vypadajícím a zajímavým výsledkům. Tabulka 1: Nové kontrolní parametry popisující chemické reakce. Autoři otestovali svou metodu na několika příkladech, aby ukázali, jak může být efektivně využita pro tvorbu realistických animací reaktivních tekutin. První příklad je jednoduchá reakce dvou plynů A + B → 2E. Simulace probíhala na mřížce 60x60x60. Jak můžeme vidět na obrázku 11, tak dva reaktivní plyny A (bílý) a B (světle modrý) tvoří při smíchání třetí plyn E (růžový). Výsledek ukazuje, že i jednoduchá reakce může vypadat velmi přirozeně. Ve druhé řadě je výsledný plyn těžší a tak s jeho přibývajícím množství postupně převládne gravitace nad vztlakem a plyny začnou klesat. Jak lze vidět tak lehké plyny A a B nestoupají, což je způsobeno tím, že autoři použili jen jedno rychlostní 16 pole. Aby lehké plyny stoupaly, tak by bylo potřeba použít více rychlostních polí, což by ale mělo za následek zvýšení výpočetní a paměťové náročnosti. Obrázek 11: Dva příklady jednoduché chemické reakce A + B → 2E. První sekvence ukazuje animaci, ve které spolu reagují dva plyny a tvoří třetí. V druhém případě je vytvořený plyn těžší a tak se plyny pohybují dolů (převzato z [1]). Obrázek 12: Vytvoření efektu exploze za použití jednoduché reakce pro různé stechiometrické koeficienty. Reakce A + B → eE, pro e=2, 5, 7 odshora dolů (převzato z [1]). Další příklad je simulace exploze za použití jednoduché reakce. Simulace probíhala na mřížce 80x80x80. Dva vysoce reaktivní plyny spolu reagují. Modrý plyn A klesá do bazénku obsahující plyn B. Když tyto dva plyny přijdou do kontaktu, tak shoří a vznikne plyn E(červený). Energie uvolněná při hoření zvýší teplotu plynů, což má za následek tepelný 17 vztlak. Ačkoliv je většina jevů hoření známá jako katalytická řetězová reakce, která obvykle obsahuje volné radikály jako prostředníky, tak autoři v tomto případě použili elementární reakci aA+bB→eE, aby snížili výpočetní složitost. Ke zvýšení teploty byla použita lineární funkce, což značí, že teplota rostě úměrně s rychlostí reakce. Na obrázku 12 můžete vidět, jak rozdílné stechiometrické koeficienty ovlivnily animaci přes uživatelsky zadanou divergentní kontrolní funkcí Φ = fΦ([A], [B], [E], T) = y0([A] + [B] + [E])(T-Tamb). Kde y0 je konstanta a Tamb je normální teplota okolí. Další příklad je podobný jako ten minulý, ale místo jednoduché reakce je zde použita řetězová reakce. Autoři chtěli simulovat explozi vodíku a kyslíku(2H 2 + O2 → 2H2O), kterou nahradili hypotetickou reakcí A + B → 5E, která se odehrává v následující sekvenci kroků: (15) Kde I, J a K jsou katalytické radikály, které jsou velmi reaktivní. Simulace probíhala na mřížce 50x60x50 a výsledek můžeme vidět na obrázku 13. Obrázek 13: Vytvoření efektu exploze za použití řetězové reakce. Nahoře pro uniformně rozdělené prvky, uprostřed pro náhodně a dole byla reakce umístěna do krabice, ze které vyletí ohnivá koule (převzato z [1]). 18 Posledním příkladem, který si pro nás autoři připravili je katalytický efekt. Katalyzátor je chemická látka, která zvyšuje rychlost chemické reakce a na konci reakce je nezměněna. To znamená, že katalyzátor je substance, která zvyšuje rychlost reakce, ale nevyskytuje se v celkové chemické rovnici. Animace na obrázku 14 ukazuje takovouto reakci na mřížce 60x60x60, kde pevná koule slouží jako katalyzátor. Obrázek 14: Dva příklady katalýzy. Pohyblivá koule v uzavřené místnosti slouží jako katalyzátor. V prvním případě reakce neovlivňuje teplotu, v druhém ano (převzato z [1]). 2.2.2 Animace chemicky reaktivních tekutin za pomoci hybridní metody Práce *2+ je rozšířením práce *1+, která se ukázala jako velmi efektivní při generování různých chemických reakcí. Jejím problémem bylo to, že je celá simulace na mřížce. To znamená, že musela být přidána další mřížka pro každou chemickou sloučeninu v reakčním mechanismu k uchování její molární koncentrace. Toto často vedlo k ohromným nárokům na paměť pro komplikované reakce s mnoha různými sloučeninami, nebo s mřížkou s velkým rozlišením pro detailní animace. Dále k vysoké paměťové náročnosti rostl čas k simulaci chemických reakcí kubicky s ohledem na rozlišení mřížky. Autoři představili efektivnější simulační metodu pro animaci chemicky reaktivních tekutin. K práci *1+ přidali Lagrangovský částicový systém k Eulerovskému mřížkovému simulátoru tekutin. Zlepšili výpočetní efektivitu pro spočítání chemických reakcí za použití jednoduché částicově založené výpočetní procedury. Bude ukázáno, že stačí střední množství částic k numerické simulaci procesu chemické reakce, bez toho, abychom museli alokovat sérii mřížek udržujících molární koncentrace všech chemických sloučenin. Hybridní metoda představená autory je jednoduchá na implementaci a je dostatečně flexibilní na to, aby umožnila animátorům vytvořit široké spektrum vizuálních efektů z chemické oblasti od katalýzy přes erozi po oheň a exploze. 19 Obrázek 15: Hybridní reprezentace reakčního mechanizmu S1 + S2 → 2S3 , kde zelené a žluté tečky značí částice prvků S1 a S2 . Výsledný produkt S3 je reprezentován volumetrickou hustotou, která je zobrazena (převzato z [2]). Mřížky a částice V této metodě jsou Eulerovské mřížky použity pro simulaci tekutiny, kdežto Lagrangovské částice jsou primárně určeny pro simulaci reakčního mechanismu. Obrázek 16: Nahoře materiálové a vířivé částice. Dole mourové částice (převzato z [2]). Materiálové, mourové a vířivé částice Během simulace autoři vytvářejí až tři různé druhy částic. Prvními jsou materiálové částice, které jsou povinné, modelují chemické sloučeniny účastnící se chemických reakcí. Každá z těchto částic reprezentuje jeden prvek a je spojena s popisem skládajícího se 20 z pozice (3), rychlosti (3), poloměru vlivu (1), indikátoru prvku (1), a molární koncentrace. Hodnoty v závorkách znamenají kolik hodnot je potřeba k popsání atributu. Když jsou nastaveny počáteční lokace a molární koncentrace všech chemických prvků animátorem, tak je množství materiálových částic pro každý prvek dáno úměrně s molární koncentrací, poté jsou náhodně umístěny v takto specifikovaných oblastech. Jakmile jsou přidány, tak reagují s ostatními reaktanty v systému. Aby se snížila výpočetní náročnost, tak jsou z množiny částic vyloučeny ty, jejichž molární koncentrace klesne pod určitou hranici. Druhým typem částic jsou mourové částice (soot particles), které jsou určeny pro zlepšení kvality renderování tím, že simulují pevné částice vzniklé při hoření. Tyto částice jsou tvořeny v každé buňce mřížky, kde teplota klesla pod určitou mez. Každé částici je nastavena krátká životnost, která se snižuje s přibývajícím časem. Po skončení životnosti jsou tyto částice smazány. Mourové částice jsou nehmotné a neovlivňují simulaci. Každá takováto částice má svojí pozici (3), zbývající životnost(1) a poloměr(1), který určuje vliv při renderování - viz obrázek 17. Tyto částice jsou volitelné a jsou ignorovány, když reakce nevytváří mour. Obrázek 17: Vliv poloměru mourových částic na renderování (převzato z [2]). Posledním typem částic jsou volitelné vířivé částice určené k přidání turbulentního vzhledu tekutin. Tyto částice vrací detaily ztracené při simulaci tekutin. V tomto případě jsou tvořeny v každé buňce úměrně s intenzitou chemické reakce. Tyto částice ovlivňují rychlostní pole přes koeficient víření. Každá takováto částice má svojí pozici (3), směr(3) a poloměr(1). Simulační metoda Simulace se skládá z pěti kroků. Prvním krokem je spočítání rychlostního pole. Druhým krokem je přenos hustoty a teploty tímto polem. První dva kroky jsou totožné jako v metodě 2.2.1. Třetím krokem je přenos částic. Prvně jsou přeneseny nehmotné mourové a vířivé částice přes rychlostní pole u. Poté jsou přeneseny materiálové částice, které se chovají jinak, protože mají svojí hmotnost mp i rychlost v. Prvně se přenesou svojí rychlostí, pak je jejich rychlost upravena za použití rovnice vPt+Δ = vPt + . Δt. kde fxp je fyzikální vlastnost, která se musí správně nastavit. Říká se jí řídící síla. Autoři v jejich implementaci použili kombinaci rychlosti tekutiny a externích sil k definování této síly. 21 Čtvrtým krokem je aplikování kinetiky chemických reakcí. Klíčem k efektivní simulaci je numerická diskretizace reakčního mechanismu. Narozdíl od metody *1+, která simulovala reakci v každé buňce, tato metoda využívá materiálové částice k aproximaci chemického procesu. Aby autoři simulovali chemický proces, tak procházejí materiálové částice v náhodném pořadí při integraci diferenciálních rovnic v částicovém prostoru. Když je navštívena částice P v xP , tak je částicový systém organizovaný v dynamickém kd-stromu prohledán k nalezení blízkých materiálových částic, které se nacházejí ve sférické oblasti okolo místa xP a poloměru rsp. Předpokládejme, že nP částic bylo nalezeno v okolí. Můžeme se na ně dívat jako na lokální aproximaci molární koncentrace okolo xP. Abychom mohli modelovat lokální chemickou reakci, tak nejprve spočítáme molární koncentraci všech reagujících prvků okolo xP. Autoři sečetli pro každý prvek všechny patřičné částice vážené normalizovaným Gaussovským jádrem, aby dosáhli správného příspěvku od každé částice. Jakmile máme hodnoty pro všechny prvky, tak integrováním diferenciálních rovnic dostaneme rychlost reakce v xP a také přírůstek, či úbytek jednotlivých prvků. Abychom promítli dopad chemické reakce na částice, tak pro všechny lokální materiálové částice upravíme jejich hodnotu molární koncentrace. Během tohoto procesu může být v okolí málo, nebo žádné částice daného typu. V tom případě náhodně vygenerujeme více částic, takže každá ponese střední množství materiálu, čímž zamezíme vzniku velmi těžkých částic. Materiálové částice dále ovlivňují teplotu podobně jako v *1+, s tím rozdílem, že v předchozí metodě se změna teploty počítala pro každou buňku, kdežto zde ovlivňuje teplotu každá částice, která se účastnila chemické reakce. Pokud máme některé prvky na Eulerovské mřížce, tak musíme hodnotu těchto prvků aktualizovat. Posledním krokem je vliv vnějších sil a parametru divergence. Tento krok je opět podobný jako v předchozí metodě, s tím rozdílem, že o víření se starají vířivé částice. Autoři naiplementovali tuto metodu a otestovali ji na několika příkladech. Ke tvorbě použili PC s Pentiem IV 3.2Ghz se 2 Gb RAM a výsledky testování shrnuli do tabulky 2, kde porovnávají efektivitu této metody a metody *1+. Obrázek 18 ukazuje několik animací vizualizovaných pomocí fotonových map. První scéna ukazuje táborák generovaný za pomoci jednoduché chemické reakce S1 + S2 → 2S3, kde palivo S1 a S2 bylo stále přidáváno přes Lagragovské částice a oheň S3 byl reprezentován Eulerovsky. Další dvě expozivní scény byly vygenerovány za použití řetězové reakce. 22 Obrázek 18: Výsledky animací chemických reakcí metodou *2+ (převzato z [2]). Tabulka 2: Srovnání metody *1+ a *2+ (převzato z [2]). 23 2.3 Vizualizace volumetrických dat Vizualizace volumetrických dat je poměrně obtížný problém, který se řeší převážně dvěma hlavními způsoby. Prvním z nich jsou volumetrické fotonové mapy, kde oproti běžným fotonovým mapám máme navíc prostředí, které ovlivňuje fotony. Tím může být kouř, oheň, ale například i vlasy. Tímto problémem se zabývá například práce *26+. Dalším řešením je metoda posílání paprsků. To se dá rozdělit do dvou oblastí. První je path tracing (například *27+), kde výpočet trvá stejně jako u fotonové mapy velmi dlouho, ale na druhou stranu dává velmi realistické výsledky. Pokud chceme rychlou metodu, tak musíme zvolit raymarching, který může běžet i v reálném čase. Pokud chceme mít v obrázku vyrenderovaném pomocí ray-marchingu stíny, tak musíme použít jednu z metod, které stíny přidávají. Metoda [28] nejprve zkomprimuje šíření světla včetně mnohonásobného lomu světla, což trvá desítky minut a poté můžeme zobrazit data v reálném čase z kteréhokoliv pohledu. Tato metoda je vhodná pouze pro statické scény. Některé další metody využívají stínové mapy. Tyto mapy se tvoří tak, že do zdroje světla umístíme další kameru (stínovou kameru), která sleduje scénu a ukládá do stínové mapy hodnotu a vzdálenost volumetrických dat. Pokud potřebujeme vizualizovat poloprůhledné objekty, tak mají stínové mapy více vrstev. Mezi takovéto metody patří například hloubkové stínové mapy [5, 6], hloubkové opacitní mapy [29], nebo Furiérovy opacitní mapy *30+. Následuje podrobný popis ray-marchingu a jejího rozšíření o stíny pomocí hloubkových stínových map a světelných map. 2.3.1 Ray-marching Ray-marching je metoda přímého volumetrického renderování dat do obrázku, která používá přímé dopředné vyhodnocení zobrazovacího integrálu (rovnice 16). (16) Pro každý pixel obrázku je vyslán jeden paprsek do scény. Nyní jsou brány vzorky na paprsku po stejně dlouhých intervalech. Pro každý vzorek jsou diskrétní volumetrická data převzorkována za pomoci trilineární interpolace (vezmou se vzorky z 8 nejbližších voxelů a ty jsou vyváženy podle vzdálenosti k místu, pro které hledáme hodnotu). Výsledek volumetrického zobrazovacího integrálu je poté aproximován alpha blendingem, buď v pořadí zepředu dozadu, nebo odzadu dopředu. Optickou hloubku τ, což je kumulativní absorpce až do pozice x(t) můžeme vyjádřit pomocí Reimannovy sumy. (17) Kde Δt udává vzdálenost mezi vzorky. Sumace může být v exponentu nahrazena násobením exponenciálních prvků: 24 (18) Nyní můžeme představit opacitu A, která je velmi dobře známá z alpha blendingu. Můžeme jí definovat jako (19) a přepsáním rovnice 18 dostaneme: (20) což umožňuje, aby byla opacita použita jako aproximace absorpce pro i-tý segment paprsku, místo absorpce v jednom bodě. Nyní můžeme určit aproximovaný tvar volumetrického zobrazovacího integrálu (21) kde C je výsledná barva, Ci je barva vzorku, A je opacita a n je počet vzorků. Rovnice 21 může být vyhodnocena iterativně za pomoci alpha blendingu buď v pořadí zepředu dozadu, nebo odzadu dopředu. Alpha blending Rovnice 21 může být vyhodnocena iterativně za pomoci alpha blendingu v pořadí zepředu dozadu po krocích i od 1 do n: (22) (23) Nové hodnoty Ci‘ a A i‘ jsou vypočítány z barvy Ci a opacity Ai v daném poloze i a složené barvy Ci‘-1 a opacity Ai‘-1 z předchozí pozice i-1. Počáteční podmínky jsou C0‘ = 0 a A 0‘ = 0. Všechny blendovací rovnice používají barvy vážené opacitou(barva je přednásobena opacitou). Pro přístup odzadu dopředu postupujeme podle následující rovnice: (24) kde kroky i bereme od n-1 k 0. 25 Pro přístup odzadu dopředu nepotřebujeme sledovat složenou opacitu, ale zase v přístupu zepředu dozadu můžeme použít optimalizaci zvanou brzké ukončení paprsku, kde je postup podél paprsku ukončen, když složená opacita dosáhne 1.0, nebo nějaké blízké hodnoty. 2.3.2 Hloubkové stínové mapy Hloubková stínová mapa [5] je technika, která umožňuje generovat stíny rychle a s vysokou kvalitou pro vlasy, srst a objemová primitiva (například mraky, kouř). Běžná stínová mapa ukládá pro každý pixel (bod) jednu hloubku, kdežto hloubková stínová mapa ukládá zlomkovou viditelnost (fractional visibility) pro daný bod a všechny možné hloubky. Renderování vlasů, srsti a kouře je složité, protože přesné vlastní stínování je velmi důležité pro jejich vzhled. Např. stín vržený částí vlasů na spodní vrstvy má velký vliv na celkové osvětlení a celkový vzhled renderingu. Klasické stínové mapy potřebují velmi vysoké rozlišení, aby zachytily toto vlastní stínování přesně. Je to evidentní při animaci, kde nedostatečné vzorkování má za následek obrazový šum. Navíc běžné stínové mapy nemohou dobře zacházet s volumetrickými efekty, jako s mraky a kouřem nebo je zpracovávají velmi neefektivně. Výhody hloubkové stínové mapy ve srovnání s běžnou stínovou mapou: Podporuje poloprůhledné povrchy a objemová primitiva, jako např. kouř. Při řešení vysoce kvalitních stínů je o řád menší než ekvivalentní hloubková mapa a umožňuje výrazně rychlejší přístup. Na rozdíl od hloubkových map podporuje mip-mapping, což umožňuje výrazně redukovat výpočet, pokud pracujeme s velkým rozsahem měřítek. Umožňuje také vysoce kvalitní stíny rozmazané pohybem (motion blur). Vzorkování ve stínové mapě Zatímco běžná stínová mapa je vhodná pro renderování stínů velkých objektů, nepracuje tak dobře pro jemnou geometrii jako jsou vlasy (viz obr. 19). Důvodem je, že rozvrstvené vzorkování nefunguje dobře, když je v dané oblasti mnoho nespojitostí. Museli bychom výrazně zvýšit počet vzorků, abychom redukovali obrazové šumy a problikávání. Na obr. 19a je zobrazená izolovaná silueta hrany protínající oblast filtru. Je použito N vzorků rozptýlených po mřížce o straně = √N. Např. pro dosažení chyby 1% je potřeba přibližně 140 vzorků v blízkosti izolované siluety, zatímco pro oblast pokrytou jemnou geometrií (vlasy) by bylo potřeba 2500 vzorků. 26 Obrázek 19: Různé případy rozvrstveného vzorkování (převzato z [5]). Definice Hloubková stínová mapa je pravoúhlá (obdélníková) matice bodů, kde každý bod (pixel) nese funkci viditelnosti, tato funkce popisuje paprsek světla, který začíná v počátku stínové kamery a prochází daným bodem. Funkční hodnota v dané vzdálenosti (hloubce) je zlomkem počáteční intenzity po průchodu do této hloubky. Počáteční hodnota je rovna 1 a snižuje se s hloubkou, podle toho jak je paprsek blokován, jestliže je zcela zablokován, hodnota se sníží na 0. Na obr.20 vidíme jaký má průběh fce viditelnosti pro různé případy: polotransparentní povrchy, několik neprůhledných objektů a kouř. Přesnější definice uvažuje paprsek, který začíná v počátku stínové kamery a prochází bodem (x,y) na rovině obrazu (image plane), určitá část světla emitovaného podél tohoto paprsku je pohlcena objektem nebo volumetrickým kouřem, zlomek světla, které pronikne do dané hloubky z je propustnost (transmitance) T(x,y,z) . Funkce viditelnosti je pro každý bod získána filtrováním sousedních propustností a převzorkováním na střed bodu. Obrázek 20: Funkce viditelnosti pro různé případy: polotransparentní povrchy, několik neprůhledných objektů a kouř (převzato z [5]). 27 Konstrukce funkce propustnosti Propustnost je zlomek světla, který pronikl do dané hloubky. Pro daný bod (x, y) určíme element povrchu nebo objemu protínající příslušný primární paprsek. Průsečík povrchu se nalezne použitím buď ray traceru nebo běžným renderem. Předpokládáme, že vlastnosti volumetrického objektu mohou být vyhodnoceny v každém požadovaném bodu. Funkce propustnosti v bodu (x, y) pak může být vyjádřena jako produkt propustnosti povrchu (τs) a propustnosti volumetrického objektu (τv), jak je popsáno dále. Propustnost povrchu je stanovena použitím všech průsečíků povrchu podél primárního paprsku v bodě (x, y). Každý průsečík má hodnotu hloubky z si a opacity Oi. Grafické znázornění konstrukce fce propustnosti je na obr. 21. Propustnost volumetrického objemu je určena vzorkováním hustoty atmosféry v pravidelných intervalech podél paprsku viz obr. 21b. A spočítá se jako: (25) protože funkce není po částech lineární, tak jí aproximujeme v každém bodě a poté lineárně interpolujeme: (26) nyní můžeme spojit propustnost povrchu a volumetrického objemu: (27) Obrázek 21: Konstrukce funkce Propustnosti. (a) Propustnost povrchu. (b,c) Propustnost volumetrického objemu. (d) Celková propustnost (převzato z [5]). Komprese Funkce viditelnosti může mít velké množství hodnot pro daný paprsek. Průběh jednotlivých hodnot má většinou spojitý charakter (smooth) a mohou se tedy dobře 28 komprimovat. Komprimované funkce jsou uloženy jako pole dvojic hodnot (hodnota z a zlomková viditelnost V). Je velmi důležité, že zkomprimovaná hodnota zachová důležité hodnoty z, jelikož i malá chyba v hodnotě z může vést k nečekaným chybám ve vlastním stínování. Metoda musí také fungovat v intervalu 0 až nekonečno. Tento fakt předurčuje metody komprese založené na fixním nebo hierarchickém souboru základních funkcí (např. wavelet). Ke kompresi zvolili autoři hladový algoritmus. Obrázek 22: Použitý kompresní algoritmus. (a) Lámavá lineární křivka s chybou. (b) Každý vstupní bod určuje maximální a minimální naklonění úsečky. (c) Pro další krok algoritmu. (d) Výstupní body po hladovém algoritmu (převzato z [5]). Máme-li viditelnostní funkci V a chybu tolerance ε (obr. 22a), tak algoritmus vrací novou viditelnostní funkci V’ takovou, že (28) a kde V’ má typicky mnohem méně kontrolních bodů (obr. 22d). Hlavní vlastností algoritmu je to, že je inkrementální. V každém kroku algoritmus nakreslí nejdelší možnou úsečku, která je v toleranci ε. Původ úsečky je fixní a potřebujeme jen zvolit směr a délku. Nechť je počátek nynější úsečky (z’i,V’i). V každém kroku upravíme možné minimální a maximální naklonění [mlo,mhi] úsečky. Každý nový kontrolní bod (zj,Vj) vstupní funkce V změní naklonění úsečky tak, aby v něm ležely oba body (zj,Vj+ε) jako na obrázku 22b a 22c. Pokud to již není možné, tak nastavíme naklonění na (m lo + mhi)/2 pro hodnotu z posledního navštíveného kontrolního bodu. Konečný bod úsečky se stane prvním bodem a celý proces je zopakován. Tento algoritmus je rychlý, jednoduše implementovatelný a používá konstantní množství paměti. Algoritmus uspokojivě splňuje kriterium dané chyby a generuje velmi dobrou aproximaci v praxi. 29 Lookups (vyhledávání) Podobně jako textury jsou hloubkové mapy načítány aplikací filtru rekonstrukce a převzorkování na čtvercové pole hodnot bodů. V našem případě jednotlivé hodnoty bodů jsou získány vyhodnocením funkce viditelnosti v konstantní hloubce z. Pro daný bod (x,y,z), v kterém má proběhnout vyhledávání (lookup) a dvojdimenzionální filtr kernel f, hodnota filtrovaného stínu je dána: (29) kde wi,j = f(i + 0.5 – x,j + 0.5 -y) je váha filtru pro pixel(i,j) a suma je přes všechny pixely uvnitř filtru. Vyčíslení každé funkce viditelnosti vyžaduje prohledání jejich referenčních bodů (data points), abychom určili, který úsek obsahuje danou hodnotu z. Toto může být provedeno prostřednictvím lineárního nebo binárního hledání v závislosti na množství referenčních bodů. Obrázek 23: Mrak s a bez vlastních stínů. Stíny vytvořeny hloubkovou stínovou mapou (převzato z [5]). K významným vlastnostem hloubkových stínových map patří jejich univerzálnost: podporují stínování běžných povrchů, volumetrických povrchů, hustých srstí a vlasů, a zvládnou dobře motion blur, efektů, které by normálně vyžadovaly různé jiné techniky. S hloubkovým stínováním může být kombinováno v jedné kompaktní datové struktuře a renderováno efektivně za použití širokého rozsahu pozorovacích a filtrovacích podmínek. 30 Obrázek 24: Mrak s trubkami vrhajícími stíny. Stíny vytvořeny hloubkovou stínovou mapou (převzato z [5]). 2.3.3 Světelné mapy V kombinaci se stínovým objemem, nebo hloubkovými stínovými mapami je možné přidat rozptyl světla pro bodová a směrová světla. Této metodě říkáme světelné mapy [6]. Stínový objem je přídavná voxelová množina dat, která obsahuje informaci o příchozím světle v každém voxelu. Může být spočítán řez po řezu podobně jako stínové mapy. Do stínového objemu můžeme přidat efekt rozptylu světla tím, že budeme brát vzorky z předchozího řezu několikrát pro každý voxel v pozicích náhodně rozptýlených okolo původního vzorku. Výskyt těchto vzorků je řízen za pomoci modelu fázové funkce, jako je například Henyey-Greenstein. Ukázka stínové objemu je na obrázku 25. Podobný přístup můžeme použít pro hloubkové stínové mapy místo stínového objemu. V tomto případě je hloubková stínová mapa převzorkována na uniformní mřížku s nižším rozlišením. Nízké rozlišení je pro světelnou mapu dostatečné, protože osvětlení způsobené mnohonásobným rozptylem je relativně málo pravidelné. Převzorkovaný objem je poté zpracován stejně jako stínový objem. 31 Obrázek 25:Stínový prostor a rozptylová světelná mapa (převzato z [6]). Ačkoliv jsou světelné mapy velmi efektivní, musíme si uvědomit několik skutečností: Světelné mapy se musí přepočítat kdykoliv je pozice, nebo směr světla změněn. Světelné mapy se musí přepočítat kdykoliv se změní přenosová funkce. Popsaným postupem vytváření světelných map vznikají spíše měkké stíny, než pravá rozptylová světelná mapa. V algoritmu popsaném výše dochází jen k dopřednému mnohonásobnému rozptylu. Pro pravý mnohonásobný rozptyl bychom museli udělat více průchodů z různých směrů k vytvoření světelné mapy. Ačkoliv to jde udělat poměrně snadno, tak by to výrazně zpomalilo tvorbu světelné mapy. 32 3. Návrh řešení V naší práci jsme se rozhodli implementovat metodu animace reaktivních plynných tekutin přes kinetiku chemických reakcí *1+. Tuto metodu jsme zvolili proto, že jde snadno implementovat na grafické kartě, oproti metodě [2], kde je potřeba dynamický KD-strom (velmi složitý na paralelní implementaci) a navíc při náhodném procházení materiálových částic jsou ovlivňovány i okolní částice, což je na GPU téměř neproveditelné. Pomocí zvolené metody lze modelovat celou škálu chemických reakcí. Abychom mohli tuto metodu použít, tak jsme museli naimplementovat simulátor tekutin, kde jsme zvolili Stamovu metodu stabilních tekutin *4+. Na vizualizaci jsme zvolili ray-marching spolu s hloubkovými stínovými mapami [5], nebo v kombinaci se světelnými mapami *6+. Pro urychlení výpočtů jsme se rozhodli vše počítat na grafickém procesoru. K tomuto účelu jsme použili technologii nVidia CUDA. Vstupem jsou údaje z grafického rozhraní a výstupem je přímá vizualizace. 3.1 Programovatelná GPU Pod tlakem uživatelů na zvyšování výkonu realtimové 3D grafiky ve vysokém rozlišení, programovatelné grafické jednotky (programmable Graphic Processor Unit) neboli GPU se vyvinuly ve vysoce paralelní, mnohovláknové procesory s mnoha jádry, ohromnou výpočetní silou a velkou paměťovou propustností, jak lze vidět na obrázku 26. Obrázek 26: Rozdíl ve výkonu mezi CPU a GPU vlevo počet floating point operací a v vpravo propustnost paměti (převzato z [33]). Důvodem rozdílu v počtu floating point operací za sekundu mezi CPU a GPU je, že GPU se specializuje na výpočetně náročné, vysoce paralelní výpočty, které jsou běžné v renderování a tak je více tranzistorů určeno ke zpracování dat raději než k ukládání dat do mezipamětí a kontrole toku, jak lze vidět na obrázku 27. 33 Obrázek 27: GPU dává více tranzistorů na zpracování dat (převzato z [33]). Na GPU se nejlépe hodí problémy, které mohou být vyjádřeny jako paralelní výpočty nad daty s velkou výpočetní náročností a malému počtu paměťových operací. Protože se stejný program spustí pro každou složku dat, tak jsou zde nižší nároky na řízení toku a protože je zde málo paměťových operací vzhledem k počtu výpočtů, tak se zpoždění při přístupu k datům ztratí při výpočtech místo ukládání do velkých mezipamětí. 3.2 Odlišnosti oproti původní předloze Hlavním rozdílem je to, že budeme všechny výpočty počítat na grafickém procesoru. To znamená, že všechny problémy musíme formulovat jako paralelní, bez závislosti na datech ze stejného kroku. 3.2.1 Simulace tekutin Simulací tekutin na GPU se zabývá práce *3+, z níž jsme vycházeli. Je zde popsáno jak efektivně implementovat jednotlivé kroky včetně MacCormackova advekčního schématu a překážek. Dále jsme se rozhodli přidat víření a Perlinův šum. Tato vylepšení výrazně zvyšují realičnost za přijatelnou výpočetní dobu. Předpokládáme, že tekutina je v kvádru s pevnými stěnami, což nám zjednoduší okrajové podmínky. 3.2.2 Simulace chemických reakcí Opět jsme všechny výpočty počítali na GPU. Další změnou oproti [1] je, že autoři naimplementovali několik různých funkcí pro změnu teploty, divergence a rychlost reakce. My jsme zvolili lineární funkce pro teplotu a divergenci a exponenciální funkci závislou na teplotě pro rychlost reakce. Tyto funkce nám dávali nejlepší výsledky a proto jsme ostatní vynechali, což urychlilo výpočet a usnadnilo implementaci. 3.2.3 Vizualizace 34 I vizualizaci jsme řešili na grafické kartě. Naimplementovali jsme podporu pro jeden bodový zdroj osvětlení (každý zdroj světla potřebuje svojí hloubkovou stínovou mapu [5], případně ještě světelnou mapu [6]). Dále jsme přidali možnost vizualizovat několik substancí naráz (abychom viděli všechny chemické sloučeniny najednou). U světelných map jsme místo Henyey-Greensteinovy fázové funkce použili jednoduchý filtr, takže je rozptyl světla závislý na poměru plochy světelné mapy s její hloubkou. Tímto jsme dosáhli výrazně jednodušší implementace (na grafické kartě není snadné generovat náhodná čísla) a navíc je celý proces výrazně rychlejší. Tento postup je pro nás dostatečný, protože fázová funkce plynů je velmi ostrá. 3.3 Návrh řešení V této podkapitole se dozvíte, jak jsme všechny části spojili. Jak vypadá simulační smyčka a kdy výsledek vizualizujeme. Na obrázku 28 můžeme vidět jednotlivé části simulace. Nejprve je potřeba inicializovat rychlostní pole, pole hustot a teplotní pole. Poté přichází na řadu simulační smyčka. Nejprve se provede advekce, poté se přidá hustota a teplota ze zdrojů (například od hořící cigarety). Pak přichází na řadu externí síly (gravitace, vztlak a difuze). Poté si můžeme vybrat, zda přidáme víření do rychlostního pole. Pak spočítáme divergenci rychlostního pole. Nyní přichází na řadu chemické reakce, které ovlivní počet jednotlivých chemických sloučenin a mohou změnit teplotu (například hoření), nebo divergenci (například exploze). Dalším krokem je projekce tlaku. Tento krok opakujeme, dokud nedosáhneme požadovaného výsledku. Nakonec můžeme vše vizualizovat. Obrázek 28: Simulační smyčka. H je hustota (nebo více hustot), T je teplota, R je rychlostní pole, D je divergence a P je tlak. Zobrazeny vždy pole, které se v daném kroku mění. 35 3.4 Vlastnosti aplikace Aplikace bude ovládána z grafického uživatelského prostředí, které můžeme vidět na obrázku 29. Uživatel si bude moci zvolit velikost simulační mřížky a rozlišení hloubkové stínové mapy a světelné mapy. Dále si vybere jeden z předpřipravených scénářů (exploze, reakce dvou plynů...). Poté si bude moci zvolit, zda bude jednotlivé snímky ukládat do bufferu a počet snímků, po kterém se začnou přehrávat snímky z bufferu s rychlostí 30 snímků za vteřinu. Uživatel si samozřejmě vybere velikost výstupního okna. Poté inicializuje scénu (vytvoří se patřičná pole v paměti). Tlačítko inicializace bude sloužit i jako restart. Nyní již uživatel může nastavit parametry simulace. Parametry i s jejich dopady na průběh a rychlost simulace si popíšeme v následujících kapitolách. Obrázek 29: Vzhled navrhovaného uživatelského rozhraní. 36 4. Implementace V této kapitole se dozvíte, jaké postupy jsme použili při implementaci. Dále si popíšeme některé vybrané zajímavé části implementace. Pro implementaci jsme si zvolili programovací jazyk C++, technologii CUDA, OpenGL, GLUT a pro uživatelské rozhraní GLUI. Nejprve si řekneme něco o technologii CUDA, poté si na jednoduché 2D CPU implementaci vysvětlíme základy simulace tekutin. Poté se podíváme na GPU implementaci, na které si ukážeme rozšíření simulace tekutin o McCormackovo advekční schéma a víření, jejichž vliv bude demonstrován na několika příkladech. Následuje vysvětlení implementace chemických reakcí i s jejich efektem na simulaci. Nakonec se podíváme na vizualizaci a vhodné nastavení jejích parametrů. 4.1 CUDA V roce 2006 představila společnost NVIDIA technologii CUDA (paralelní výpočetní architektura pro obecné použití) s novým modelem paralelního programování a instrukční sadou. To umožnilo využít grafické karty NVIDIA pro řešení mnoha komplexních výpočetních problémů efektivněji, než na CPU. CUDA přišla se softwarovým prostředím, které umožňovalo využít C jako programovací jazyk. CUDA je modelována tak, aby umožnila snadný přístup k možnostem GPU pro programátory obeznámenými se standardními programovacími jazyky, jako je C. To byl také důvod k použití této technologie. Následuje ukázka jednoduchého kernelu sečtení dvou vektorů. __global__ void addVectors( int *inA, int *inB, int *outC ) { int threadID = blockIdx.x; if (threadID < N) outC[threadID] = inA[threadID] + inB[threadID]; } Musíme vytvořit patřičná pole na grafické kartě a nahrát do nich vstupní data. Poté na grafickou kartu nahrát vstupní data a správně zavolat kernel. Poté můžeme zkopírovat data zpět. cudaMalloc( (void**)&devA, N*sizeof(int) ); cudaMalloc( (void**)&devB, N*sizeof(int) ); cudaMalloc( (void**)&devC, N*sizeof(int) ); for (int i=0; i<N; i++) { a[i] = -i; b[i] = i * i; } cudaMemcpy( devA, a, cudaMemcpy( devB, b, addVectors<<<N,1>>>( cudaMemcpy( c, devC, N*sizeof(int), cudaMemcpyHostToDevice ); N*sizeof(int), cudaMemcpyHostToDevice ); devA, devB, devC ); N * sizeof(int), cudaMemcpyDeviceToHost ); 37 4.2 Implementace na CPU Na CPU jsme implementovali 2D verzi simulátoru tekutin obsahujícího obtékání překážek, Stamovu implicitní metodu advekce, působení gravitace, vztlaku, difuzi a projekci. Pro snazší pochopení vysvětlení a ukázky kódů pro situaci bez překážek. Implementace překážek bude vysvětlena v implementaci pro GPU, čímž chceme také ukázat rozdíl implementace s překážkami a bez. Implementace na CPU je snadno paralelizovatelná. Například pomocí open mp, nebo posixových vláken by se dalo docílit zrychlení téměř takové, kolik by bylo procesorů. Abychom spočítali vždy všechny buňky, tak použijeme dva vnořené for cykly. Každý krok cyklu pak spočítá jednu buňku. Advekce Ukážeme si Stamovu implicitní metodu. Nejprve vytvoříme nové pole, do kterého budeme ukládat výsledky, poté pro každou buňku spočítáme pozici tak, že od pozice buňky odečteme vektor rychlosti vynásobený velikostí časového kroku. Novou hodnotu získáme interpolací hodnot buněk ležících nejblíže tomuto místu. Následuje ukázka kódu. for(int j = 0; j<IMAGE_HEIGHT;j++) for(int i = 0; i<IMAGE_WIDTH;i++){ //spočítání pozice pomocí backtrackingu float posx = i - ut[0][i][j]*timestep; float posy = j - ut[1][i][j]*timestep; // vyřešení ohrajových podmínek if(posx<1)posx=1; if(posx>IMAGE_WIDTH-2)posx=IMAGE_WIDTH-2; if(posy<1)posy=1; if(posy>IMAGE_HEIGHT-2)posy=IMAGE_HEIGHT-2; // interpolovat hodnotu value = interpolate(posx,posy); xnew[i][j] = value; } return xnew; Projekce Projekce se skládá ze 3 kroků: divergence, spočítání tlaku a projekce tlaku do rychlostního pole. Divergence se spočítá tak, že zjistíme hodnotu rychlosti pro x složku v buňkách nalevo a napravo a pro y složku dole a nahoře. Tyto hodnoty od sebe vždy odečteme a výsledek sečteme a vynásobíme jednou polovinou. Toto uděláme pro každou buňku. Následuje ukázka pro buňku na pozici i,j: float wL = w[0][i-1][j]; float wR = w[0][i+1][j]; float wB = w[1][i][j-1]; float wT = w[1][i][j+1]; div[i][j] = 0.5 * ((wR - // rychlost // rychlost // rychlost // rychlost wL) + (wT - 38 buňky buňky buňky buňky wB)); vlevo vpravo dole nahoře // divergence Tím jsme spočítali divergenci rychlostního pole. Nyní vyřešíme Poissonovu tlakovou rovnici. K tomu využijeme Jacobiho iterativní metodu. K dosažení dobrých výsledků je potřeba asi 40-80 iterací. Díky tomu je tato část nejvíce výpočetně náročná. Spočítáme si sumu hodnot tlaku v okolních buňkách a odečteme od ní divergenci z minulého kroku. Výsledek vydělíme 4. Tím dostaneme novou hodnotu tlaku pro každou buňku. Posledním krokem je odečtení gradientu tlaku od rychlostního pole, čímž získáme rychlostní pole bez divergence. Podobně jako při počítání divergence si spočítáme rozdíl pravého a levého souseda pro x souřadnici a horního a dolního pro y. Tyto hodnoty pak odečteme od rychlostního pole. Následuje ukázka kódu pro buňku na souřadnici i, j. float float float float pL pR pB pT = = = = p[i-1][j]; p[i+1][j]; p[i][j-1]; p[i][j+1]; uNew[0][i][j] uNew[1][i][j] uNew[0][i][j] uNew[1][i][j] // // // // tlak tlak tlak tlak buňky buňky buňky buňky vlevo vpravo dole nahoře = w[0][i][j]; = w[1][i][j]; -= 0.5 *(pR - pL)*timestep; // rozdíl tlaků -= 0.5 *(pT - pB)*timestep; // rozdíl tlaků 4.3 Implementace na GPU Na rozdíl od CPU implementace řeší každou buňku vždy jedno vlákno (v případě 3D verze každé vlákno počítá všechny buňky se stejnou x a y souřadnicí a postupuje od nejbližší po nejvzdálenější). Řešení advekce a projekce tlaku pro GPU je velmi podobné tomu na CPU. Všechny pole máme uloženy ve 2D(3D) texturách. Kernel vždy ukládá výsledek do 1D pole, které je následně překopírováno do textury. Textura je uchována v CUDA Array. Textury jsme zvolili, protože je zde hardwarová implementace bilineární i trilineární interpolace, která je velmi rychlá a navíc jsou textury cachované. Výpočet provádí vždy kernel, který je pro všechna vlákna stejný. Ten je zavolán s parametry obsahujícími velikost mřížky a počet vláken v bloku. Do textur se přistupuje přes funkci tex2D nebo tex3D. Na GPU jsme naimplementovali 2D verzi simulátoru tekutin a plně funkční 3D verzi. V následujících podkapitolách si ukáže nejzajímavější části implementace i s ukázkami kódu. 4.3.1 Simulace tekutin Podrobněji se podíváme na MacCormackovo advekční schéma (na něm si ukážeme celý kernel pro 3D případ), řešení statických překážek, víření, ukážeme si rozdíl mezi advekčními schématy a vliv víření. 39 MacCormackova advekce: Pro každé vlákno si nejprve zjistíme ID v x, y a z směru. Poté zjistíme polohu backtrackingem stejně jako u Stama. Pak najdeme roh buňky nejblíže tomuto místu. Vypočítáme hodnoty v osmi buňkách obklopující tento roh. Zjistíme nejmenší a největší hodnotu v těchto buňkách. Poté podle rovnice 4 vypočítáme výslednou hodnotu (hodnotu a si spočítáme Stamovou metodou před spuštěním kernelu). Výslednou hodnotu poté ořízneme minimální a maximální hodnotou. __global__ void McCormic3DKernel(int3 dimension,float * out) { int IDx = threadIdx.x + 16 * blockIdx.x ; int IDy = threadIdx.y + 16 * blockIdx.y ; for(int i=0;i<dimension.z;i++){ int IDz =i ; // zjištění pozice float posx = IDx - tex3D(ux,IDx,IDy,IDz)*timestep; float posy = IDy - tex3D(uy,IDx,IDy,IDz)*timestep; float posz = IDz - tex3D(uz,IDx,IDy,IDz)*timestep; // zaokrouhlení posx = floor(posx +0.5f); posy = floor(posy +0.5f); posz = floor(posz +0.5f); // spočítání hodnot sousedních buněk float value1 = triInterp(dimension,posx+0.5f, posy+0.5f, posz+0.5f); ... float value8 = triInterp(dimension,posx-0.5f, posy-0.5f, posz-0.5f); // spočítání minima a maxima sousedů float phiMin = min8(value1,value2...value8); float phiMax = max8(value1,value2...value8); // spočítání hodnoty advekce float val = tex3D(fi1,IDx,IDy,IDz) + 0.5*(tex3D(advect,IDx,IDy,IDz)tex3D(fi,IDx,IDy,IDz)); // oříznutí out[IDx+IDy*dimension.x+IDz*dimension.y*dimension.x] = max(min(val, phiMax), phiMin); } } Rozdíl mezi Stamovým a McCormackovým advekčním schématem můžeme vidět na obrázku 30. Stamova advekce se chová více viskózně a díky tomu vypadá vyhlazeněji a pohybuje se pomaleji. 40 Obrázek 30: Rozdíl mezi Stamovou a McCormackovou advekcí. Stamova nahoře, McCormackova dole. Mřížka 80x80x80. Překážky Divergenci počítáme jenom pro buňky neobsahující překážku. V počítání projekce místo tlaku v překážce bereme tlak v dané buňce. Dále je potřeba nastavit hodnotu hustoty v hraničních buňkách překážek na hodnotu nejbližší volné buňky, aby nedocházelo k mizení hustoty, jak to udělali autoři v [10]. Víření Víření se počítá pomocí rovnice 7. Její numerické řešení pro třídimenzionální případ však není intuitivní a proto si ho zde vysvětlíme podrobněji. Nejprve musíme vyřešit rovnici 5. Diskrétní verze víru se spočítá jako: (30) 41 kde 31). jsou součty složek rychlosti v jednotlivých směrech vydělených 2 (viz rovnice (31) To můžeme v CUDě implementovat pomocí device funkcí (všechny funkce volané z kernelu musí být device): __device__ __inline float Curl_x(int x, int y,int z){ return tex3D(ux,x-1,y,z)+tex3D(ux,x+1,y,z)*0.5; } __device__ __inline float Curl_y(int x, int y,int z){ return tex3D(uy,x,y-1,z)+tex3D(uy,x,y+1,z)*0.5; __device__ __inline float Curl_z(int x, int y,int z){ return tex3D(ux,x,y,z-1)+tex3D(ux,x,y,z+1)*0.5; } __device__ __inline float3 omega(int IDx, int IDy,int IDz){ float3 w; // omega w.x = (Curl_z(IDx,IDy+1,IDz)-Curl_z(IDx,IDy-1,IDz)Curl_y(IDx,IDy,IDz+1)+Curl_y(IDx,IDy,IDz-1)); w.y = (Curl_x(IDx,IDy,IDz+1)-Curl_x(IDx,IDy,IDz-1)Curl_z(IDx+1,IDy,IDz)+Curl_z(IDx-1,IDy,IDz)); w.z = (Curl_y(IDx+1,IDy,IDz)-Curl_y(IDx-1,IDy,IDz)Curl_x(IDx,IDy+1,IDz)+Curl_x(IDx,IDy-1,IDz)); return w; } Nyní potřebujeme vyřešit rovnici 6. To uděláme tak, že si spočítáme gradient absolutní hodnoty ω, který normalizujeme. Poté již můžeme vyřešit rovnici 7, kde uděláme vektorový součin , který vynásobíme uživatelem zadanou konstantou. To v CUDě pro prvek na pozici IDx,IDy a IDz uděláme takto: float3 w = omega(IDx,IDy,IDz); float3 N; N.x = fabs(omega(IDx+1,IDy,IDz).x)-fabs(omega(IDx-1,IDy,IDz).x); N.y = fabs(omega(IDx,IDy+1,IDz).y)-fabs(omega(IDx,IDy-1,IDz).y); N.z = fabs(omega(IDx,IDy,IDz+1).z)-fabs(omega(IDx,IDy,IDz-1).z); float length = sqrt(N.x*N.x+N.y*N.y+N.z*N.z)+0.0000000000001; N.x /= length; // normalizace N.y /= length; // normalizace N.z /= length; // normalizace // Výpočet nové hodnoty rychlosti pro x složku outx[IDx+IDy*dimension.x+IDz*dimension.y*dimension.x] = (tex3D(ux,IDx,IDy,IDz) + (timestep*eps*(N.y*w.z-N.z*w.y)))*(1tex3D(obstacles,IDx,IDy,IDz)); // Výpočet nové hodnoty rychlosti pro y složku outy[IDx+IDy*dimension.x+IDz*dimension.y*dimension.x] = (tex3D(uy,IDx,IDy,IDz) + (timestep*eps*(-N.x*w.z+N.z*w.x)))*(1tex3D(obstacles,IDx,IDy,IDz)); // Výpočet nové hodnoty rychlosti pro z složku outz[IDx+IDy*dimension.x+IDz*dimension.y*dimension.x] = (tex3D(uz,IDx,IDy,IDz) + (timestep*eps*(N.x*w.y-N.y*w.x)))*(1tex3D(obstacles,IDx,IDy,IDz));}} 42 (a) (b) Obrázek 31: Vliv parametru víření. Koeficienty zleva doprava a odshora dolů jsou 0.1, 0.2, 0.35, 0.5, 1, 1.5. (a) kouř po 60 snímcích. (b) po 120 snímcích. Bylo použito McCormackovo advekční schéma. Mřížka 80x80x80. Vliv parametru víření můžeme vidět na obrázku 31 (na obrázku 30 se můžete podívat na situaci bez víření). Jak lze z obrázku dobře vidět, tak vhodně zvolená hodnota parametru víření velmi výrazně zvýší realičnost simulace. Pro příliš velkou hodnotu parametru dochází k velkým turbulencím, které zpomalují stoupání kouře, nebo dokonce zničí simulaci, jak lze vidět na posledním snímku sekvence. 43 4.3.2 Simulace chemických reakcí V této podkapitole se podíváme na kernel chemické reakce aA + bB → eE + fF, na kterém si vysvětlíme, jak reakce ovlivňují simulaci. Ukážeme si, jak se projeví parametry chemických reakcí. Obrázek 32: Závislost rychlosti reakce na teplotě. Na následujícím kernelu si ukážeme, jak jsme počítali rychlost reakce a jak působí na simulaci. Maximální rychlost reakce jsme spočítali jako podíl mezi hustotou prvků A a B a stechiometrickými koeficienty a, b. Výsledná rychlost reakce je maximální rychlost reakce vynásobená uživatelskou konstantou a exponenciální funkcí teploty (průběh viz obrázek 32). Když známe rychlost reakce, tak můžeme upravit hustotu prvků podle stechiometrických koeficientů vynásobených rychlostí reakce. Divergence a teplota jsou změněny podle uživatelských proměnných vynásobených rychlostí reakce. // výpočet maximální rychlosti reakce max_rate = min(tex3D(dentisty,IDx,IDy,IDz)/reactants[0], tex3D(dentisty2,IDx,IDy,IDz)/reactants[1]); float e = 2.71828183; // výpočet aktuální rychlosti reakce rate = max_rate*min(reaction_rate*(1/timestep) * pow(e,-24/(tex3D(temperature,IDx,IDy,IDz)+290)),1.f); // změna hustot, divergence a teploty out[IDx+IDy*dimension.x+IDz*dimension.y*dimension.x] = tex3D(dentisty,IDx,IDy,IDz)-rate*reactants[0]; ... out4[IDx+IDy*dimension.x+IDz*dimension.y*dimension.x] = tex3D(dentisty4,IDx,IDy,IDz)+rate*reactants[3]; outDiv[IDx+IDy*dimension.x+IDz*dimension.y*dimension.x] = tex3D(divergence,IDx,IDy,IDz)+rate*divergence_rate; outTemp[IDx+IDy*dimension.x+IDz*dimension.y*dimension.x] = tex3D(temperature,IDx,IDy,IDz)+rate*temperature_rate; Hodnoty parametrů si ukážeme na jednoduché reakci exploze A + B → 5E. Na obrázku 33a můžeme vidět počáteční rozložení dvou plynů, které se překrývají. Na obrázku 33b můžeme vidět vliv rychlosti reakce a na 33c vliv změny divergence. Z obrázku je vidět, že když je změna divergence nenulová, tak dochází k přibývání, nebo mizení hustoty. To je způsobeno díky backtrakingu, kdy je hodnota z jedné buňky přiřazena několika buňkám, nebo naopak. 44 (a) Počáteční rozložení. (b) Rychlost reakce od shora 0.01, 0.05 ,0.5. Změna teploty a divergence konstantní. (c) Velikost divergence: první dva 0, druhé dva -100, spodní dva 100. Změna teploty a rychlost reakce konstantní. Mřížka 80x80x80. Obrázek 33: Vliv parametrů reakce na průběh simulace. 45 4.3.3 Vizualizace Nyní si ukážeme, jak jsme implementovali vizualizaci. Jak jsme udělali ray-marching, hloubkové stínové mapy a světelné mapy. Ukážeme si rozdíl scény bez světla a s ním. Nakonec si ukážeme vliv délky kroku u ray-marchingu a velikosti chyby u hloubkových stínovích map. Ray-marching Nejprve je potřeba si spočítat parametry okna, kterým budeme střílet paprsky. Použili jsme perspektivní kameru. Výpočet těchto parametrů je jediný výpočet odehrávající se na CPU, protože je rychlejší spočítat parametry jednou, než aby je muselo počítat každé vlákno. Tyto parametry se předají kernelu, který pro každý pixel okénka spočítá směr parsku, vstupní a výstupní bod z kvádru obsahujícího volumetrická data (pokud jsme uvnitř tak jen výstupní bod), z těchto bodů spočítá délku paprsku uvnitř a zjistí maximální počet vzorků (vydělí délku paprsku uvnitř délkou kroku). Pro každý vzorek spočítáme osvětlení a pomocí alpha blendingu (rovnice 22 a 23) spočítáme barvu. Pokud dosáhneme hodnoty opacity>0.999, tak paprsek ukončíme. Ještě můžeme upravit hustotu uvnitř buněk za pomoci Perlinova šumu. Na obrázku 34 můžete vidět, jak délka kroku ovlivňuje výsledek. Při větších hodnotách kroku dochází k ostrým změnám odstínu. Při krocích nad 1 dochází k průhlednosti tenkých překážek, a když krok vyjde do tenké překážky, tak je zobrazena s příliš velkou intenzitou. Pro pohled mimo objem nám dostačuje délka kroku 0.5. 46 Obrázek 34: Vliv délky kroku na vizualizaci. Odleva 0.1, 0.5, 1 a 2. Hloubková stínová mapa Pro hloubkové stínové mapy začínáme stejně, jako v ray-marchingu až po spočítání polohy vzorků. Postupujeme podél paprsku až do doby, kdy narazíme na první překážku (hustota není nulová). Poté přichází na řadu kompresní algoritmus popsaný v kapitole 2.2.3. Následuje jeho implementace v CUDě. 47 if((den>0 || layer>0) && layer<size.z-1){ // jsme v mapě // nové hodnoty naklonění float y_up_new = ((occlusion+dsm_error-y_depth)/len); float y_down_new = ((occlusion-dsm_error-y_depth)/len); if(y_up_new<y_down || y_down_new>y_up || layer==0){ //zapisujeme // nastavení hodnot mapy dsm_depth[IDx+IDy*size.x+layer*size.x*size.y]=depth; dsm_occlusion[IDx+IDy*size.x+layer*size.x*size.y] = occlusion_prev; layer++; len = 1; // vzdálenost od poslední vrstvy y_up = occlusion - y_depth + dsm_error; y_down = occlusion - y_depth - dsm_error; y_depth_last=occlusion_prev; } else{ // jsme v toleranci // aktualizace hodnot naklonění y_up = min(((occlusion+dsm_error-y_depth_last)/len),y_up); y_down = max(((occlusion-dsm_error-y_depth_last)/len),y_down); } } occlusion_prev=occlusion; depth_prev=depth; y_depth = occlusion; Po skončení komprese máme v jednotlivých vrstvách hloubkové stínové mapy uloženou vždy hloubku a opacitu. Mezi jednotlivými můžeme lineárně interpolovat hodnoty opacity. Tímto jsme dostali velice přesné ostré stíny. Nyní nám stačí se v ray-marchingu vždy podívat do hloubkové stínové mapy, najít vrstvy, mezi kterými leží vzorek a lineárně interpolovat. Na obrázku 35 je vidět rozdíl v maximální přípustné chybě. Při větší chybě jsou stíny velmi nepovedené. 48 Obrázek 35: Rozdíl v maximální přípustné chybě při kompresi hloubkové stínové mapy. Od shora doprava postupně 0.01, 0.05, 0.01, 0.02. Světelná mapa Nejprve je potřeba převzorkovat hloubkovou stínovou mapu na uniformní mřížku. Toho lze dosáhnout velmi snadno. Pro každý bod nové mřížky získáme hodnotu ze stínové mapy stejně jako v ray-marchingu. Nyní procházíme hodnoty po vrstvách odpředu dozadu a pro každý pixel v mapě získáme novou hodnotu kombinací tohoto pixelu a pěti nejbližších pixelů z minulé vrstvy. Tím dostaneme měkké, ale málo přesné stíny. Rozhodli jsme se použít kombinaci přesných ostrých stínů z hloubkové stínové mapy a přisvětlení pomocí světelné mapy, čímž dosáhneme přijatelného kompromisu. Rozdíl scény bez osvětlení, s osvětlením a s přisvícením můžete vidět na obrázku 36. 49 Obrázek 36: Scéna s různými druhy světla. Vlevo bez stínů, uprostřed hloubková stínová mapa a vpravo přisvícení světelnou mapou. 4.4 Problémy při implementaci Při implementaci 3D verze jsme měli 2 problémy. Prvním bylo to, že počet vláken na mřížce může být pouze dvojrozměrný, na což nás překladač neupozornil. Dalším problémem bylo kopírování z jednorozměrného pole do 3D textury, což se muselo udělat zcela jinak, než jsme očekávali a to: cudaExtent extent = make_cudaExtent(dimension.x , dimension.y, dimension.z); cudaMemcpy3DParms copyParams = {0}; copyParams.srcPtr = make_cudaPitchedPtr((void*)out,dimension.x * sizeof(float), dimension.x, dimension.y); // co copyParams.extent = extent; copyParams.kind = cudaMemcpyDeviceToDevice; //kopírujeme z GPU na GPU copyParams.dstArray = advected; // kam CHECK_ERROR(cudaMemcpy3D(©Params)); //kopírovat 50 5. Výsledky a testování V této kapitole si ukážeme několik vygenerovaných scén a výsledky testování naší aplikace. Nejdříve si ukážeme jednoduchou reakci dvou plynů. Poté reakci odstartovanou zahřáním kahanem. Další ukázkou je scéna složená z několika reakcí. Ukážeme si i výsledek zjednodušené 2D verze na jednoduché interakci plynu se scénou. Nakonec provedeme testování naší aplikace. K vytvoření obrázků i testování byl použit počítač s procesorem Intel Core 2 Duo na frekvenci 2.66 GHz a grafickou kartou NVIDIA 8800 GT. K vytvoření obrázků byly použity základní hodnoty parametrů (viz obrázek 29), pokud není řečeno jinak. Na přiloženém DVD naleznete videa ze všech těchto scén. 5.1 Reakce dvou plynů Ukážeme si reakci těžkého a lehkého horkého plynu. Těžký plyn padá ze shora a mísí se s lehkým plynem, což má za následek chemickou reakci . Výsledný plyn má střední hmotnost a při reakci je uvolněno menší množství tepla. Průběh reakce můžete vidět na obrázku 37. Obrázek 37: Průběh chemickou reakce . Molární hmotnost plynu A je 0.01, plynu B 0.3 a plynu E 0.15. Mřížka 144x144x144. Průměrně 0.7 snímků za sekundu. 51 Obrázek 38: Průběh chemickou reakce . Molární hmotnost plynu A je 0.01, plynu B 0.3 a plynu E 0.15. Mřížka 144x144x144. Průměrně 0.7 snímků za sekundu. 5.2 Scéna s kahanem V misce máme dva podchlazené reaktivní plyny, které jsou zahřívány kahanem. Když teplota dosáhne určité hranice, tak spolu začnou reagovat. Reakce uvolňuje velké množství tepla a plyn se také rozpíná. Tím dochází ke zvýšení rychlosti reakce a následně až k explozi. Reakci můžete vidět na obrázku 38. Obrázek 39: Reakce ( ) dvou plynů zahřívaných kahanem. Mřížka 80x80x80. Rozptyl světla zapnut. Průměrně 3.5 snímků za sekundu. 52 5.3 Scéna s komplexní geometrií Světle modrý plyn A teče do nádoby, kde reaguje s bílým plynem B a vytváří modrý plyn C. Ten postupně naplňuje nádobku, až přeteče. Pod nádobou je deska s otvorem, pod kterou je vysoce reaktivní zelený plyn D. Když se modrý a zelený plyn smíchají, tak dojde k explozi a vznikne světle modrý plyn A. Reakce se odehrávají podlé následujících rovnic: Výsledek můžete vidět na obrázku 39 v rozlišení 64x80x64 a na obrázku 40 v rozlišení 144x144x144. Když si porovnáte oba obrázky, tak je zde velmi výrazný rozdíl v detailech, ale i ve výpočetní náročnosti. Obrázek 40: Reakce s komplexní geometrií. Mřížka 64x80x64. Rozptyl světla zapnut. Průměrně 4.8 snímků za sekundu. 53 Obrázek 41: Reakce s komplexní geometrií. Mřížka 144x144x144. Rozptyl světla zapnut. Průměrně 0.7 snímků za sekundu. 54 5.4 2D simulace Na obrázku 41 můžete vidět dvojrozměrnou simulaci kouře obtékajícího překážky. Dvojrozměrná simulace je velmi rychlá a dá se dosáhnout i několika set snímků za sekundu. Obrázek 42: Simulace 2D Stam. Mřížka 256x256. Přibližně 185 snímků za sekundu. 5.5 Testování Každého nejvíce zajímá, jaké zrychlení bylo dosaženo oproti CPU verzi. Dále je zajímavé porovnání náročnosti vypočítání jedné buňky ve 2D a 3D. Dále testujeme závislost doby výpočtu na počtu vláken na mřížce. Testujeme na procesoru Intel core 2 duo 2,66 GHz(e6600) a grafické kartě 8800 GT. Čas je uveden vždy pro 50 kroků a to v sekundách. Oproti autorům článku *1+, kde simulace jednoho snímku v rozlišení 80x80x80 trvala 78 sekund (CPU Intel Pentium IV 3.2 GHz) jsme dosáhli sedmi snímků za sekundu. To je přibližně 500-ti násobné zrychlení. Toto srovnání je pouze informativní, protože nevíme jak přesně autoři 5.5.1 Porovnání rychlosti 2D CPU a GPU verze: Pro shodné nastavení. Stamovo advekční schéma. Počet Jakobiho iterací je 40. Jak může vidět v tabulce 3 a obrázku 43, tak zrychlení GPU verze oproti CPU je opravdu velmi výrazné. V rozlišení 1024x1024 dokonce více než 150 násobné, což předčilo naše očekávání. 55 Mřížka Buňek CPU GPU Zrychlení 64x64 4096 1,07 0,082 13,04878049 128x128 256x256 512x512 1024x1024 16384 65536 262144 1048576 4,2 18,75 76,7 605 0,133 0,31 1,03 3,97 31,57895 60,48387 74,46602 152,3929 Tabulka 3: Porovnání rychlosti 2D CPU a GPU verze. Čas v sekundách Zrychlení 200 150 100 50 0 Zrychlení Velikost mřížky Obrázek 43: Zrychlení GPU oproti CPU 5.5.2 Vliv počtu vláken: Vliv počtu vláken na mřížce na výkon. Rozlišení 256x256. Jak můžeme vidět v tabulce 4 a obrázku 44, tak vliv počtu vláken na mřížce na výkon je výrazný. V extrémním případě dojde k dvacetinásobnému zpomalení. vláken Čas 16x16 0,31 8x8 0,55 4x4 0,59 2x2 1,73 1x1 6 Tabulka 4: Vliv počtu vláken na mřížce na výkon Závislost počtu vláken Čas v sekundách 8 6 4 2 Čas 0 16x16 8x8 4x4 2x2 1x1 Vláken Obrázek 44: Vliv počtu vláken na mřížce na výkon 56 5.5.3 Vliv velikosti mřížky na výkon Vliv velikosti mřížky na výkon. Testováno na scéně 3. Krok při rednerování 0.5. V tabulce 5 a na obrázku 45 můžete vidět, že čas renderování roste podle očekávání lineárně. Doba simulace by měla růst kubicky, což není tak patrné díky optimálnímu výkonu až na velkých mřížkách. 32^3 Čas simulace Renderování Celkem 48^3 64^3 80^3 96^3 112^3 128^3 144^3 1,18 2,52 4,6 7,4 12,35 18,2 27,75 37,6 2,65 3,8 4,85 6 8 8,85 10,5 11,85 3,83 6,32 9,45 13,4 20,35 27,05 38,25 49,45 Tabulka 5: Vliv velikosti mřížky na výkon. Závislost času na velikosti mřížky 60 Čas v sekundách 50 40 30 Čas simulace Renderování 20 Celkem 10 0 32^3 48^3 64^3 80^3 96^3 112^3 128^3 144^3 Velikost mřížky Obrázek 45: Vliv velikosti mřížky na výkon. 5.5.4 Vliv osvětlení na výkon Nejzajímavějším parametrem při sledování vlivu osvětlení na rychlost je velikost maximální chyby při stavbě hloubkových stínových map. Můžeme jí vidět v tabulce 6 a na obrázku 46. Velikost chyby ovlivňuje hloubku mapy v jednotlivých pixelech. Čím je hloubka větší, tím vícekrát se musíme podívat do mapy, abychom se dostali na hledanou vrstvu. Toto by šlo urychlit binárním vyhledáváním pro přesnější mapy. Při chybě 0.01 a délce kroku 0.5 a 57 scéně na obrázku 40 uprostřed trvá renderování bez osvětlení 0.15, s osvětlením 0.4 a s přisvícením 0.48. Z toho se dá odvodit, že osvětlení zpomalí renderování 2-3x. Chyba Čas 0,005 9,5 0,01 8,5 0,025 7 0,05 6 0,1 5 0,2 4,5 Tabulka 6: Vliv velikosti mřížky na výkon. Čas v sekundách Čas výpočtu ostrých stínů 10 9 8 7 6 5 4 3 2 1 0 Čas 0,005 0,01 0,025 0,05 0,1 0,2 Maximální velikost chyby Obrázek 46: Vliv velikosti mřížky na výkon. 58 6. Závěr V této diplomové práci jsme si představili několik technik k simulaci chemických reakcí. Zaměřili jsme se na techniku rozšiřující Eulerovskou simulaci tekutin o kinetiku chemických reakcí, na jejímž základě jsme vytvořili aplikaci. Oproti předloze jsme vše implementovali na grafické kartě, díky čemu jsme dosáhli více než 500 násobnému zrychlení oproti časům uváděných v [1]. Aplikace je otestovaná na OS Windows a mělo by být možno ji převést na jinou platformu. Aplikace vyžaduje grafickou kartu NVIDIA alespoň řady 8000. V aplikaci je možno simulovat široké spektrum chemických reakcí a k dispozici jsou 4 předpřipravené škálovatelné scény. Vstupem je grafické uživatelské rozhraní a výstupem je přímá vizualizace. Implementace autorů není k dispozici, proto můžeme porovnávat pouze podobné scény. Dosáhli jsme podobných výsledků a otestovali i několik vlastních scén. Podobně jako autoři jsme vytvořili jednoduchou reakci dvou plynů, dále výbuch způsobený zahříváním kahanem a scénu s komplexní geometrií a několika chemickými reakcemi. Díky implementaci na GPU je možné měnit parametry simulace interaktivně a pohybovat se po scéně, což bylo u původní práce nemyslitelné. Námětem pro budoucí práci může být rozšíření o částice, které by mohli snížit výpočetní a paměťovou náročnost, podobně jako v práci *2+. Aby byla aplikace použitelná v komerčním sektoru, tak by musela být napsána formou rozšíření některého modelovacího systému (Například Maya, nebo Softimage), kde by se daly snadno umístit reaktanty, a výsledkem by byla patřičná chemická reakce. V budoucnu by mohla být tato metoda součástí herního enginu, kde by se mohla starat o efekty, jako jsou výbuch nebo oheň. 59 60 7. Seznam použité literatury [1] Insung Ihm, Byungkwon Kang, Deukhyun Cha: Animation of reactive gaseous fluids through chemical kinetics. Proceedings of the 2004 ACM SIGGRAPH/Eurographics symposium on Computer animation, pp. 203-212, 2004. [2] Byungkwon Kang, Yoojin Jang, Insung Ihm: Animation of chemically reactive fluids using a hybrid simulation method. Proceedings of the 2007 ACM SIGGRAPH/Eurographics symposium on Computer animation, pp. 199-208, 2007. [3] Keenan Crane, Ignacio Llamas, Sarah Tariq: Real-Time Simulation and Rendering of 3D Fluids. GPU Gems 3, Addison-Wesley Professional, August 2007, ISBN-13: 978-0321515261. *4+ Stam Jos: Stable fluids. In Proc. of ACM SIGGRAPH 1999 (1999), pp. 121–128. [5] Tom Lokovic and Eric Veach, Deep shadow maps, SIGGRAPH 2000 Proceedings (August 2000), Addison-Wesley [6] Christof Rezk-Salama, Markus Hadwiger, Timo Ropinski, Patric Ljung: Advanced Illumination Techniques for GPU Volume Raycasting, ACM SIGGRAPH ASIA 2008 courses, 2008 [7] Qing Yang: Real-time simulation of 3D smoke on GPU, Proceeding CISST'09 Proceedings of the 3rd WSEAS international conference on Circuits, systems, signal and telecommunications, ISBN: 978-960-474-42-0 [8] Jos Stam: Real-Time Fluid Dynamics for Games, Proceedings of the Game Developer Conference, March 2003 [9] Andy Riley: Adding Vorticity Confinement and Internal Obstacles to a Stable Smoke Solver, University of Aarhus, Denmark [10] Ronald Fedkiw, Jos Stam ,Henrik Wann Jensen: Visual Simulation of Smoke, Proceeding SIGGRAPH '01 Proceedings of the 28th annual conference on Computer graphics and interactive techniques,ACM New York, NY, USA ©2001, ISBN:1-58113-374-X [11] Andrew Selle, Nick Rasmussen, Ronald Fedkiw: A vortex particle method for smoke, water and explosions, Proceeding SIGGRAPH '05 ACM SIGGRAPH 2005 Papers, ACM New York, NY, USA ©2005 [12] Robert Bridson: Fluid Simulation for Computer Graphics, A K Petres Ltd., 2008 [13] L.S. Yaeger, C. Upson and R. Myers: Combining physical and visual simulation-creation of the planet Jupiter for the film "2010"", in Proc. SIGGRAPH, 1986, pp.85-93. 61 [14] Manuel Noronha Gamito, Pedro Faria Lopes, Mario Rui Gomes: Two-Dimensional Simulation of Gaseous Phenomena Using Vortex Particles, In Proceedings of the 6th Eurographics Workshop on Computer Animation and Simulation, 1995 [15] Desbrun Mathieu, Cani Marie-Paule: Smoothed Particles: A new paradigm for animating highly deformable bodies, Eurographics Workshop on Computer Animation and Simulation, EGCAS '96. Poitiers, France, août 1996. pages 61–76. Springer, 1996 *16+ Matthias Müller, David , Markus Gross: Particle-based fluid simulation for interactive applications, Proceeding SCA '03 Proceedings of the 2003 ACM SIGGRAPH/Eurographics symposium on Computer animation [17] NEFF M., FIUME E.: A visual model for blastwaves and fracture. In Proc. of Graphics Inter- face 1999 (1999), pp. 193–202 [18] YNGVE G., O’BRIEN J., HODGINS J.: An-imating explosions. In Proc. of ACM SIG-GRAPH 2000 (2000), pp. 29–36 [19] FELDMAN B., O’BRIEN J., ARIKAN O.: An-imating suspended particle explosions. ACM Transactions on Graphics (ACM SIGGRAPH 2003) 22, 3 (2003), 708–715 [20] RASMUSSEN N., NGUYEN D., GEIGER W. ,FEDKIW R.: Smoke simulation for large scalephenomena. ACM Transactions on Graph-ics (ACM SIGGRAPH 2003) 22, 3 (2003),703– 707. [21] CHIBA N., MURAOKA K., TAKAHASHI H.,MIURA M.: Two dimensional visual simula-tion of flames, smoke and the spread of fire. Journal of Visualization and Computer Anima-tion 5 (1994), 37–53. [22+ STAM J., FIUME E.: Depicting fire and other gaseous phenomena using diffusion processes. In Proc. of ACM SIGGRAPH 1995 (1995), pp. 129–136. [23] LAMORLETTE A., FOSTER N.: Structural modeling of flames for a production environment. ACM Transactions on Graphics (ACM SIGGRAPH 2002) 21, 3 (2002), 729–735. [24] HASINOFF S., KUTULAKOS K.: Photo-consistent 3D fire by flame-sheet decomposi-tion. In Proc. of the Ninth IEEE Interna-tional Conference on Computer Vision (2003),pp. 1184– 1191. [25] GATES W.: Animation of Reactive Fluids. PhD thesis, Dept. of Computer Science, The Univ. of British Columbia, 2002. 62 [26] Henrik Wann Jensen and Per H. Christensen: Effiient simulation of light transport in scences with participating media using photon maps, Proceedings of the 25th annual conference on Computer graphics and interactive techniques (New York, NY, USA), SIGGRAPH '98, ACM, 1998, pp. 311-320. [27] Eric P. Lafortune, Yves D. Willems: Rendering participating media with bidirectional path tracing, Proceedings of the eurographics workshop on Rendering techniques 96, SpringerVerlag London, UK ©1996, ISBN:3-211-82883-4 [28] Kun Zhou, Zhong Ren, Stephen Lin, Hujun Bao, Baining Guo, Heung-Yeung Shum: Real-time smoke rendering using compensated ray marching, Proceeding SIGGRAPH '08 ACM SIGGRAPH 2008 papers ACM New York, NY, USA ©2008, ISBN: 978-1-4503-0112-1 [29] Cem Yuksel and John Keyser: Deep Opacity Maps, Computer Graphics Forum (Proceedings of EUROGRAPHICS 2008),2008 [30] Jon Jansen, Louis Bavoil: Fourier opacity mapping, Proceeding I3D '10 Proceedings of the 2010 ACM SIGGRAPH symposium on Interactive 3D Graphics and Games ACM New York, NY, USA ©2010 [31] PERLIN, K.: course in "Advanced Image Synthesis.", ACM SIGGRAPH 84 conference 1984 [32] Ken Perlin: Improving noise, Proceeding SIGGRAPH '02 Proceedings of the 29th annual conference on Computer graphics and interactive techniques ACM New York, NY, USA ©2002, ISBN:1-58113-521-1 [33] CUDA Programming Guide for CUDA Toolkit 4.0 [34] LEVINE I.: Physical Chemistry, 5th ed., McGraw-Hill, Inc., ISBN 0-07-253495-8, 2002 [35] FEDKIW R.: A Survey of Chemically Reacting, Compressible Flows. PhD thesis, Dept. of Mathematics, Univ. of California, Los Angeles, 1997. 63 64 A Uživatelská příručka A.1 Spuštění pod Windows Spustíme program reakce.exe. Ve stejné složce musí být cudart32_40_12.dll a glut32.dll. Program jde spustit pouze na počítačích s grafickou kartou NVIDIA série 8000 a výše. Po spuštění se objeví uživatelské rozhraní. A.2 Otevření projektu v Microsoft Visual Studio 2008 1. Nainstalujeme CUDA toolkit z http://developer.nvidia.com/ 2. Nainstalujeme developer driver pro grafickou kartu z http://developer.nvidia.com/ 3. Nainstalujeme CUDA VS WIZARD z přiloženého DVD 4. Otevřeme projekt flowFramework.sln z DVD A.3 Uživatelské rozhraní Na obrázcích 48 a 49 je vidět uživatelské rozhraní s popisem a se základním nastavením parametrů. Na obrázku 48 je inicializace. Hodnoty rozlišení stoupají po 16, kvůli implementaci na GPU. Po kliknutí na tlačítko Inicialize se scéna inicializuje (toto tlačítko slouží i jako restart). Pokud zvolíme ukládání scény do bufferu, tak po spočítání daného počtu snímků se začnou přehrávat spočítané snímky s rychlostí 30 snímků za sekundu. Obrázek 47: Popis uživatelského rozhraní 1 65 Obrázek 48: Popis uživatelského rozhraní 2 Na obrázku 49 jsou popsány parametry, které je možno měnit při simulaci. Ztráty značí vynásobení patřičného pole (teplota, hustota, rychlost) konstantou, což simuluje jevy jako je tření. Další parametry jsou vysvětleny v tabulce 7. Tlačítkem start se spustí simulace, tlačítkem stop se zastaví a tlačítko quit ukončí program. 66 A.4 Parametry uživatelského rozhraní Parametry a jejich vysvětlení je v následující tabulce. Jméno Grid resolution DSM resolution LM resolution scenario FrameBuffer Frames Camera pos Camera dir Camera angle Light pos lightOn/Off scatterOn/Off diffusion vortricity Jacobi iterations Advection scheme noise Losses dsm_error step ray-marching step dsmmarching Molar Masses Hodnota int>0 int>0 int>0 int>0 a <6 bool int>0 float float float float bool bool float>0 a <1 float int>0 bool bool float<=1 a >0 float>0 float>0 Výchozí 4x4x4 16x16x4 4x4x4 1 false 120 161,41,41 -1,0,0 60 121,201,41 true false 0 0.25 40 McCormack false 0.98,1,0.98 0.01 0.5 Význam Rozlišení mřížky Velikost stínové mapy Velikost světelné mapy Výběr scénáře Zapíná ukládání do buferu. Počet snímků v bufferu Pozice kamery Směr pohledu kamery Úhel pohledu kamery Pozice světla Zapíná světlo Zapíná přisvícení mnohonásobným rozptylem Velikost difuze Velikost víření Počet Jacobiho iterací Advekční schéma Zapíná šum Ztráty v každém kroku Maximální chyba ve stínových mapách Velikost kroku v ray-marchingu float>0 float 0.5 Velikost kroku ve stínových mapách 0.02,0.01.. Molární hmotnosti plynů Tabulka 7: parametry uživatelského rozhraní a jejich význam A.5 Scény v našem systému a jejich vlastnosti V aplikaci je připraveno 5 testovacích scén. Všechny scény jsou škálovatelné. To znamená, že pro větší velikost mřížky obsahuje scéna větší objekty a více reaktantů. Exploze o Na začátku se přidají dva plyny, které explodují o Reakce (rychlost 0.075, divergence -20, teplota 2000) Jednoduchá reakce dvou plynů o V každém kroku se nastaví hustota plynů v místě vzniku (plyn A dole a plyn B nahoře) na hodnotu 0.11 o Plyn A má teplotu 40 o Reakce (rychlost 0.05, divergence 30, teplota 1000) 67 Scéna s komplexní geometrií o Na začátku je dole v rohu kostka s plynem F o V každém kroku se nastaví hustota plynů v místě vzniku (nad nádobkou a na dně nádobky) na hodnotu 0.11 o Reakce (rychlost 0.025, divergence -25, teplota 0) o Reakce (rychlost 0.025, divergence -250, teplota 0) Scéna s kahanem o Na začátku jsou v nádobce dva plyny, které reagují až od určité teploty o V každém kroku se nastaví hustota plynů v místě vzniku (nad kahanem) na hodnotu 0.11 o Kahan zahřívá nádobu o Reakce (rychlost 0.1, divergence -35, teplota 250) Simulace kouře 68 B Obsah přiloženého DVD [Text] – Adresář s textem diplomové práce [exe] – Adresář s přeloženou verzí pod Windows v Microsoft Visual Studiu 2008 [examples] – Vygenerované obrázky a videa [source] – Zdrojové kódy Readme.txt – Textový soubor popisující význam jednotlivých souborů a adresářů na DVD, popis nahrání a spuštění programu. 69
Podobné dokumenty
O společnosti a všeobecné informace
objemu spotřebovaného paliva. Zvýšené objemy především přepravované biomasy
se snaží společnost přepravovat stále více železniční dopravou tak, aby celý cyklus
od samotné výroby biomasy až po její ...
Plánování pohybu technikami RRT
V řı́jnu 1998 vydal Steven M. LaValle článek o plánovacı́ technice RRT (Rapidlyexploring Random Tree) [8], která ihned vzbudila zájem odborné komunity. Technika
RRT je v článku představen...
Text práce ve formátu PDF
ještě zvednou. Například Austrálie si podle této dohody může dovolit zvýšit produkci
skleníkových plynů o celých 8%. Evropská unie včetně ČR musí udělat pravý opak. Můžete si
všimnout, že EU je v n...
2. Vizualizace grafů
jednoduchým způsobem zjistit ohodnocení funkce, viz kapitola 2.2.
Svou bakalářskou práci jsem rozdělil do pěti kapitol. V první
kapitole se zaměřuji na nejdůležitější pojmy úzce související s touto...
diplomová práce
nebyl plně vytížen hardware pro práci s vrcholy. Unifikovaná architektura
znamená, že jednotlivé procesory mohou být využívány jak pro zpracování
vrcholů, tak i fragmentů. Takový návrh je výhodnějš...
7. Dosažené výsledky - DCGI - České vysoké učení technické v Praze
České vysoké učení technické v Praze
Fakulta elektrotechnická