View
223
Download
4
Category
Preview:
Citation preview
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/
Recommended