![Page 1: Teksturowanie proceduralne przy pomocy języka funkcyjnego](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/1.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/2.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/3.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/4.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/5.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/6.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/7.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/8.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/9.jpg)
Ś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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/10.jpg)
Śledzenie promieni vs. malowanie trójkątów
![Page 11: Teksturowanie proceduralne przy pomocy języka funkcyjnego](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/11.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/12.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/13.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/14.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/15.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/16.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/17.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/18.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/19.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/20.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/21.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/22.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/23.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/24.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/25.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/26.jpg)
Zaawansowane funkcje tekstur
![Page 27: Teksturowanie proceduralne przy pomocy języka funkcyjnego](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/27.jpg)
Zaawansowane funkcje tekstur – c.d.
![Page 28: Teksturowanie proceduralne przy pomocy języka funkcyjnego](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/28.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/29.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/30.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/31.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/32.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/33.jpg)
Przykłady i wyniki – c.d.
![Page 34: Teksturowanie proceduralne przy pomocy języka funkcyjnego](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/34.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/35.jpg)
Przykłady i wyniki – c.d.
![Page 36: Teksturowanie proceduralne przy pomocy języka funkcyjnego](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/36.jpg)
Przykłady i wyniki – c.d.
![Page 37: Teksturowanie proceduralne przy pomocy języka funkcyjnego](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/37.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/38.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/39.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022020213/58760b3a1a28abd8418b4d7b/html5/thumbnails/40.jpg)
Dziękuję za uwagę
Dodatkowe materiały związane z publikacjąmożna znaleźć na stronie http://student.agh.edu.pl/~mradzisz/