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ęć

320px-Elephants_Dream_-_Emo_and_Proog.jpg

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):

O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License