Teksturowanie proceduralne przy pomocy języka funkcyjnego

Post on 11-Jan-2017

222 views 4 download

Transcript of Teksturowanie proceduralne przy pomocy języka funkcyjnego

Teksturowanie proceduralne przy pomocy języka funkcyjnego

Michał Radziszewskihttp://student.agh.edu.pl/~mradzisz/

czerwiec 2007

Plan prezentacji

Teksturowanie zwykłe i proceduralneRendering w czasie rzeczywistym a rendering off-lineTeksturowanie a cieniowanie (shading)Języki cieniowaniaJęzyki funkcyjneProjekt funkcyjnego języka teksturowania

Plan prezentacji – c.d.

Gramatyka funkcyjnego języka teksturowaniaBiblioteka standardowa, operatoryTworzenie rozszerzeńPrzykłady i wynikiImplementacja interpreteraMożliwe udoskonalenia

Teksturowanie obiektów 3DZnacznie podnosi jakość wygenerowanej grafikiW przypadku użycia plików z obrazami (mapami) 2D powoduje duże zapotrzebowanie na pamięćMożliwość teksturowania z użyciem skompresowanych map

Teksturowanie proceduralne

Zastosowanie programu do utworzenia teksturProgram wykonywany jest w trakcie renderinguNiemal brak zużycia pamięciWymagana duża moc obliczeniowa“Texturing and Modeling: a procedural approach”

Zalety i ograniczenia teksturowania proceduralnego

Możliwość efektywnej kontroli nad parametrami teksturyDuża ilość szczegółówOlbrzymia różnorodność scenNie zawsze łatwo da się zastosować

np. twarz człowiekaściana z obrazem

Rendering w czasie rzeczywistym vs. rendering off-line

Płynna animacja – minimum 30 klatek/sco można zrobić w 1/30 sekundy?niestety nie jest możliwa symulacja oświetlenia zgodnego z prawami fizyki

Wymagana wysoka jakość obrazówile czasu potrzeba na poprawne oświetlenie sceny?obecnie od kilku minut do kilku(nastu) godzin

Rendering w czasie rzeczywistym vs. rendering off-line – c.d.

Oświetlenie lokalne, malowanie trójkątówkonieczność teselacji scenyw czasie malowania danej figury brak informacji o reszcie sceny

Oświetlenie globalneśledzenie promieni albo bilans energetycznyuwzględnienie odbić wielokrotnychużycie informacji o całej scenie

Algorytm decyduje o języku teksturowania

Śledzenie promieni

Prezentowany język zoptymalizowany pod katem współpracy z ww. algorytmemPromienie transportują światłoPrzecięcia promieni z obiektami scenyLosowe odbicia promieni od obiektów z zadanym rozkładem prawdopodobieństwaObraz powstaje poprzez uśrednienie mocy wielu promieni

Śledzenie promieni vs. malowanie trójkątów

Teksturowanie a cieniowanie

Teksturowanie – obliczanie koloru, faktury, chropowatości, przeźroczystości itd. powierzchni w danym punkcieCieniowanie – teksturowanie + oświetlenie danego punktu powierzchni, obliczenie ostatecznego koloru piksela na ekranieZewnętrzne języki teksturowania /cieniowania operują na danych lokalnych

Teksturowanie a cieniowanie – c.d.

Cieniowanie przy pomocy języka cieniowania możliwe jest tylko przy uproszczonym oświetleniu lokalnymPrzy oświetleniu globalnym możliwe jest jedynie teksturowanie, a oświetlenie jest ściśle zdefiniowane prawami fizyki i jest juz zapewnione przez wybrany algorytmWobec tego prezentowany tutaj język celowonie pozwala na obliczanie oświetlenia

Języki cieniowania

Wykorzystują lokalny model oświetleniaPopularne ze względu na rozwój przemysłu gier komputerowychKompilowane do kodu maszynowego karty graficznejObliczają ostateczny kolor pikseli ekranuPopularnym przykładem jest Cg NVIDII

Języki funkcyjne

Program konstruowany jest z wywołań i deklaracji funkcjiBrak instrukcji przypisaniaBrak obiektów zachowujących określony stanBrak pętli, zamiast nich jest rekurencjaPrzykład:

silnia(n): cond(n>1, n*silnia(n-1), 1)Bliższe notacji matematycznej

Język funkcyjny a teksturowanie

