40
Teksturowanie proceduralne przy pomocy języka funkcyjnego Michał Radziszewski http://student.agh.edu.pl/~mradzisz/ czerwiec 2007

Teksturowanie proceduralne przy pomocy języka funkcyjnego

Embed Size (px)

Citation preview

Page 1: Teksturowanie proceduralne przy pomocy języka funkcyjnego

Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

czerwiec 2007

Page 2: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 3: Teksturowanie proceduralne przy pomocy języka funkcyjnego

Plan prezentacji – c.d.

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

Page 4: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 5: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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”

Page 6: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 7: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 8: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 9: Teksturowanie proceduralne przy pomocy języka funkcyjnego

Ś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

Page 10: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 11: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 12: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 13: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 14: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 15: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 16: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 17: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 18: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 19: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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ł = ?

Page 20: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 21: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 22: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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ą

Page 23: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 24: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 25: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 26: Teksturowanie proceduralne przy pomocy języka funkcyjnego

Zaawansowane funkcje tekstur

Page 27: Teksturowanie proceduralne przy pomocy języka funkcyjnego

Zaawansowane funkcje tekstur – c.d.

Page 28: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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)

Page 29: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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)]

Page 30: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 31: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

))}

Page 32: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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])

)}

Page 33: Teksturowanie proceduralne przy pomocy języka funkcyjnego

Przykłady i wyniki – c.d.

Page 34: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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)

)}

Page 35: Teksturowanie proceduralne przy pomocy języka funkcyjnego

Przykłady i wyniki – c.d.

Page 36: Teksturowanie proceduralne przy pomocy języka funkcyjnego

Przykłady i wyniki – c.d.

Page 37: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 38: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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

Page 39: Teksturowanie proceduralne przy pomocy języka funkcyjnego

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.

Page 40: Teksturowanie proceduralne przy pomocy języka funkcyjnego

Dziękuję za uwagę

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