You are on page 1of 15

X36RSO - Semestrálnı́ práce

Modelovánı́ a vizualizace blesků


Odborný poradce/zadavatel: Ing. Jaroslav Sloup

Tomáš BERGL
Obsah
1 Úvod 2
1.1 Zadánı́ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

2 Náplň práce semestru 2


2.1 Prvnı́ část - Rozptyl světla v atmosféře . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.2 Druhá část - Rozptyl světla v mracı́ch . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2.1 Splatting method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3 Práce do budoucna 5
3.1 Využitı́ SIMD, SSE instrukčnı́ch sad . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2 Počı́tat jen určité pixely, adaptivnı́ počı́tánı́ pixelů . . . . . . . . . . . . . . . . . . . . 5
3.3 Segmentový zdroj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.4 Předpočı́tánı́ pozic kamery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.5 Lightcuts - hierarchie světel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.6 Dalšı́ nápady a vylepšenı́ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

4 Datová struktury octree, princip LOD a jejich přı́nos 7


4.1 Princip LOD a tvorba otree mé aplikaci. . . . . . . . . . . . . . . . . . . . . . . . . . 7

5 Závěr 8

6 Obrázková přı́loha 10

1
1 Úvod
Tento dokument bych pojal jako report pracı́, které jsem za tento semestr dokázal dokončit. V prvnı́
části bych popsal co a jak jsem dělal a jaké problémy se při tom vyskytly, v dalšı́ch částech bych se
pak pokusil zhodnotit vývoj do budoucna a popsal bych zlepšenı́, které mě doposud napadly.

1.1 Zadánı́
Simulace a vizualizace přı́rodnı́ch jevů patřı́ mezi nejdůležitějšı́ oblasti počı́tačové grafiky. Jednı́m ze
zajı́mavých přı́rodnı́ch jevů jsou blesky. Prostudujte dostupnou literaturu pojednávajı́cı́ o metodách
generovánı́ a zobrazovánı́ blesků. Na základě zı́skaných znalostı́ vytvořte interaktivnı́ aplikaci, která
umožnı́ generovat scény s různými typy a tvary blesků. Aplikace bude tyto scény také zobrazovat a
všechny objekty ve scéně budou osvětleny světlem, které vyzařujı́ blesky. Funkčnost aplikace demon-
strujte alespoň na třech různých scénách.

2 Náplň práce semestru

2.1 Prvnı́ část - Rozptyl světla v atmosféře


Prvnı́ čı́m jsem začal v tomto semestru bylo nastudovánı́ článků [2] a [3] (samozřejmě předtı́m bylo
nutné nastudovat mnoho dalšı́ch, ale tyto dva jsou pro tuto část práce klı́čové). Potřeboval jsem si
utřı́dit pořadı́, jak budu vytvářet aplikaci a domluvit se na harmonogramu se svým zadavatelem.
Prvnı́ problém, který jsem řešil, byl jak spočı́tat směrový vektor pro daný pixel obrazovky. Viz.
obrázek 1.

Obrázek 1: Systém kamery.

Napřed jsem si z natočenı́ kamery zjistil směr pohledu kamery. Ze směru pohledu kamery jsem
si spočı́tal bod uprostřed obrazovky a vektor směrujı́cı́ nahoru. Z vektorů nahoru a kamery jsem
spočı́tal vektor doprava. Nynı́ pomocı́ těchto vektorů (up a right) a bodu uprostřed obrazovky můžeme
spočı́tat směrový vektor pro libovolný pixel. Konkrétněji jsem si spočı́tal souřadnice levého dolnı́ho
rohu (pixelu) a deltaX, deltaY. To jest o kolik se musı́m posunout ve směru x resp. y, abych se
posunul na dalšı́ sloupec resp. řádek.
Dále jsem potřeboval zjistit vzorec pro fázovou funkci
(ta je nutná k výpočtu integrálu - rovnice 2). Použil jsem zjednodušený vzorec(rovnice 1) pro vzduch:

3
fair (θ) = (1 + cos2 θ)
16π

2
(1)

Chvı́li jsem se potrápil s vypočı́tánı́m integrálu pro výpočet osvětlenı́(rovnice 2).



2 2
Z T −u eρa κ( u +v +u−ueye )
Il (ueye , veye , λ) = √
ρa Fλ ( 2 ) du
ueye u + v2 u2 + v 2
(2)