Nowe zastosowanie języków funkcyjnychWłasności powierzchni widziane jako funkcja położenia, normalnej, czasu, etc.Umożliwia zarówno teksturowanie proceduralne, użycie standardowych obrazów 2D z zewnętrznych plików, a także podejście hybrydowe

Wymagania wobec funkcyjnego języka teksturowania

Musi być obliczeniowo zupełny (języki kompilowane do kodu karty graficznej nie spełniają tego wymagania) Współpracować z algorytmem śledzenia promieniUmożliwiać tworzenie rozszerzeńUmożliwiać łatwe pisanie skryptów

Projekt języka

Podział elementów na trzy kategoriemateriały, mapy nierówności, źródła światłaźródła kolorów, źródła wartości skalarnych, tablicestałe – całkowitoliczbowe i łańcuchowe

Podział ten znacznie ogranicza liczbę funkcji w bibliotece standardowej i rozszerza możliwości języka

Projekt języka – c.d.

Materiały, mapy nierówności, źródła światłatylko one mogą być dołączane do powierzchniokreślają powierzchnie jako np. matowe, półprzeźroczyste, chropowate itd.określenie jest niekompletne, wymagają podania źródła koloru / skalaru w celu uzupełnieniasą zbiorami procedur; nie umożliwiają wyliczenia pojedynczej wartości; funkcja odpowiadająca materiałowi zwraca materiał (obiekt), a nie wyliczoną wartość w teksturowanym punkcie

Projekt języka – c.d.

źródła kolorów, skalarów, tabliceuzupełniają definicje materiałówwyliczane do odpowiednio: liczby rzeczywistej, funkcji opisującej widmo albo tablicy ww. wartościelementy tylko i wyłącznie z tej kategorii mogą byćargumentami bądź wartościami zwracanymi przez funkcje rekurencyjnetylko te elementy mogą być argumentami operatorów

materiał * materiał = ?

Projekt języka – c.d.

stałe – całkowitoliczbowe i łańcuchowestałe całkowitoliczbowe są używane podobnie jak #define w cstałe łańcuchowe są zwykle używane do określania nazw plików z teksturamijęzyk nie posiada operacji na łańcuchach znaków, łańcuchy mogą być tylko stałymi, nie mogą byćzwracane przez funkcjenie są one potrzebne, gdyż projektowany język jest przeznaczony do obliczeń numerycznych

Funkcje

Są podstawą języka funkcyjnegoKażdy element jest albo stałą albo funkcjąFunkcje mogą być zdefiniowane w standardowej bibliotece, w rozszerzeniach biblioteki albo w skrypcieFunkcje można wywoływać przekazując parametry w kolejności zapisu albo według nazw

Gramatyka

Maksymalnie uproszczonaSkrypt składa się tylko i wyłącznie z definicji funkcjiDefinicje funkcji mogą zawierać definicje zagnieżdżoneFunkcje pobierają dowolna ilość argumentówFunkcja musi zawierać wyłącznie 1 wyraże-nie, będące jedyną wartością zwracaną

Biblioteka standardowa

Zawiera często używane funkcje niezbędne do utworzenia skryptuPodejście z bardzo uproszczonym rdzeniem języka i bogatą biblioteką standardowąW bibliotece znajdują się materiały oraz źródła kolorów i wartości skalarnych

Biblioteka standardowa – c.d.

Materiały:matowy, lustrzany, połyskliwy, załamującymateriały złożone

Źródła kolorów/skalarów, tablicealpha blendingfunkcje warunkowe i logicznefunkcje arytmetycznefunkcje wektorowe – normy, sumy, iloczyny, …konwersje kolor <-> skalar

Biblioteka standardowa – c.d.

Źródła kolorów/skalarów, tablicekonwersja RGB -> kolorzjawiska fizyczne

ciało doskonale czarneodbicie Fresnela

teksturowanie obrazami 2D – wartość tekstury w punkcie, rozmycie, gradientszumy Perlina – funkcje podstawowe, marmur, drewno, chmury

Zaawansowane funkcje tekstur

Zaawansowane funkcje tekstur – c.d.

Dostęp do zmiennych aplikacji

Dostęp do parametrów teksturowanego punktu

analogiczny do semantyk wejściowych z Cg$P, $N, $T, $UV, $x, $y, $z, $t, $u, $v

Dostęp do dodatkowych (nazwanych) zmiennych aplikacji

analogiczny do zmiennych uniform z Cgfunkcja get_host_variable(const stringname)

