Pisanie aplikacji graficznych w nowoczesnym OpenGL

Prowadzący: Jakub Szewczyk, Grzegorz Uriasz


Zadania kwalifikacyjne:
Kategorie:
informatyka

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:

  1. Podstawy rachunku macierzowego i wektorowego (przygotujemy skrypt z wymaganą wiedzą matematyczną)
    1. Iloczyn skalarny i wektorowy
    2. Mnożenie macierzy przez wektor
    3. Mnożenie macierzy przez macierze
    4. Wektory w współrzędnych jednorodnych (4-komponentowe)
    5. Macierze translacji, obrotu, skalowania
  2. Sprawne programowanie w języku programowania, dla którego istnieją bindingi do bibliotek OpenGL, GLFW3 i ASSIMP (zalecane C++/D)
  3. 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
  4. Zainstalowany kompilator, CMake i biblioteki GLFW3 i ASSIMP
    1. https://cmake.org/download/
    2. http://www.glfw.org/
    3. 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

  1. Tworzenie kontekstu OpenGLa w GLFW3, obsługa podstawowych zdarzeń - ogólny szkielet programu do dalszych zadań

  2. Omówienie formatów danych przyjmowanych przez GPU i sposobu ich przesyłania - VA, obiekty buforów, VAO

  3. Napisanie i kompilacja bardzo podstawowych shaderów - rysowanie trójkąta na środku ekranu

  4. Proste transformacje macierzowe - trójkąt obracający się/zmieniający rozmiar i położenie za pomocą shaderów i uniformów

  5. Łączenie prymitywów w bryły - piramida, sześcian, ale jeszcze bez projekcji

  6. Wprowadzenie macierzy projekcyjnej - ortogonalnej i perspektywicznej

  7. Obroty i transformacje w 3D

  8. Kamera FPS

  9. Blending - półprzejrzyste obiekty

  10. Dodanie teksturowania

  11. Wczytywanie modelu z pliku obj (z pomocą jakiejś zewnętrznej biblioteki), np. Utah teapot

  12. Dodanie oświetlenia - światło otoczenia, diffuse Lamberta i specular Phonga

  13. Skybox - renderowanie w “nieskończoności”

  14. Lustrzane obiekty za pomocą cubemapy

  15. Wprowadzamy romantyczną atmosferę - mgła

  16. Trochę efektów specjalnych - punkty jako cząsteczki, na przykładzie ognia

  17. Krajobraz za pomocą mapy wysokości, zrobiony w shaderach

  18. Framebuffery - renderowanie na teksturę i efekty z tym związane

  19. Jak zdążymy to shadowmapping i wspomnienie o innych metodach dodawania cieni

  20. 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)