Potřeboval jsem zjistit, jak má být velká tabulka, aby osvětlenı́ bylo realistické. Jak spočı́tat
numericky tento integrál...
Zvolil jsem tabulku jako Dobashi 128 x 128 o reálném rozměru 400m x 400m. Pro numerický
výpočet jsem zvolil lichoběžnı́kovou metodu. Až na konci semestru (při své prezentaci) jsem se
dozvěděl, že výzkumy této problematiky pokročilý a tento integrál lze spočı́tat analyticky.
Musel jsem nalézt či si domyslet následujı́cı́ parametry:

1. Hustotu částic %a - nalezl jsem na Dobashiho stránkách hodnotu 0.15

2. Extinction coefficient:
V článku[5] jsem nalezl tento vzorec pro jasný, suchý vzduch:

8π 3 (m2 − 1)2 3(2 + ∆)


σs = 4
3λ N 6 − 7∆
(3)

kde

• σs je scattering coeff., pro tento přı́pad stejný jako extinction coeff.


• ∆ je depolarizačnı́ faktor a má hodnotu 0.0350
• N je počet molekul na jednotku objemu, N = 2.547 x 1025 m−3
• m je refrakčnı́ index, m = 1.000276

3. Ik - intenzita bodového zdroje - prozatı́m jsem zvolil 185.

2.2 Druhá část - Rozptyl světla v mracı́ch


Nejprve jsem na implementoval 3D mřı́žku voxelů a nad nı́ strukturu octree. Octree se skládá z
jednotlivých metaballů, které majı́ ukazatele na své potomky - těch je max 8. Každý metaball v
octree má nějakého potomka s výjimkou nejnižšı́ch - odpovı́dajı́cı́m buňkám (voxelům) 3D mřı́žky.
Naprogramoval jsem metodu kreslenı́, která se rekurzivně volá skrz octree strom. Do každého voxelu
jsem umı́stil metaball - tj. billboard s texturou mraku.
Pro výpočet textury pro billboard jsem použil následujı́cı́ vzorec na obrázku 2.

Obrázek 2: Vzorec textury pro billboard.

3
Obrázek 3: Textura pro billboard.

Výsledek je na obrázku 3.
Naprogramoval jsem blending billboardů a natáčenı́ billboardů k pozici kamery.
Jedna z nejdůležitějšı́ch částı́, co jsem naimplementoval je tzv. ”Splatting method”:

2.2.1 Splatting method

Tato metoda se skládá ze dvou částı́:

1. Spočı́tánı́ intenzity světla, která dorazı́ k metaballu:


(a) Nastavı́me kameru do bodového zdroje
(b) Setřı́dı́me metabally - vzestupně od bodového zdroje
(c) Umı́stı́me na metabally billboardy
(d) Inicializujeme frame buffer na 1.0
(e) Promı́tneme billboardy do frame bufferu
(f) Uložı́me si stı́novou texturu
Ve středu každého metaballu ve frame bufferu bude útlum k tomuto metaballu.
2. Vyrenderovánı́ mraků z pohledu pozorovatele:
(a) Vyrenderujeme pozadı́
(b) Setřı́dı́me metabally - sestupně od pozorovatele
(c) Natočı́me billboardy k pozorovateli
(d) Promı́tneme billboardy do frame bufferu

Toto vše uděláme pro každý bodový zdroj na blesku (cca 50x) a pro každý bodový zdroj to
uděláme 6x - pro každou obrazovku virtuálnı́ krychle, do které umı́stı́me každý bodový zdroj.
Zprovoznil jsem tedy splatting metodu, ale na mých náhodně generovaných metaballech nedávala
dobré(pěkné) výsledky. Po konzultaci se zadavatelem jsem se rozhodl využı́t diplomové práce Michala
Poneše zabývajı́cı́ se renderovánı́m mraků. Vyskytlo se poměrně dost problémů s zprovozněnı́m této
práce (kombinace VS2005 a staršı́ch knihoven libci.lib ..). Nakonec jsem jeho práci přepsal (vy-
hodil vše závislé na starých knihovnách) a zprovoznil. Pochopil jsem a zpracoval buněčný automat
generujı́cı́ mraky a zapracoval ho do své práce.
Měl jsem tedy hotové osvětlenı́ mraků. Začal jsem pracovat principu LOD. Zde se ukázalo, že
kvalita obrázku a rychlost velice záležı́ na parametrech. Povedlo se mi myslı́m nalézt vhodnou kom-
binaci parametru a vygenerovat pěkné obrázky.

4
Zkombinoval jsem prvnı́ část práce (záře) s touto - umı́stil jsem na každý segment bodový zdroj
světla. To samozřejmě zpomalı́ výpočet počet-bodů krát. Pokud ovšem budeme předpokládat, že jsou
mraky po dobu osvětlenı́ bleskem neměnné můžeme osvětlenı́ spočı́tat pouze 1x.

