Techniki post-processingu w OpenGL
Prowadzący
Piotr Dulikowski <piodul [at] op [dot] pl>
Opis
Post-processing to określenie na różnego rodzaju metody uatrakcyjnienia gotowego obrazu. Są one często wykorzystywane w aplikacjach 3D do zastosowania efektów wymagających informacji o całym obrazie, np. kreskówkowe obwódki czy rozmycie. Na dodatek nie potrzebują informacji o geometrii sceny, przez co można je wdrożyć do gotowego silnika graficznego z minimalnym wysiłkiem. Na tych warsztatach pokażę kilka ciekawych efektów tego typu wykorzystywanych w nowoczesnych grach komputerowych.
Program zajęć
Dzień 1: Podstawy
Omówię, jak się używa framebuffer-ów w OpenGL-u. Rozszerzymy nasze programy o prosty mechanizm post-fx.
Dzień 2-3: The real stuff
Nauczymy się i naklepiemy bardziej zaawansowane efekty:
- Blur
- Wykrywanie krawędzi
- Depth of Field
- Screen Space Ambient Occlusion
- High Dynamic Range
- Bloom
- Depth of Field + Bokeh
(Zrobimy, ile zdążymy; w razie nadmiaru czasu mogę zaproponować coś jeszcze)
Wymagania
- Umiejętność w miarę sprawnego pisania w C/C++. Do innych języków też są bindingi OpenGL, lecz nie miałem z nimi do czynienia, zatem nie będę w stanie pomóc w razie problemów związanymi z samymi bindingami czy językiem. Używasz na własną odpowiedzialność.
- Trochę geometrii analitycznej - wiedzieć co to wektory, rozumieć w jaki sposób OpenGL wykonuje przekształcenia
- Podstawowa znajomość OpenGL + GLSL (czyli fixed function się nie liczy)
- Znajomość jakiejś przenośnej biblioteki odpalającej okienko i OpenGL-a (np. GLFW + GLEW, SDL, SFML…)
- Sprzęt z w miarę aktualną wersją OpenGL, co najmniej 3.0
- Trochę wyobraźni
Zadania
Zadanie nr 1
Napisz aplikację, która wczyta zadany obrazek z pliku do tekstury, przekształci go za pomocą fragment shadera i narysuje. Chciałbym, aby w Twoim programie znalazły się następujące efekty:
- Odwrócenie kolorów
- Zamiana dwóch kanałów kolorów
- Odcienie szarości
- Posteryzacja
- Lustrzane odbicie
- Falowanie obrazu w czasie
- Pikselizacja (zmniejszenie rozdzielczości)
- Dodanie (pseudo)losowego szumu
- (opcjonalnie) Kilka efektów własnego pomysłu
Ścieżkę do zadanego obrazka powinno się dać podać jako argument w linii poleceń. Nie musisz dbać o zachowanie proporcji przy wyświetlaniu obrazka. Powinno dać się przełączać pomiędzy efektami za pomocą klawiatury.
Zadanie nr 2
Napisz program, który wczyta zadany model 3D i wyświetli go. Model zapisany będzie w pliku tekstowym, w uproszczonej wersji formatu OBJ. Możesz założyć, że plik jest w poprawnym formacie.
Format modelu
Każda linijka zaczyna się od nazwy definicji - v, vn bądź f. Każda linijka zaczynająca się od innego ciągu znaków powinna być zignorowana.
Po nazwie jest odstęp, a dalej - argumenty:
v
v x y z
Definiuje pozycję wierzchołka (x, y, z - liczby zmiennoprzecinkowe).
vn
vn x y z
Definiuje wektor normalny (prostopadły) do powierzchni - (x, y, z - liczby zmiennoprzecinkowe).
f
f v1//vn1 v2//vn2 v3//vn3
Definiuje trójkąt. Każdy jego wierzchołek opisany jest przez dwie nieujemne liczby całkowite:
- vi - numer definicji pozycji i-tego wierzchołka trójkąta
- vni - numer definicji wektora normalnego i-tego wierzchołka trójkąta
UWAGA: Numery definicji liczone są od jedynki!
Przykładowy plik
v 0.0 0.0 0.0
v 1.0 0.0 0.0
v 0.0 1.0 0.0
v 1.0 1.0 0.0
vn 0.0 0.0 1.0
f 1//1 2//1 3//1
f 4//1 2//1 3//1
Powyższy fragment opisuje model złożony z dwóch trójkątów o wierzchołkach o współrzędnych:
- 1# trójkąt: (0, 0, 0), (1, 0, 0), (0, 1, 0)
- 2# trójkąt: (1, 1, 0), (1, 0, 0), (0, 1, 0)
Każdy z tych wierzchołków ma ten sam wektor normalny - (0, 0, 1).
Swój program można testować na czajniczku z Utah, bądź stanfordzkim króliku.
Tego typu model można również łatwo stworzyć samemu w Blenderze (eksportując do OBJ zaznacz w opcjach wyłącznie Include Normals i Triangulate Faces)
Model powinien być oświetlony przez jedno kierunkowe źródło światła. Model powinien dać się obracać, i ewentualnie skalować.
Dodatkowe informacje
Na zajęciach każdy powinien mieć przygotowany program rysujący jakąś prostą scenę/model 3D, który będziemy rozszerzać. Jeżeli nie pisałeś(aś) wcześniej czegoś takiego, możesz wykorzystać aplikację z zadania kwalifikacyjnego, lecz zachęcam do uprzedniej zabawy z OpenGL-em w celu lepszego zapoznania się z biblioteką.
W razie pytań - śmiało pisz na maila.
Przydatne materiały:
Polecam następujące biblioteki (ich użycie nie jest, oczywiście, wymagane):
- http://www.glfw.org/ - odpala okienko, przechwytuje input, itp.
- http://glew.sourceforge.net/ - wczytuje rozszerzenia OpenGL-a
- http://glm.g-truc.net/ - biblioteka matematyczna przypominająca funkcje z shaderów
- http://www.lonesock.net/soil.html - prosta biblioteka do ładowania tekstur