Pokročilé osvětlovací techniky © 2005 Josef Pelikán, MFF UK Praha
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)
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): Výpočet „kontur“ metodami DIP
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 základem je difusní člen „ cos α “ a případně i lesklý člen „ cos h β “ difusní člen indexuje jednoduchou několikastupňovou texturu („ramp“) jen dva nebo tři barevné odstíny bez filtrace textury (ostré přechody)! nepovinný lesklý člen má přednost 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ý „ cos n β “ „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
Různé orientace „laloku“ C t = C b = -1, C n = 1 obvyklý Phongův lalok (otočení o 180° v půdorysu) C t = C b izotropické BRDF (nezáleží na orientaci povrchu … na směru tečny) |C n | < |C t | nezrcadlové maximum odrazu (blíž k tečně) C t > 0, C b > 0 zpětný odraz (viz model „Oren-Nayar“) sign( C t ) ≠ sign( C b ) 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 [ C t, C n, C b, 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) 1 1 wrap
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 0 1 dist
Hloubková mapa zdroj 1. hloubková mapa 2. běžný obraz 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 1. rozvinutí povrchu tělesa s t
„Displacement mapping“ koncepci zavedl v r 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 („R 3 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 B1B1 B2B2 23% 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 „k A “ 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) V1V1 V2V2 V3V3 V4V4 V5V5
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“) F1F1 F 20 F 45 F 63 F point sprites (triangle mesh) 1. fragment projection
Literatura Tomas Akenine-Möller, Eric Haines: Real-time rendering, 2 nd edition, A K Peters, 2002, ISBN: ed. Randima Fernando: GPU Gems, Addison-Wesley, 2004, ISBN: ed. Matt Pharr: GPU Gems 2, Addison-Wesley, 2005, ISBN: