RENDERING W CZASIE RZECZYWISTYM Michał Radziszewski
Plan wykładu Postprocessing wprowadzenie Rendering do tekstury Obliczenia w GLSL Odczyt transformacji (transform feedback) Pełnoekranowy czworokąt Rozmywanie Gaussowskie, dwuprzebiegowe Filtry bilateralne Wyostrzanie, wykrywanie krawędzi
Plan wykładu c.d. Obrazy o wysokim kontraście (HDR) Tekstury w formacie zmiennoprzecinkowym Formaty EXR i RGBE Przekształcenia kolorów, mapowanie kontrastu Głębia ostrości Zaznaczanie obiektów Promienie słoneczne Efekt flary (lens flare)
Literatura J. L. Mitchell i inni, Advanced Image Processing with DirectX 9 Pixel Shaders, Shader X 2, 2004 J. Novosad, Advanced High Quality Filtering, GPU Gems 2, 2005 S. Paris i inni, A Gentle Introduction to Bilateral Filtering and Its Applications, SIGGRAPH 2007 F. Durand, J. Dorsey, Interactive Tone Mapping, Eurographics 2000 G. Ward, Real Pixels, Graphics Gems II, 1991
Literatura c.d. F. Kainz i inni, The OpenEXR File Format, GPU Gems, 2004 G. Spencer i inni, Physically-Based Glare Effects for Digital Images, SIGGRAPH 1995 C. Maughan, Texture Masking for Faster Lens Flare, Game Programming Gems 2, 2001 D. Gillham, Real-time Depth of Field Implemented with a Postprocessing Only Technique, Shader X 5, 2005
Postprocessing wprowadzenie Przetwarzanie obrazów (image processing) Zarówno wejściem jak i wyjściem jest obraz w formacie rastrowym Jeżeli wejściem jest obraz wynikowy renderingu, to przetwarzanie jest nazywane postprocessingiem Koszt obliczeniowy postprocessingu Jest niezależny od złożoności sceny Zależy tylko i wyłącznie od rozdzielczości obrazu Pewne algorytmy lepiej jest wykonać jako postprocessing
Postprocessing wprowadzenie
Rendering do tekstury Konieczny aby wykonać postprocessing Zwykle tekstura o rozdzielczości ekranu Dowolny format, do którego GPU obsługuje rendering Niekoniecznie 32bit RGBA Możliwe więcej niż jedno wyjście (multiple render targets), wiele tekstur wynikowych Wszystkie tekstury muszą mieć taką samą rozdzielczość Ograniczenie na ilość tekstur
Obliczenia w GLSL Postprocessing opiera się na technikach przetwarzania obrazów nie jest to grafika 3D! Zatem nie współgra dobrze z OpenGL ani z DirectX Do postprocessingu najlepsze są obliczenia ogólnego przeznaczenia na kartach graficznych Do obliczeń została opracowana biblioteka OpenCL, ale jest ona nieco kłopotliwa w użyciu Jeżeli tylko można, to mimo wszystko lepiej jest użyć OpenGL do obliczeń ogólnego przeznaczenia
Obliczenia w GLSL c.d. Obliczenia ogólnego przeznaczenia w OpenGL można wykonać na dwa sposoby Z zastosowaniem techniki Transform Feedback Rendering czworokąta wypełniającego cały bufor ramki Obie te techniki wymagają pewnych dziwacznych chwytów (takich samych jak w DirectX) Nie wymagają natomiast środowiska OpenCL, co często jest wygodniejsze
Transform Feedback Tylko program wierzchołków i, opcjonalnie, geometrii Nie ma programu fragmentów Konieczność zapisu danych do bufora wierzchołków Upakowanie do czteroelementowych wektorów, nawet jeżeli logika algorytmu mówi inaczej Konieczne ze względu na wydajność Podobnie odczyt wyników
Rendering czworokąta Cztery wierzchołki, pasek dwóch trójkątów Pusty program wierzchołków tylko przepisanie danych Obliczenia tylko w programie fragmentów Ilość pikseli bufora ramki równa ilości danych do przetworzenia Wejście i wyjście przez tekstury Karta graficzna musi wykonać pewne operacje niepotrzebne z punktu widzenia logiki programu
Obliczenia wieloprzebiegowe Możliwość zastosowania zarówno przy technice transform feedback, jak i przy renderingu czworokąta Dwa zestawy buforów jeden wejściowy oraz jeden wyjściowy Wejście i wyjście musi mieć ten sam format Nie jest to konieczne przy pojedynczym przebiegu Po każdym przebiegu podmiana buforów
Rozmywanie Tworzenie nieostrego obrazu Przykładowe zastosowania Symulacja poruszenia kamery Rozbłyski światła od bardzo jasnych obiektów Usuwanie szumu (filtr dolnoprzepustowy) Powszechnie stosowane techniki Odczyt z tekstury z zastosowaniem MIP mappingu Rozmywanie gaussowskie, 1- i 2-przebiegowe Filtrowanie bilateralne
Rozmywanie obraz przykładowy
Odczyt z zastosowaniem MIP mappingu Wykonywany sprzętowo przez GPU Pewna ilość operacji odczytu z tekstury na jedno wykonanie programu jest darmowa GPU posiada specjalizowane jednostki do teksturowania Konieczność wygenerowania MIP-map Niestety wyniki o słabej jakości W rozmytym obrazie widać teksele
Odczyt z zastosowaniem MIP mappingu c.d.
Rozmywanie gaussowskie Bardzo dobre wyniki, ale kosztowne obliczeniowo Przy stałej sile rozmycia () można stosować algorytm dwuprzebiegowy Konieczność dobrania odpowiedniego N dla danej siły rozmycia N N j N N i j i N N j N N i j i j v i u v u e e T R 2 2 2 2,,
Rozmywanie gaussowskie c.d.
Filtr bilateralny Usuwanie szumów z możliwie małym rozmyciem krawędzi Zależność filtru od wartości tekseli N N j N N i v u N N j N N i v u j v i u v u T T j i v u j i f j i f T R e e j i f v u j v i u,,,,,,,, 2,, 2 2
Filtr bilateralny c.d.
Wyostrzanie Operacja odwrotna do rozmywania Filtr górnoprzepustowy Splot z np. taką maską: 0 C 0 M C 1 C 0 C 0 C może być dowolną stałą, często C = 1 Obcięcie wartości ujemnych
Wyostrzanie c.d.
Wykrywanie krawędzi Operacja podobna do wyostrzania Wartości bliskie zera gdy nie ma krawędzi Wartości bliskie maksimum w okolicach krawędzi Np. splot z taką maską: 0 1 0 M 1 0 1 0 1 0 Potrzebna jeszcze operacja abs()
Wykrywanie krawędzi c.d.
Obrazy o wysokim kontraście Elementy b. jasne i ciemne na tym samym obrazie Np. jasne niebo z chmurami i obszary zacienione Format 8-bitowy stałoprzecinkowy zapewnia, bez utraty precyzji, kontrast 1:2 Jeżeli potrzebny jest większy kontrast, to najstarsze bity muszą być wypełniane zerami, wyrzucając kolejne bity ze słowa Format 16-bitowy pomaga, ale nie rozwiązuje problemu
Obrazy o wysokim kontraście c.d. Dla obrazów HDR najlepiej nadaje się format zmiennoprzecinkowy zapewnia praktycznie nieograniczony kontrast przy pełnej precyzji Konieczność konwersji do formatu 8-bitowego stałoprzecinkowego przed wyświetleniem na ekranie Ale postprocessing jest wykonywany na liczbach zmiennoprzecinkowych Daje to o wiele większe możliwości i lepsze rezultaty
Obrazy o wysokim kontraście c.d.
Format EXR Format pliku opracowany przez Industrial Light and Magic w celu zapisywania wysokiej jakości wyników renderingu Dostępna biblioteka Open Source Przechowuje obrazy używając liczb zmiennoprzecinkowych 16- i 32-bitowej precyzji oraz 32- bitowych stałoprzecinkowych Obsługuje też metody kompresji stratnej i bezstratnej
Format RGBE Format zmiennoprzecinkowy zajmujący jedynie 32 bity na teksel Współdzielony wykładnik Po 9 bitów na kanały RGB, 5 bitów na wykładnik Wartości RGB nie mogą być znormalizowane Dopełnianie zerami jeżeli istnieje duża różnica jasności pomiędzy kanałami utrata precyzji Obecne GPU potrafią czytać format RGBE, ale nie obsługują odpowiedniego zapisu
Przekształcenia kolorów Operacje te polegają na zmianie barwy, nasycenia, przekolorowaniu sceny, itp. Jasność koloru można obliczyć: V = 0.2*R + 0.7*G + 0.1*B Operacje na nasyceniu: Kolory RGB traktowane jako punkty w przestrzeni 3D Linia pomiędzy kolorem danym, a szarym o tej samej jasności Zmiana nasycenia poruszanie się po tej linii
Przekształcenia kolorów c.d.
Przekształcenia kolorów c.d.
Przekształcenia kolorów c.d. Zmiana profilu kolorów Kolor RGB traktowany jako wektor Mnożenie macierz*wektor Przykładowe zastosowania Konwersja pomiędzy rożnymi wersjami RGB, np. srgb i Adobe RGB Stylizowanie na starą fotografię (sepia) Tworzenie anaglifów
Przekształcenia kolorów c.d.
Przekształcenia kolorów c.d. Dowolne przekolorowanie sceny Sterowane teksturą 3D o niewielkiej rozdzielczości np. 16x16x16, z interpolacją liniową Tekstura adresowana kolorem Z tekstury odczytywany jest nowy kolor Wartości neutralne: liniowo rosnące składowe RGB od 0 do max, po osiach tekstury odpowiednio u, v, w Zastosowanie np. dostosowanie klimatu gry do miejsca czy akcji
Mapowanie kontrastu Maksymalne jasność i kontrast monitora są mocno ograniczone w porównaniu ze światem rzeczywistym Konieczność redukcji kontrastu tak, aby można było wyświetlić obraz Techniki: Obcięcie Mapowanie globalne liniowe i nieliniowe Mapowanie lokalne
Głębia ostrości Ze względu na określoną średnicę obiektywu, bądź oka, układ soczewek jest w stanie zapewnić pełną ostrość obiektów w ściśle określonej odległości od obserwatora Wszystkie obiekty bliższe albo dalsze stają się coraz mniej ostre Symulacja tego zjawiska w oparciu o bufor głębi z zastosowaniem postprocessingu
Głębia ostrości c.d.
Głębia ostrości c.d. Rozmycie obrazu ze zmienną siłą zależną od wartości w buforze głębi Wszystkie obiekty bliższe bądź dalsze od pewnej zadanej odległości są rozmywane Niestety nie jest to algorytm poprawny z punktu widzenia optyki, ale może zapewnić dobre wyniki Należy uważać, aby przy rozmywaniu nie złapać tekseli z obiektów, które są blisko płaszczyzny idealnej ostrości
Zaznaczanie obiektów
Zaznaczanie obiektów c.d. Rendering obiektu przy pomocy programu zapisujacego same jedynki, z buforem glebi zawierajacym otoczenie zaznaczanego obiektu W postprocesie dla kazdego piksela ekranu zliczanie jedynek w pewnym kwadracie Tam, gdzie jest podobna ilosc zer i jedynek, znajduje sie krawedz obiektu Krawedz taka mozna pomalowac na jaskrawy kolor i zmieszac (mieszanie alfa) z wynikiem renderingu
Promienie słoneczne
Promienie słoneczne Potrzebne są: Znormalizowany bufor głębi (1.0 obiekty najdalsze, 0.0 najbliższe) Wynik renderingu sceny (najlepiej w HDR, ale niekoniecznie) Pozycja Słońca w przestrzeni ekranu Uwaga na odwrócenie projekcji, jeżeli Słońce jest z tyłu obserwatora Jeżeli Słońce znajdzie się poza ekranem to efekt jest zbyt słaby, ale niewiele można na to poradzić
Promienie słoneczne Algorytm: Wynik renderingu mnożony przez bufor głębi wyciemnienie obiektów bliskich, brak zmiany jasności najdalszych nieba i Słońca Radialne rozmycie wyniku renderingu po linii od danego punktu do pozycji Słońca Rozmycie można wykonać w kilku przebiegach jest wtedy nieco szybsze Na końcu: suma oryginalnego wyniku renderingu i obrazu rozmytego
Promienie słoneczne
Efekt flary Wielokrotne odbicia promieni od soczewek obiektywu W świecie rzeczywistym uważane jest to za wadę Często jednak efekt ten jest symulowany w grach Umieszczenie (poprzez mieszanie alfa) pewnych specyficznych kształtów na linii pomiędzy środkiem ekranu a bardzo jasnym obiektem (np. Słońcem) Podobne zjawisko zachodzi w ludzkim oku poświata wokół bardzo jasnych obiektów, tzw. glare effect
Efekt flary
Dziękuję za uwagę