Pisanie aplikacji graficznych w nowoczesnym OpenGL
Prowadzący: Jakub Szewczyk, Grzegorz Uriasz
Opis
Aby efektywnie korzystać z możliwości karty graficznej należy skorzystać z API takiego jak OpenGL. Pierwsza wersja OpenGL (1.0) powstała 24 lat temu - wtedy też powstawały pierwsze FPS-y takie jak Doom. Z biegiem czasu wydajność komputerów jak i złożoność scen 3D rosły. Przeanalizujmy nowoczesną typową grę FPS - 2 miliony pikseli, miliony trójkątów, realistyczne oświetlenie, realistyczna fizyka i to 60 razy na sekundę! Aby osiągnąć takie wyniki obliczeniowe należy użyć mocnej karty graficznej ale i też sprytnego programowania.
W internecie można znaleźć bardzo dużo przystępnych podręczników i kursów do klasycznego OpenGLa (1.0-2.1), natomiast o wersji nowszej - 3.0 i w górę, która ma diametralnie inny sposób programowania - jest znacznie mniej informacji. Podstawą współczesnych kart graficznych są programowalne jednostki cieniujące, które wykonują zestaw instrukcji na gigantycznych ilościach danych (z tego potem zrodziła się CUDA i OpenCL), jest to zupełnie inny układ niż kilkanaście lat temu, kiedy wszystkie operacje były ściśle określone i zaimplementowane w krzemie jako tzw. “fixed pipeline”, a razem z układami GPU zmieniło się też API, dlatego właśnie chcemy skupić się na najnowszych wersjach OpenGLa.
Podczas warsztatów stworzone zostaną aplikacje demonstrujące różne możliwości wykorzystania OpenGLa 3, krok po kroku od tworzenia okna i wyświetlenia pierwszego trójkąta, do całkiem zaawansowanych scen z oświetleniem i terenem, wszystko zależnie od tego, jak szybko będzie szła praca :-)
Wymagania
Wymagane cechy i umiejętności:
- Podstawy rachunku macierzowego i wektorowego (przygotujemy skrypt z wymaganą wiedzą matematyczną)
- Iloczyn skalarny i wektorowy
- Mnożenie macierzy przez wektor
- Mnożenie macierzy przez macierze
- Wektory w współrzędnych jednorodnych (4-komponentowe)
- Macierze translacji, obrotu, skalowania
- Sprawne programowanie w języku programowania, dla którego istnieją bindingi do bibliotek OpenGL, GLFW3 i ASSIMP (zalecane C++/D)
- Bardzo zalecany własny komputer z odpowiednimi sterownikami i kartą graficzną (OpenGL 3.0 minimum, najlepiej 3.3 albo więcej), mile widziany system Linux
- Zainstalowany kompilator, CMake i biblioteki GLFW3 i ASSIMP
- https://cmake.org/download/
- http://www.glfw.org/
- http://www.assimp.org/
Przewidywany plan warsztatów (ze sporym zapasem)
Część punktów jest opcjonalnych i zrealizujemy je w takiej kolejności, na jaką będzie chęć i zapotrzebowanie
-
Tworzenie kontekstu OpenGLa w GLFW3, obsługa podstawowych zdarzeń - ogólny szkielet programu do dalszych zadań
-
Omówienie formatów danych przyjmowanych przez GPU i sposobu ich przesyłania - VA, obiekty buforów, VAO
-
Napisanie i kompilacja bardzo podstawowych shaderów - rysowanie trójkąta na środku ekranu
-
Proste transformacje macierzowe - trójkąt obracający się/zmieniający rozmiar i położenie za pomocą shaderów i uniformów
-
Łączenie prymitywów w bryły - piramida, sześcian, ale jeszcze bez projekcji
-
Wprowadzenie macierzy projekcyjnej - ortogonalnej i perspektywicznej
-
Obroty i transformacje w 3D
-
Kamera FPS
-
Blending - półprzejrzyste obiekty
-
Dodanie teksturowania
-
Wczytywanie modelu z pliku obj (z pomocą jakiejś zewnętrznej biblioteki), np. Utah teapot
-
Dodanie oświetlenia - światło otoczenia, diffuse Lamberta i specular Phonga
-
Skybox - renderowanie w “nieskończoności”
-
Lustrzane obiekty za pomocą cubemapy
-
Wprowadzamy romantyczną atmosferę - mgła
-
Trochę efektów specjalnych - punkty jako cząsteczki, na przykładzie ognia
-
Krajobraz za pomocą mapy wysokości, zrobiony w shaderach
-
Framebuffery - renderowanie na teksturę i efekty z tym związane
-
Jak zdążymy to shadowmapping i wspomnienie o innych metodach dodawania cieni
-
O technikach AZDO - pisania bardzo efektywnego kodu OpenGLa (Approaching Zero Driver Overhead)
Instalacja biblioteki GLFW3 na systemach Linux
http://www.glfw.org/download.html
Arch Linux: sudo pacman -S glfw
Debian: sudo apt-get install libglfw3-dev
Ubuntu: sudo apt-get install libglfw3-dev (Dostępne od wersji wily)
Ręczna kompilacja i instalacja (względnie prosta): http://www.glfw.org/docs/latest/compile.html
Osoby chcące pracować pod systemem Windows proszone są o upewnienie się, że ten program kompiluje się i uruchamia:
Example code z http://www.glfw.org/documentation.html
Instalacja biblioteki ASSIMP na systemach Linux
http://www.assimp.org/main_downloads.html
Arch Linux: sudo pacman -S assimp
Debian: sudo apt-get install libassimp-dev
Ubuntu: sudo apt-get install libassimp-dev (Dostępne od wersji wily)