hwadvlight.odp

Download Report

Transcript hwadvlight.odp

Pokročilé osvětlovací
techniky
© 2005 Josef Pelikán, MFF UK Praha
http://cgg.ms.mff.cuni.cz/~pepca/
[email protected]
Obsah
nefotorealistické techniky
hrubé tónování
kreslení obrysů („siluety“)
složitější lokální modely osvětlení
reprezentace BRDF („Lafortune's lobes“)
„subsurface scattering“
„displacement mapping“
difusní mapy okolí („accessibility maps“)
výpočet koncentrace světla („caustics“)
Nefotorealistické zobrazování
(„NPR“)
cílem je výsledek podobný „lidské grafice“
výrazné kontury
napodobení perokresby (šrafování apod.)
napodobení různých malířských technik (olej, akvarel)
stínování ve stylu kreslených filmů („cartoons“)
přístupy (techniky realizace):
speciální použití textur („hrubé tóny osvětlení“), …
procedurání textury („fragment shader“)
„postprocessing“ (zvláštní malířské techniky)
+ kombinace
Příklady NPR
Siluety, kontury, obrysy
(„silhouettes“)
pro lidský zrak jsou „kontury“ velmi důležité
rozhraní mezi přivrácenou a odvrácenou částí tělesa
navazují na ně často šrafovací soustavy (pro
zdůraznění křivosti, sklonu povrchu – nebo jen jako
náhrada stínování)
čistě geometrická informace (je-li těleso regulárním
mnohostěnem)
metody určování kontur:
hrany mezi přivrácenými a odvrácenými stěnami
nespojitosti v hloubkovém bufferu („postprocess.“)
nespojitosti (hrany) v jiných výstupních datech
Jednoduché kreslení kontur
není potřeba explicitně hledat obrysové hrany
kreslená tělesa musí být regulární (uzavřená)
dvě fáze kresení
1. nakreslí se přivrácené stěny těles
stěny se vybarvují, hrany se nijak nezvýrazňují
viditelnost se určuje „depth-bufferem“
viz „glEnable( GL_CULL_FACE ) “, „glCullFace() “
2. nakreslí se pouze hrany odvrácených stěn
je třeba nastavit větší tloušťku čáry
(„glLineWidth() “) – čáry budou vyčnívat za obrysem
Kreslení obrysu tělesa
obrysem zde rozumíme hrany, ve kterých obraz
tělesa sousedí s obrazem pozadí
několik podobných technik, využívá se šablona („stencil“)
1. do šablony se nakreslí hrany tělesa (stačí odvrác.)
buď se nastaví větší tloušťka čáry („glLineWidth() “)
nebo se kreslení opakuje několikrát s různým malým
posunutím 2D souřadnic
nezapisuje se do „depth-bufferu“!
2. nakreslí se stěny tělesa
viditelnost (zápis do „depth-bufferu“), nulování šablony
3. šablona se obkreslí černou barvou (vnější obrys)
Výpočet „kontur“ metodami DIP
následné zpracování („postprocessing“) normálně
nakresleného obrazu 3D scény
základem je hloubková mapa („depth buffer“),
normálová mapa („normal map“) nebo kombinace..
osvědčil se omezený Sobelův filtr (pouze 2 kolmé
směry):

1
Sh = 2
1
0
0
0
−1
−2
−1

Edge ≈

1
Sv = 0
−1
H
2
V
2
2
0
−2
1
0
−1

Hrany podle hloubky a normály
nespojitost
hloubky
nespojitost
normály
Stínování ve stylu kreslených filmů
výpočet světelného modelu je velmi podobný
„Blinn-Phongovým“ vzorcům
1.0
základem je difusní člen „cos α“
a případně i lesklý člen „cosh β“
0.7
difusní člen indexuje jednoduchou
několikastupňovou texturu („ramp“)
jen dva nebo tři barevné odstíny
bez filtrace textury (ostré přechody)!
0.3
nepovinný lesklý člen má přednost
0.0
je-li větší než práh, nakreslí se (např.) bílá barva
Složitější BRDF (lokální funkce
odrazu)
1977: Lafortune navrhuje výpočetně efektivní
reprezentaci funkce odrazivosti za pomoci tzv. „lobes“
základem je člen aritmeticky podobný „cosn β“
„lobe“ (lalok) „s(i,o)“
směr laloku je dán dopadajícím a odraženým směrem,
modifikuje se vektorem „C“
pracujeme v tečném prostoru souřadnic [t,n,b] !
exponent „n“ určuje šířku laloku
f  i   o =  d ∑ j  s , j⋅s j i , o 
s i , o  =  C t i ,t o ,t C n  i , n o ,n C b i ,b  o , b 
n
Různé orientace „laloku“
Ct = Cb = -1, Cn = 1
obvyklý Phongův lalok (otočení o 180° v půdorysu)
Ct = C b
izotropické BRDF (nezáleží na orientaci povrchu … na
směru tečny)
|Cn| < |Ct|
nezrcadlové maximum odrazu (blíž k tečně)
Ct > 0, Cb > 0
zpětný odraz (viz model „Oren-Nayar“)
sign( Ct ) ≠ sign( Cb )
neizotropický odraz (tahy štětce, jemné drážky, brus)
Implementace
faktory odrazivosti („albedo“) ρ jsou trojice [R,G,B]
pro každý člen se ukládají zvlášť (jedna barevná textura)
čtyři parametry laloku [ Ct, Cn, Cb, n ] se dají uložit
do jedné textury
jeden až tři laloky obvykle stačí k reprezentaci velmi
realistické BRDF
osvětlení podle obrazu okolí („environment map“)
okolí můžeme předem rozmazat několika diskrétními
exponenty, např. n = 0, 1, 4, 16, 64 a 256
uložení do různých LoD v MIP-mapě nebo do 3D textury
Rozptyl světla pod povrchem
velmi důležitý „foto-realistický“ faktor
kůže člověka apod. (viz filmy „Shrek 2“, „Finding Nemo“)
jiné průsvitné materiály (mramor, jantar, vosk,
keramika, …)
přesná implementace je obtížná (složitá fyzika i
geometrie)
několik zjednodušených přístupů:
„wrap lighting“ – světlo se šíří i trochu „za roh“
simulace absorpce hloubkovou mapou
výpočet absorpce v tečném (texturovém) prostoru
„Wrap lighting“
jednoduchá metoda
nebere ohled na tvar a tloušťku tělesa
nesnaží se počítat difusi světla
upravuje difusní člen „cos α“ – rozšiřuje jeho vliv i
na neosvětlené partie tělesa (za „terminátorem“)
obyčejná lineární transformace skalárního součinu
lze přidat odlišné zabarvení přechodu (např. do
červena u kůže)

cos wrap
Diff = max 0,
1 wrap

1
wrap
1
Tloušťka průsvitného tělesa
pomocí HW implementované hloubkové mapy
1. spočítá se hloubková mapa z pohledu zdroje světla
2. při vlastním kreslení znám lineární hloubku tělesa
v daném fragmentu
podle hloubky se určí množství světla procházející
objektem
tato závislost se může uložit do 1D textury
−⋅dist
Scatter = C light ⋅ e
1
0
dist
Hloubková mapa
zdroj
2. běžný obraz
1. hloubková
mapa
dist
Práce v texturovém prostoru
v prvním průchodu se spočítá primární osvětlení, ale
výsledek se zapíše do texturového prostoru [ s, t ]
primární souřadnice musí připravit vertex program
(transformuje je do NDS = [ -1, 1 ]2 )
nutnost dobré parametrizace povrchu tělesa !
pro výpočet osvětlení apod. se musí fragment programu
předávat i normální 3D souřadnice
další průchod[y] – zpracování světelné mapy
metodami DIP (rozmazání pro podpovrch. rozptyl světla)
poslední průchod (zobrazení) již pracuje
s obyčejnými 3D souřadnicemi
obarvení povrchu tělesa světelnou mapou
Prostor textury
2. zpracování
světelné mapy
t
1. rozvinutí povrchu tělesa
s
„Displacement mapping“
koncepci zavedl v r. 1989 Ken Perlin
(„hypertextures“, zobrazování: „ray marching“)
poloha bodu na povrchu tělesa je modulována funkcí
vzdálenosti („displacement function“)
skutečná modifikace polohy bodu (srovn. „bump map“)
výpočet polohy fragmentu je založen na myšlence
„sphere tracing“ (Hart 1996) – původně pro
implicitní plochy (známe vzdálenost bodu od tělesa)
Implementace: „distance map“
sledování paprsku probíhá v texturových souřadnicích
3D tečný prostor s jednotkou velikosti = 1 texel
inicializace: výpočet směrového vektoru („dir “)
„distance map“: každému bodu v okolí přiřadí
vzdálenost k nejbližšímu bodu plochy („R3  R“)
výpočet předem (Danielsson 1980 – čas O(n) )
float3 dir = normalize( in.tanEyeVec );
float3 texCoord = in.texCoord;
for ( int i = 0; i < NUM_ITERATIONS; i++ )
{
float dist = f1tex3D( distanceTex, texCoord );
texCoord += dist * dir;
}
Závěrečné vyhodnocení
po provedení N kroků iterace máme výsledek:
paprsek narazil na povrch tělesa (je třeba dopočítat
normálový vektor, osvětlení, apod.)
nebo paprsek těleso minul (lze vrátit zcela průhledný
fragment? – asi jen poblíž obrysu tělesa..)
- kvůli této variantě je lepší přesné těleso „zabalit“ do „větší“
GPU geometrie
N
...
Lepší aproximace difusního světla
konstantní „ambient“ člen není dost dobrý
nezohledňuje zastínění daného bodu okolím (ani
vlastním objektem)
prohlubně na povrchu jsou stejně jasné jako „výčnělky“
předem se dá spočítat, kolik okolního světla
průměrně do daného bodu dopadá...
Předzpracování: „světelná
přístupnost“
pro každý bod na povrchu tělesa spočítám předem:
kolik procent paprsků z okolí na něj může dopadnout
(tj. není zastíněno jinými částmi vlastního tělesa)
dominantní směr, odkud je bod osvětlován (odkud je
„nejlépe vidět“) – vektor „B“
technika: např. Ray-tracing nebo speciální GPU výpočet
23%
B1
B2
100%
Použití „mapy přístupnosti“
využití koeficientu přístupnosti:
multiplikativní faktor okolního světla („ambient term“)
mohu použít místo statické konstanty „kA“
využití dominantního vektoru „B“:
z předem spočítané světelné mapy okolí
(„environment light map“) vyberu „směrovou“ vstupní
složku pro difusní osvětlení
- světelná mapa je předem rozmazána faktorem „cos α“
data z textury ještě vynásobím koeficientem
přístupnosti
Koncentrace světla („kaustiky“)
tyto efekty vznikají lomem nebo odrazem světla na
zakřiveném povrchu (viz optika, čočky)
vodní hladina, sklenička s nápojem, konkávní lesklý
předmět, …
přesný výpočet je časově náročný
přímé („light tracing“) nebo zpětné („Monte-Carlo ray
tracing“) sledování paprsku
v omezených podmínkách se kaustické plochy dají
počítat na GPU
geometricky jednoduchá plocha přijímající kaustiku
(např. rovina)
Transformace trojúhelníků
každý vrchol souvislé trojúhelníkové sítě se
transformuje podle optických zákonitostí (odraz / lom)
trojúhelníky se rasterizují na ploše příjemce
(jednoduchá geometrie!)
je třeba zajistit různou optickou hustotu jednotlivých
trojúhelníků (roztažené jsou řidší a naopak)
V1
V2
V3
V4
V5
Kreslení kaustiky
optická hustota záleží na druhé derivaci zdrojové
plochy („křivost“)
vertex program může křivost spočítat a propagovat ji do
fragmentů
fragmenty podle ní určí svoji neprůhlednost („opacity“)
výsledek kaustic. efektu se kreslí do světelné textury
světelná textura se při běžném zobrazování mapuje na
plochu příjemce (2D nebo projektivní mapování)
moderní HW s „vertex mapami“:
až fragmenty mohou generovat zalomené paprsky
polotovar se nakreslí pomocí „point sprites“ / trojúhel. sítí
Transformace fragmentů
fragment spočítá svůj zalomený / odražený paprsek
výsledek (bod dopadu na ploše příjemce) zapíše do
výstupní textury
tato textura je zdrojem geometrických dat pro další
průchod („vertex texture“)
F1
F 20
F 45
F 63
F 82
1. fragment
projection
2. point sprites (triangle mesh)
Literatura
Tomas Akenine-Möller, Eric Haines: Real-time
rendering, 2nd edition, A K Peters, 2002, ISBN:
1568811829
ed. Randima Fernando: GPU Gems, AddisonWesley, 2004, ISBN: 0321228324
ed. Matt Pharr: GPU Gems 2, Addison-Wesley,
2005, ISBN: 0321335597