OperatoryZdefiniowane tylko dla źródeł kolorów, skalarów i tablic, przeciążoneLogiczne i relacyjne:and, nand, or, xor, not, <, <=, >, >=, =, !=

Arytmetyczne: +, -, *, /, ^Tablicowe

tworzenie – [f($u), 0.5, 1.0]wariacja – [0.7,0.5,-4]{0,1,1},wariacja 2 – [0.7,0.5,-4]\{1}adresowanie – g($v)[h($P)]

Tworzenie rozszerzeń

Umożliwia tworzenie całkiem nowych materiałówUmieszczenie często używanych funkcji w dodatkowej bibliotece DLL, kompilowanej z optymalizacjami na dany procesorImport funkcji w skrypcie

deklaracja funkcji importowanej@library ”libname”:”classname” zamiast ciała funkcji

Przykłady i wyniki

color main {return blend(

blend(color([0.2 0.6]), color([0.6 0.2]),noise(addr=8.0*$uv+16.0)*0.333+0.5),

color([0.95 0.9]),marble(addr=12.0*$uv, layers=[0.375, 0.375],

amplitude=1.0, roughness=0.25, bright_dark=0.5,c_octaves=6

))*blend(

blend(color([0.2 0.4]), color([0.5 0.2]),noise(addr=8.0*$uv+48.0)*0.333+0.5),

blend(color([0.95 0.9]), color([1.0 0.7 0.2 0.1]),noise(addr=8.0*$uv+128)*0.333+0.5),

marble(addr=12.0*$uv+4.0, layers=[0.375, 0.375],amplitude=0.75, roughness=0.375, bright_dark=0.375,c_octaves=6

))}

Przykłady i wyniki – c.d.

color main {return tex(

name="testimg.bmp", mode=#iaddr_clamp, addr=$uv

)^(1+4*tex_mono(name="testimg.bmp", mode=#iaddr_clamp,addr=$uv, blur=[0.015,0.015])

)}

Przykłady i wyniki – c.d.

Przykłady i wyniki – c.d.

color main {return blend(cs=[color([0.2 0.6])

color([0.2 0.6 0.1])color([0.7 0.2 0.1])color([0.1 0.2 0.7 0.4])color([0.1 0.1 0.3 0.7])color([0.9 0.65])]

alpha = 2^(-mandelbrot(addr=$uv*[3,2]-[2.0,1.0]))

)}

scalar mandelbrot(scalar[] addr){return norm_l2(mdb_rec(x=[0, 0, 0], addr=addr){0, 1})

}

scalar[] mdb_rec(scalar[] x, addr){return cond(sqr(sqr(x[0])-sqr(x[1])+addr[0])+sqr(2*x[0]*x[1] + addr[1]) > 4or x[2]>24,x,mdb_rec(x=[

sqr(x[0])-sqr(x[1])+addr[0],2*x[0]*x[1] + addr[1], x[2]+1

], addr=addr)

)}

Przykłady i wyniki – c.d.

Przykłady i wyniki – c.d.

Implementacja interpretera

Parser wykonany ręcznie (bardzo prosta gramatyka), metoda zejść rekurencyjnychJeżeli skrypt nie zawiera funkcji rekurencyjnych, to na jego podstawie jest budowane drzewo wywołań funkcji wirtualnychPrzy rekurencji interpreter używa obiektów tworzących ramki stosu i jawnie alokujących pamięć na zmienne automatyczne

Przyszłe udoskonalenia

Obsługa macierzy – nowy typ danych, nowe funkcje w bibliotece standardowej, dodatkowe przeciążenie operatorów – łatwe, do wykonania w najbliższej przyszłościKompilacja, np. do kodu FPU x86 zamiast sklejania wywołań funkcji wirtualnych –kompilacja z optymalizacją jest zadaniem bardzo trudnym

Literatura

Ebert, D. S., Musgrave, F. K., Peachey, D., Perlin, K., Worley, S.: Texturing and Modeling: A Procedural Approach, 3rd edition. Morgan Kaufmann 2003.Fernando, R., Kilgard, M. J.: Język Cg. Programowanie grafiki w czasie rzeczywistym. Helion 2003.Pixar: The RenderMan Interface. Pixar 2005.

Dziękuję za uwagę

Dodatkowe materiały związane z publikacjąmożna znaleźć na stronie http://student.agh.edu.pl/~mradzisz/