RENDERING W CZASIE RZECZYWISTYM Michał Radziszewski
Plan wykładu Obiekty półprzeźroczyste wprowadzenie Test alfa, odrzucanie Mieszanie alfa Obiekty naklejane, ang. decals Konwersja próbki punktowe obraz rastrowy Kolejność renderingu, bufor Z, sortowanie Roślinność, wygładzanie krawędzi Technika Alpha to Coverage
Plan wykładu c.d. Cząsteczki efekt kolizji z otoczeniem Efekt rozmazania, oszronienia, itp. Technika Depth Peeling Sposób uniknięcia konieczności sortowania Rendering wieloprzebiegowy Bufor Z oraz bufor K Rendering jednoprzebiegowy bez sortowania Do napisania tylko na najnowszych kartach Rendering obiektów wolumetrycznych
Literatura T. Duff, Compositing 3D rendered images, SIGGRAPH 1985 C. Everitt, Interactive Order-Independent Transparency, NVIDIA white paper, 2001 C. Green, Improved Alpha-Tested Magnification for Vector Textures and Special Effects, Valve 2007 J. Hensley, Order-Independent Transparency in DirectX11, AMD 2011
Literatura c.d. L. Bavoil i inni, Multi-Fragment Effects on the GPU using the k-buffer, Symposium on Interactive 3D Graphics 2007 Antialiasing with Transparency, NVIDIA Technical Report, 2005 T. Lorach, Soft Particles, NVIDIA Whitepaper, 2007
Obiekty półprzeźroczyste wprowadzenie Rendering obiektów, przez które widać tło, ale nie załamujących światła Nie trzeba stosować mapowania środowiskowego Technika prosta w przypadku śledzenia promieni Niestety okazuje się problematyczna w renderingu w czasie rzeczywistym, opartym o bufor głębi Bufor głębi nie działa dla obiektów półprzeźroczystych Konieczność stosowania skomplikowanych algorytmów (albo ignorowanie problemu)
Obiekty półprzeźroczyste wprowadzenie
Test alfa, odrzucanie Test alfa Rendering albo odrzucanie fragmentów na podstawie wartości alfa Karty nieprogramowalne, obecnie nie używane Program fragmentów może odrzucić fragment na podstawie spełnienia dowolnego warunku if (cond) discard; Metoda stosowana obecnie Znacznie bardziej elastyczna
Test alfa, odrzucanie c.d. Nie powoduje trudności związanych z buforem Z (głębi) Nadaje się do renderingu obiektów o skomplikowanym kształcie za pomocą prostej geometrii Niestety wynikiem są brzydkie, postrzępione krawędzie obiektów Można też renderować obiekty półprzeźroczyste, tzw. checkboard pattern, ale efekt nie jest zbyt dobry
Test alfa, odrzucanie c.d.
Mieszanie alfa
Mieszanie alfa c.d. Mieszanie koloru fragmentu z kolorem w buforze ramki Operacja w pewnym zakresie konfigurowalna, ale nie programowalna (nawet na najnowszych kartach) RGB = op RGB (F 1 *RGB src, F 2 *RGB dst ) A = op A (F 1 *A src, F 2 *A dst ) op: +,, odwrotne, min, max F x : 0, 1, RGB src, 1 RGB src, RGB dst, 1 RGB dst, A src, 1 A src, RGB C, 1 RGB C, A C, 1 A C
Mieszanie alfa c.d. Możliwość niezależnego ustawiania operacji dla koloru i kanału alfa Dla prostej półprzeźroczystości można stosować RGBA = A src *RGBA src + (1 A src )*RGBA dst Nowe możliwości od OpenGL w wersji 3.x Opcjonalny drugi kolor wynikowy dla fragmentów Obiekt może nakładać swój kolor, i filtrować tło drugim, niezależnie obliczanym, kolorem Nowe wartości F x : RGB 2, 1 RGB 2, A 2, 1 A 2,
Mieszanie alfa c.d. Przykład mieszania alfa z operatorem dodawania:
Obiekty naklejane Wielokrotne użycie tych samych tekstur, np. na ścianach budynków, na skałach, etc. Obiekty naklejane dodają unikatowe szczegóły Zajmują o wiele mniej pamięci niż unikatowe teksturowanie wszystkiego Unikatowe teksturowanie (!) pojawiło się ostatnio w grze Rage firmy ID Software
Pola odległości W przypadku pewnej klasy tekstur tekstur wektorowych stosowanie zarówno testu alfa jak i mieszania alfa nie daje dobrych rezultatów Tekst, znaki drogowe, itp. Aby uniknąć problemów przy powiększaniu można, zamiast zwiększania rozdzielczości, zastosować tzw. pola odległości Pola odległości w tekselach przechowują odległość od obiektu Liczba ze znakiem, wewnątrz albo na zewnątrz obiektu
Pola odległości c.d.
Pola odległości c.d. Program fragmentów oblicza kolor na podstawie odczytanej odległości Wyniki znacznie lepsze niż zastosowanie kanału alfa Ale: kolor musi być funkcją odległości
Pola odległości c.d.
Konwersja próbki punktowe obraz rastrowy Stosowane np. przy interaktywnym śledzeniu promieni Wyjściem śledzenia promieni jest strumień próbek punktowych, które należy przekształcić w obraz rastrowy, stosując odpowiedni filtr Rendering czworokątów w pozycjach próbek, o rozmiarze równym zasięgowi filtra Wartości filtra zakodowane są w teksturze
Konwersja próbki punktowe obraz rastrowy c.d. Mieszanie alfa ustawione na dodawanie, oba czynniki F1 i F2 powinny mieć wartość 1 W programie fragmentów mnożenie koloru próbki przez wartość odczytaną z tekstury filtru W kanale alfa przechowywana jest suma wag filtrowania Po renderingu czworokątów kanały RGB należy podzielić przez kanał A
Kolejność renderingu, sortowanie
Kolejność renderingu, sortowanie Rendering obiektów półprzeźroczystych w oparciu o bufor głębi nie daje oczekiwanych rezultatów Wynikowy obraz może zależeć od kolejności renderingu, decyduje o tym operator mieszania Rendering obiektów nieprzeźroczystych w pierwszej kolejności, z buforem głębi Następnie rendering obiektów półprzeźroczystych, w kolejności od najdalszych do najbliższych, z wyłączonym buforem głębi
Kolejność renderingu, sortowanie Najmniejsze elementy, na które można rozbić obiekty to indywidualne trójkąty Na ogół nie da się bezbłędnie posortować trójkątów po odległości Odległość trójkątów od obserwatora nie jest relacją porządku Inne techniki opisane dalej
Roślinność, wygładzanie krawędzi Proste modele geometryczne Szczegóły dodawane przy pomocy tekstur testowanie albo mieszanie alfa Testowanie alfa szybsze, nie wymaga sortowania obiektów
Roślinność, wygładzanie krawędzi
Wygładzanie krawędzi Niestety przy testowaniu alfa powstają nieładnie wyglądające krawędzie Gdy stosowany jest antyaliasing geometrii można problemu tego uniknąć Technika Alpha to Coverage Działa dobrze dla dowolnych obiektów opartych o testowanie alfa
Technika Alpha to Coverage Stosowana przy antyaliasingu geometrii Supersampling zwielokrotnienie próbek głębi i koloru, działa zawsze bezbłędnie, jednak powoli Multisampling zwielokrotnienie wyłącznie próbek głębi, działa szybciej, ale proste testowanie alfa nadal powoduje postrzępione krawędzie obiektów
Technika Alpha to Coverage Technika Alpha to Coverage pozwala uniknąć brzydkich efektów wizualnych wynikających z połączenia testu alfa z multisamplingiem Mieszanie alfa nie jest konieczne Wartość alfa interpretowana jest jako procentowe zakrycie (coverage) danego fragmentu przez obiekt Wykonywane automatycznie przez kartę graficzną /glenable(gl_sample_alpha_to_coverage)/
Technika Alpha to Coverage
Cząsteczki efekt kolizji z otoczeniem Cząsteczki zwykle są półprzeźroczyste, z gładkimi krawędziami Przy wykrywaniu kolizji zwykle są reprezentowane jako punkty Natomiast wyświetlane są jako tzw. billboardy prostokąty zwrócone w kierunku obserwatora Powoduje to źle wyglądający efekt przecinania się cząsteczek z otoczeniem psujący wrażenie ciągłości dymu, mgły, itp.
Cząsteczki efekt kolizji z otoczeniem Sposób uniknięcia tego problemu Najpierw renderowane jest otoczenie, bez cząsteczek, z zapamiętaniem głębi w teksturze Tekstura głębi otoczenia używana jest przy renderowaniu cząsteczek Wymuszone zwiększanie współczynnika przeźroczystości cząsteczki gdy głębia fragmentu cząsteczki jest bliska głębi otoczenia Cząstka powinna być całkowicie przeźroczysta w punktach kolizji o głębi takiej samej jak otoczenie
Cząsteczki efekt kolizji z otoczeniem
Cząsteczki efekt kolizji z otoczeniem
Efekt rozmazania, oszronienia Nie da się go osiągnąć przy pomocy zwykłego mieszania alfa Należy najpierw renderować obiekty nieprzeźroczyste do tekstury, z ustawieniami kamery takimi samymi jak bez tego efektu Nie jest to więc mapowanie środowiskowe Posiadając taką teksturę w trakcie renderingu obiektów półprzeźroczystych można osiągnąć efekty takie, jak rozmazanie albo przesunięcie promieni
Efekt rozmazania, oszronienia Przesunięcie promieni przesunięcie współrzędnych tekstury Rozmazanie odczyt z niższego poziomu MIP Możliwe błędy na brzegach ekranu brak sąsiednich tekseli Na ogół ignorowane Umieszczenie takich obiektów jeden za drugim: Efekty te nie nałożą się na siebie Ewentualnie konieczność odświeżania tekstury
Efekt rozmazania, oszronienia
Technika Depth Peeling Rendering kolejnych warstw głębi Pierwsza warstwa jest renderowana normalnie Dla każdej kolejnej dwa testy głębi Pierwszy typowy (przepuszcza fragmenty bliższe obserwatora niż te z bufora ramki) Drugi przepuszcza fragmenty dalsze niż renderowane w poprzednim przebiegu Warunek stopu: żaden fragment nie przeszedł obu testów głębi Prosty i bezbłędny rendering obiektów półprzeźroczystych
Technika Depth Peeling c.d.
Bufor Z oraz bufor K Bufor Z zawiera informacje o m.in. głębi i kolorze dla pojedynczego fragmentu na piksel ekranu Bufor K może przechowywać więcej fragmentów na każdy piksel ekranu Obecnie żadna karta nie obsługuje automatycznie tej techniki Na najnowszych kartach można ją zaprogramować stosując atomowe liczniki i zapis do dowolnego teksela tekstury
Bufor K Złożony z dwóch tekstur W pierwszej z nich znajdują się listy odsyłaczowe fragmentów dla każdego piksela Tekstura 1D Rozmiar na tyle duży aby zmieściły się wszystkie fragmenty Zapis z zastosowaniem licznika atomowego W drugiej teksturze (2D, o rozmiarze ekranu) znajdują się indeksy startowe list fragmentów
Bufor K
Rendering obiektów wolumetrycznych Często stosowany przy wizualizacji w medycynie Trójwymiarowa tekstura przechowująca kolor i przeźroczystość obiektu Często stosowane algorytmy Rendering dowolnego przekroju wiele przebiegów albo jeden nie uwzględniający półprzeźroczystości Śledzenie promieni przez teksturę dobre rezultaty ale działa powoli Rzutowanie wokseli na ekran (ang. splatting) kompromis między jakością a wydajnością
Rendering obiektów wolumetrycznych
Wolumetryczne chmury Konieczne dla scen górskich, gdy chmury mogą być na wysokości obserwatora Techniki renderingu podobne jak w poprzednio omówionym przypadku Tekstury o znacznie mniejszej rozdzielczości oszczędność pamięci Otoczenie kolizja chmur z otoczeniem Podświetlenie przez słońce, tzw. rim lighting Cieniowanie chmur
Wolumetryczne chmury
Wolumetryczne chmury
Dziękuję za uwagę