RENDERING W CZASIE RZECZYWISTYM Michał Radziszewski
Plan wykładu Modelowanie i teksturowanie proceduralne wprowadzenie Funkcje szumu Szum wielowymiarowy Technika simplex noise Funkcje szumu na GPU, funkcja noise() Tekstury z szumem Operacje na liczbach całkowitych Synteza widmowa
Plan wykładu c.d. Antyaliasing tekstur proceduralnych Pochodne i szerokość filtru w programie fragmentów Proceduralne tekstury wolumetryczne Marmur, drewno Tekstury komórkowe Synteza tekstur Losowe modyfikowanie pozycji wierzchołków Wprowadzenie nieregularności do modeli Modelowanie roślin (tzw. L-systemy)
Literatura K. Perlin, An Image Synthesizer, SIGGRAPH 1985 K. Perlin, Improving Noise, SIGGRAPH 2002 S. Gustavson, Simplex Noise Demystified, 2005 L. Wei, M. Levoy, Fast Texture Synthesis using Treestructured Vector Quantization, SIGGRAPH 2000 D. Ebert i inni, Texturing and Modeling: A Procedural Approach, 3 rd edition, Morgan Kaufmann 2003 P. Prusinkiewicz, A. Lindenmayer, The Algorithmic Beauty of Plants, Springer Verlag 2004
Modelowanie i teksturowanie proceduralne wprowadzenie Wykonanie programu określającego kolor teksela, normalną, pozycję wierzchołka, itp. W renderingu czasu rzeczywistego takie programy uruchamiane są na karcie graficznej Możliwe znaczne zwiększenie różnorodności sceny bez zwiększania zużycia pamięci Wprowadzenie niedoskonałości do modeli W grafice komputerowej modele często są idealnie równe, co nie wygląda naturalnie
Modelowanie i teksturowanie proceduralne wprowadzenie c.d. Zwykle modelowanie proceduralne znacznie bardziej obciążają GPU niż proste odczyty z tablic Brak automatycznego antyaliasingu tekstur proceduralnych Brak pełnej kontroli grafików nad modelami proceduralnymi, nie wszystkie tekstury mogą być nimi zastąpione Użycie zwykłych tekstur w połączeniu z modelami proceduralnymi
Modelowanie i teksturowanie proceduralne wprowadzenie c.d. Techniki te mają też wiele zastosowań w przetwarzaniu off-line Wyniki tego przetwarzania mogą być następnie renderowane przez kartę graficzną W zależności od czasu działania metody te mogą zostać zastosowane albo w trakcie produkcji aplikacji, albo w czasie jej działania, np. przy wczytywaniu sceny
Modelowanie i teksturowanie proceduralne wprowadzenie c.d.
Funkcje szumu Stanowią podstawę większości modeli proceduralnych Służą do kontrolowanego wprowadzenia losowości do modeli Szum nie może być w pełni losowy jego wartości muszą być powtarzalne Najczęściej generowany jest przez funkcję v = noise(x), gdzie v jest wartością szumu, a X jest wektorem
Funkcje szumu c.d. Funkcja zwraca wartości pseudolosowe dla argumentu X Dla każdego wywołania z takim samym argumentem X funkcja musi zwrócić taką samą wartość Funkcja rand() z C/C++ nie może zastąpić szumu Szum może być jedno- bądź wielowymiarowy Może też zwracać więcej niż jedną wartość Optymalizacja na GPU: 4 wartości liczone jednocześnie
Funkcje szumu c.d.
Własności funkcji szumu Funkcje zwracają wartości zmiennoprzecinkowe z ograniczonego przedziału Na ogół [-1, 1] albo [0, 1] Częstotliwości szumu zawierają się w ograniczonym przedziale Na ogół co najwyżej jedno minimum/maksimum funkcji pomiędzy argumentami X odległymi o 1.0 Średnia wartość szumu ma wielkość bliską środka przedziału wartości zwykle 0.0 albo 0.5
Własności funkcji szumu c.d. Charakter statystyczny szumu niezależny od translacji Same wartości szumu oczywiście są zmienne w zależności od położenia (X), nie zmienia się jedynie charakter funkcji W przypadku wielowymiarowym niezależność statystyczna od obrotów Szum wielowymiarowy powinien być izotropowy
Szum jednowymiarowy Na ogół implementowany przy pomocy interpolacji wartości na regularnej siatce punktów o współrzędnych całkowitych Na ogół interpolacja wielomianowa Numer punktu na siatce jest wejściem funkcji mieszającej albo obliczającej wartości pseudolosowe Wartości te są konwertowane do odpowiedniego przedziału, węższego niż [-1, 1], w zależności od zastosowanej techniki interpolacji
Szum jednowymiarowy c.d.
Szum jednowymiarowy c.d. W punktach siatki można zamiast wartości obliczać pochodne funkcji Dobre rezultaty można osiągnąć obliczając jednocześnie wartości i pochodne Stosuje się wtedy tzw. Interpolację Hermite a Punkty obliczania wartości szumu nie muszą stanowić regularnej siatki Lepsze własności statystyczne Komplikacja algorytmu, rzadko stosowane w praktyce
Szum wielowymiarowy Uogólnienie funkcji jednowymiarowej na wiele wymiarów Zmienność szumu w czasie Czas musi być dodatkowym wymiarem Zmienność ta nie może być osiągana przy pomocy zmian wartości funkcji noise() dla kolejnych wywołań brak powtarzalności Szum trójwymiarowy zmienny w czasie 4 wymiary Na ogół więcej nie jest potrzebne
Szum wielowymiarowy c.d. W podstawowej wersji regularna siatka dla większej liczby wymiarów Złożoność obliczeniowa: ilość obliczeń wartości na siatce O(d*2 d ) albo nawet O(d*4 d ), w zależności od interpolacji, gdzie d jest liczbą wymiarów Zależność częstotliwości szumu od kierunku, np. w 2D częstotliwość po skosie jest 2 0.5 razy mniejsza niż częstotliwość po siatce Można zastosować tzw. siatkę opartą o simpleksy Ttrójkąty równoramienne w 2D, czworościany w 3D,
Szum wielowymiarowy c.d. Szum oparty o siatkę simpleksową ma znacznie mniejszą złożoność obliczeniową ilość wierzchołków d-wymiarowego simpleksu to d+1 Nadal d obliczeń pochodnych w każdym wierzchołku Zatem złożoność to O(d 2 ) Mniejsza zależność częstotliwości od kierunku Bardziej skomplikowany algorytm konieczność skalowania i pochylania siatki Ale i tak szybciej złożoność ma decydujący wpływ
Szum wielowymiarowy c.d.
Funkcje szumu na GPU W specyfikacji języka GLSL jest dostępna funkcja noise() Niestety, na większości kart graficznych funkcja ta nie działa Program zostanie skompilowany i uruchomiony poprawnie, jednak funkcja ta na ogół zwraca stałą wartość Trzeba napisać własną wersję tej funkcji Przydatne mogą być operacje stałoprzecinkowe dostępne od OpenGL w wersji 3.0
Funkcje szumu na GPU c.d. Najprostszą funkcją szumu jest wygenerowanie odpowiedniej tekstury na CPU i odczyt z niej na GPU Do 4 komponentów w teksturze Co najwyżej szum 3D Znaczne zużycie pamięci albo widoczna powtarzalność szumu, nawet w przypadku 2D Komplikacja aplikacji, zajęcie dodatkowo co najmniej jednej jednostki teksturującej Interpolacja liniowa między tekselami nienajlepsze wyniki
Funkcje szumu na GPU c.d. Obecnie lepiej jest napisać własną funkcję szumu wykonywaną na GPU Interpolacja i przekształcenia siatki operacje na liczbach zmiennoprzecinkowych Dostępne od OpenGL w wersji 2.0 Obliczanie funkcji mieszającej/pseudolosowej w punktach na siatce Najlepsze operacje stałoprzecinkowe, dostępne od wersji 3.0 Emulowacja przy pomocy liczb zmiennoprzecinkowych
Synteza widmowa Prosta funkcja szumu zwykle nie daje oczekiwanych rezultatów Potrzebny jest większy zakres częstotliwości Synteza widmowa: suma wielu funkcji szumu o różnych częstotliwościach i amplitudach W najprostszym przypadku: suma N funkcji szumu Każda następna funkcja ma częstotliwość 2x większą niż poprzednia Ma też 2x mniejszą amplitudę
Synteza widmowa c.d.
Synteza widmowa c.d. Tak określona funkcja zawiera wartości z przedziału szerszego niż funkcja szumu W przypadku syntezy dowolnie wielu funkcji maksymalna wartość ograniczona jest przez sumę szeregu geometrycznego A + ca + c 2 A + c 3 A +, gdzie A to amplituda szumu, a c określa ile razy amplituda maleje dla każdej kolejnej sumowanej funkcji Dla A = 1.0 i c = 0.5 maksymalna wartość szumu syntezowanego to 2.0
Synteza widmowa c.d. Tak syntezowany szum zawiera jednocześnie elementy bardziej szczegółowe i elementy o większej skali Do szumu można też dołączyć ostre przejścia otrzymywane w wyniku zastosowania funkcji abs() na składnikach syntezy Szum musi być z przedziału [-1, 1], jeżeli jest z przedziału [0, 1] to należy go przetransformować Tzw. funkcja turbulence()
Synteza widmowa c.d.
Antyaliasing tekstur proceduralnych Na żadnej teksturze proceduralnej nie ma automatycznego antyaliasingu takiego jak na teksturach zwykłych Karta graficzna zapewnia jednak funkcje, które umożliwiają napisanie takiego antyaliasingu Są to przede wszystkim aproksymacje pochodnych w przestrzeni ekranu Na ich podstawie można wyliczyć przybliżony rozmiar filtru
Antyaliasing tekstur proceduralnych Aproksymacje pochodnych Funkcje dfdx() i dfdy() Pochodne w przestrzeni ekranu, w poziomie i w pionie Pochodne dowolnych parametrów interpolowanych (przekazywanego z programu wierzchołków do programu fragmentów), a także dowolnych wyrażeń opartych o te parametry, wartości stałe, tekstury, Niezdefiniowane w przypadku rozgałęzień (if/else, switch, while, for, itp.) Nieciągłości (min/max, abs,?:, itp.) psują dokładność
Antyaliasing tekstur proceduralnych Aproksymacje pochodnych algorytm Karta oblicza fragmenty w blokach 2x2 Pochodne są aproksymowane jako różnice danej wartości pomiędzy sąsiednimi fragmentami w poziomie i w pionie Jeżeli wartość danego wyrażenia w sąsiednich fragmentach została obliczona na innej ścieżce (np. if oraz else), albo w sąsiednim fragmencie nie została obliczona wcale, to aproksymacja ta nie działa, nawet jeżeli pochodna jest dobrze zdefiniowana
Antyaliasing tekstur proceduralnych Promień filtru można policzyć za pomocą funkcji fwidth(), zdefiniowanej jako fwidth(p) = abs(dfdx(p)) + abs(dfdy(p)) Albo nieco dokładniej, za pomocą wyrażenia fwidth(p) = sqrt(dfdx(p) 2 + dfdy(p) 2 ) Mając promień filtru, należy uśrednić wartości tekstury proceduralnej znajdującej się w odpowiednim kole
Antyaliasing tekstur proceduralnych Filtrowanie anizotropowe jest o wiele trudniejsze i zwykle nie jest stosowane w praktyce Filtrowanie szumu opartego o syntezę widmową wygaszanie częstotliwości w oparciu o rozmiar filtru Ograniczenie ilości sumowanych funkcji W przypadku innych tekstur proceduralnych antyaliasing trzeba projektować indywidualnie dla każdego przypadku Dobry antyaliasing może być trudny
Proceduralne tekstury wolumetryczne Obliczanie wartości tekstury w funkcji trójwymiarowej pozycji Nie jest potrzebne mapowanie uv do dwuwymiarowej przestrzeni tekstury Obiekt teksturowany w ten sposób wygląda jakby był wycięty z takiego materiału Nie można stosować klasycznych tekstur opartych o tablice w ten sposób ze względu na zajętość pamięci
Proceduralne tekstury wolumetryczne Przykład: marmur Budowa warstwowa Warstwy opisane funkcją y = sin n (f(x, y, z)+n(x, y, z)), gdzie f jest liniową funkcją pozycji, a n jest wykładnikiem o wartościach naturalnych, parzystych Argument funkcji sin jest zniekształcony szumem opartym o syntezę widmową Na końcu interpolacja pomiędzy dwoma dowolnymi kolorami (kolorami warstw) przy pomocy wartości y
Proceduralne tekstury wolumetryczne
Proceduralne tekstury wolumetryczne Przykład: drewno Podobny algorytm jak w przypadku marmuru Słoje opisane funkcją piłokształtną (zamiast sin n ) Funkcja pozycji: f(x, y, z) = (y 2 + z 2 ) 0.5 generacja słoi rozciągniętych wzdłuż osi x Podobnie jak dla marmuru, funkcję pozycji można zniekształcić przy pomocy szumu
Proceduralne tekstury wolumetryczne
Tekstury komórkowe Określenie wartości atrybutów (zależnych od danego algorytmu) w punktach na nieregularnej siatce Wyszukiwanie najbliższego sąsiedztwa cieniowanego fragmentu Kolor fragmentu zależny od odległości od punktów siatki oraz wartości atrybutów w tych punktach
Tekstury komórkowe
Synteza tekstur Założenie: różne regiony tesktury są do siebie podobne (ale nie takie same!) Technika nie jest opracowana dla dowolnych obrazów Generacja tekstur o dowolnie dużych rozmiarach na podstawie niewielkich próbek Różne warianty algorytmu Tworzenie tekstur o brzegach pasujących do siebie Zapełnianie dziur w teksturze Start od liczb losowych albo oryginalnej próbki
Synteza tekstur
Synteza tekstur
Losowe modyfikowanie pozycji wierzchołków Wejściem jest obiekt o prostej geometrii Następnie zwielokrotniana jest ilość trójkątów krawędzie ulegają wyobleniu Wierzchołki takiego modelu są ostatecznie przemieszczane o wartość dowolnej funkcji zdefiniowanej na wartościach pseudolosowego szumu Szum jest obliczany np. na podstawie pozycji wierzchołków
Losowe modyfikowanie pozycji wierzchołków
Modelowanie roślin Opis budowy i wzrostu roślin przy pomocy wyrażeń regularnych oraz gramatyk Losowy wybór zastąpień łańcuchów w gramatykach Losowy wybór wartości dodatkowych parametrów
Modelowanie roślin
Dziękuję za uwagę