3 Práce do budoucna
Během pracı́ mě napadlo několik zlepšenı́, které bych zde chtěl rozebrat. Také, když jsem zprávu
předváděl širšı́mu publiku, upozornili mě někteřı́ lidé na možné zlepšenı́.

3.1 Využitı́ SIMD, SSE instrukčnı́ch sad


Pro rychlost aplikace je kritické mı́sto vykreslovánı́ rozptylu v atmosféře (záře). Jelikož se provádı́
výpočty pro každý pixel, a to počet-zdrojů krát. Takže při rozlišenı́ 800 na 600 se provedou výpočty
24.000.000 krát. Jedná se o tyto výpočty:

//výpočet souřadnic do LookUp tabulky


//skalárnı́ součin
Upk = -dks[i] * (gks[i][0]*ep[0] + gks[i][1]*ep[1] + gks[i][2]*ep[2]);
//spočı́tánı́ vektoru
Vpk = sqrt(dk_2s[i] - Upk*Upk);
//dalšı́ výpočty (násobenı́, dělenı́)
//..
//bilinearnı́ interpolace

Proto si myslı́m, že pro tento přı́pad je ideálnı́ využı́t instrukčnı́ sady SSE. A počı́tat vektory
naráz. Tı́m by mohlo dojı́t k 4-násobnému zrychlenı́.
Přı́klad výpočtu násobenı́ dvou vektoru:

float vec[4]= {3,4,2} ,vec2[4] = {5,6,7};


__m128 j = _mm_load_ps(vec);
__m128 i = _mm_load_ps(vec2);

__m128 k = _mm_mul_ps(j,i);//sub,add,div,and...

3.2 Počı́tat jen určité pixely, adaptivnı́ počı́tánı́ pixelů


Dalšı́ možnostı́, jak urychlit výpočet, je počı́tat jen určité pixely (kritická část - zář) a dalšı́ dopočı́tat
interpolacı́. Můžeme využı́t toho, že ve většı́ vzdálenosti od bodového zdroje je intenzita malá a téměř
uniformnı́.
Problém ovšem nastává pro vı́ce bodových zdrojů náhodně umı́stěných, zde bychom asi měli
spočı́tat geometrický střed těchto bodů a ve velké vzdálenosti od něho bychom vzorkovali méně.
Dalšı́ možnost je spočı́tat záři pro 1 bodový zdroj, a pak vhodně pomocı́ glCopyPixels, čı́ pomocı́
vlastnı́ho kopı́rovánı́, přepisovat pole hodnot novými kopiemi záře od bodového zdroje s vhodně po-
sunutým středem podle aktuálnı́ho bodového zdroje. Zde by bylo nutné ještě vzı́t v úvahu vzdálenost
jednotlivých bodových zdrojů a podle toho spočı́tat útlum (ale pouze 1x).

5
3.3 Segmentový zdroj
Pro většı́ realističnost záře blesku bych nahradil bodové zdroje segmentovými. Ty bychom dostali
vhodných roztaženı́m bodového zdroje podél segmentu. Známe polohu bodového zdroje (uprostřed
segmentu) a polohu dvou krajnı́ch bodů segmentu, mohli bychom spočı́tat nataženı́ záře podél vektoru
definovaného rozdı́lem jednoho krajnı́ho bodu segmentu a bodového zdroje - tj. středu segmentu.
Otázkou je, zda bychom neubrali na fyzikálnı́ věrnosti.

3.4 Předpočı́tánı́ pozic kamery


Pro určitého polohy kamery v 3D světe a jejı́ natočenı́ bychom si mohli uložit záři. Problém je, že by
se jednalo o velké množstvı́ dat a nejsem si jistý, zda by to bylo pamět’ově únosné.

3.5 Lightcuts - hierarchie světel


Při prezentaci této práce mě Ing. J. Křivánek upozornil na zdejšı́ implementaci Lightcuts - hierarchie
světel. Ještě jsem nestihl tuto problematiku nastudovat, ale doufám, že by mohla urychlit právě tu
kritickou část této práce

• Bo Sun, SIGGRAPH 2005

• BRUCE WALKER - LIGHTCUTS, MULTIDIMENSIONAL LIGHTCUTS (SG 2005/2006)

3.6 Dalšı́ nápady a vylepšenı́


• Mı́sto počı́tánı́ natočenı́ billboardů použı́t glOrtho

• Pro většı́ realističnost mraků je ještě osvětlit měsı́cem.

• ..

6
4 Datová struktury octree, princip LOD a jejich přı́nos
V této sekci nejprve popı́šu aplikaci LOD v mé práci, a pak se pokusı́m popsat přı́nos - zrychlenı́,
kterého jsem dosáhl.

4.1 Princip LOD a tvorba otree mé aplikaci.


Mraky jsem reprezentoval jako 3D mřı́zku metaballů - voxelů. Těch ovšem může být obrovské
množstvı́ ( řádévě i tı́sı́ce), proto musı́me aplikovat princip LOD (Level of Detail), abychom snı́žı́li
počet metaballů, které budeme ”stı́novat”.
Světlo, které dosáhne metaballu:

Ik (α)e−τ (r)
Ikj (α) =
r2
(4)

kde

• Ik (α) je intenzita bodového zdroje na blesku.

• τ (r) je optická vzdálenost mraku

• r je vzdálenost mraku

Je vidět, že intenzita světla, které dosáhne metaballu, je úměrná kvadrátu vzdálenosti. Z toho
vyplývá, že intenzita je velmi malá ve vzdálených oblastech a téměř uniformnı́. Proto můžeme ve většı́
vzdálenosti aproximovat shluk menšı́ch metaballů většı́ma metaballama. Výběr správné metabally
(velikosti) záležı́ na vzdálenosti.
Postavı́me tedy nad 3D mřı́žkou strukturu octree - viz obrázek 4.

Obrázek 4: Struktura octree, metabally.

kde

• Nahradı́me 8 menšı́ch metabllů vetšı́

• většı́ má dvojnásobný průměr

• vetšı́ metaball (rodičovský) má průměr hustot z menšı́ch (dceřiných)

7
Výběr správného metaballu záležı́ na následujı́cı́ rovnici:

maxλ {Ik (λ)}


dVj < 
r2
(5)

kde

• Ik (α) je intenzita bodového zdroje na blesku.

• dVj je objem metaballu

• r je vzdálenost mraku

•  je uživatelem nastavitelná (! velice důkežitá) hodnota tolerance. Čı́m většı́, tı́m většı́ma mata-
ballama nahrazuji.

Algoritmus výpočtu osvětlenı́ tedy nynı́ vypada nějak takto:

1. Otestuj největšı́ metabally, zda vyhovujı́ podmı́nce (rovnice 5)

(a) Jestliže ne rekurzivně přejdi na potomky metaballu, který nevyhověl.

2. Pro každý metaball spočı́tej jeho hustotu jako průměr potomků

3. Pro každy bodový zdroj

(a) 6 krát (pro každou stranu virtualnı́ krychle umı́stěné na pozici bodového zdroje)
i. Seřad metabally podle vzdálenosti od bodového zdroje.
ii. Vyřad’ ty, které nejsou vidět.
iii. Aplikuj Splatting metodu na LOD metabally

4. Pro každou metaballu nastav svůj útlum potomkům.

5 Závěr
Myslı́m, že se mi nakonec povedlo naimplementovat tento semestr vše, co jsem si naplánoval. Základnı́
kostra aplikace je již hotová. Nynı́ mám ještě celý semestr na implementaci zlepšenı́ a optimalizaci
aplikace.

8
Reference
[1] Michálek, M.:
Modelovánı́ a vizualizace blesků.
Semestrálnı́ práce, 2004

[2] Y.Dobashi, T. Yamamoto , T.Nishita


Efficient Rendering of Lightning Taking into Account Scattering Effects due to
Clouds and Atmospheric Particles
Proc. Pacific Graphics 2001,pp. 390-399 (2001).

[3] Y.Dobashi, K.Kaneda, H.Yamashita, T.Okita, T.Nishita


A Simple, Efficient Method for Realistic Animation of Clouds
Proc. SIGGRAPH2000, 2000-7, pp. 19-28.

[4] Arcot J. Preetham


Modeling Skylight and Aerial Perspectiv
ATI Research.

[5] Jaroslav Sloup


A Survey of the Modelling and Rendering of the Earth’s Atmosphere
Department of Computer Science and Engineering, Faculty of Electrical Engineering, Czech
Technical University.

9
6 Obrázková přı́loha

Obrázek 5: 2 zdroje.

Obrázek 6: 2 zdroje.

10
Obrázek 7: Rozptyl v atmosféře.

11
Obrázek 8: Rozptyl v atmosféře.

12
Obrázek 9: Rozptyl v atmosféře a mracı́ch.

13
Obrázek 10: Rozptyl v atmosféře a mracı́ch.

Obrázek 11: Rozptyl v atmosféře a mracı́ch.

14