Gry komputerowe
Informatyka S1 - 2017/2018

Szczecin Gamedev Talents 2018

Zwycięzcy konkursu Szczecin Gamedev Talents 2018
(galeria zdjęć z rozdania nagród)

Więcej informacji o konkursie na dole strony.

Terminy

Poniżej lista ważnych terminów związanych z zaliczeniem przedmiotu.

Zaliczenie wykładu

Zaliczenie zajęć projektowych

Zaliczenie projektu

Gotową grę należy zaprezentować prowadzącemu zajęcia. Podczas prezentacji zostanie przeprowadzona rozmowa o użytych rozwiązaniach technicznych, na podstawie której zostanie zaproponowana ocena. Następnie należy przesłać paczkę ze źródłami gry. Dopiero wówczas ocena zostanie finalnie wystawiona.

Czego NIE zawierać w paczce z kodami źródłowymi?

Przesyłając komuś kod źródłowy projektu, absolutnie nie należy załączać pliku *.sdf (ogromna baza danych tworzona przez VS, ona i tak zostanie odtworzona na docelowym komputerze), katalogu ipch (precompiled headers), całej postaci skompilowanej i pośredniej (katalogi Debug, Release oraz nazwa_projektu/Debug, nazwa_projektu/Release), plików z ustawieniami użytkownika (pliki *.user, *.suo).

Pomijając zbędne pliki można zredukować rozmiar źródeł nawet o kilkadziesiąt megabajtów.

Wykłady

  1. Wprowadzenie. Synteza trójwymiarowej grafiki czasu rzeczywistego. OpenGL. Transformacje geometryczne. 2018-03-06

    Wykład 1 - Prezentacja w formacie PDF

  2. Wyświetlanie obrazu. Bufor klatki. Synchronizacja pionowa. Pętla główna gry. Kamera. Test głębokości. 2018-03-20

    Wykład 2 - Prezentacja w formacie PDF

    Game loop - Przykład różnych implementacji pętli głównej

  3. Oświetlenie. Potok renderowania. Techniki oświetlenia i cieniowania. 2018-04-10

    Wykład 3 - Prezentacja w formacie PDF

  4. Zaawansowane oświetlenie. Definiowanie geometrii. Backface culling. Renderowanie mapy wysokości. 2018-04-20, 2018-04-23

    Wykład 4 - Prezentacja w formacie PDF

  5. Tekstury. Pojęcie tekstury, potok teksturowania, zastosowania.2018-05-14

    Wykład 5 - Prezentacja w formacie PDF

  6. Scena i kolizje. Organizacja sceny. Techniki optymalizacji renderowania. Wykrywanie i reakcja na kolizje.2018-05-19

    Wykład 6 - Prezentacja w formacie PDF

Materiały na zajęcia projektowe

  1. Zajęcia projektowe 0
    Budowanie projektu korzystającego z OpenGL i GLUT/freeglut

    Podczas zajęć wprowadzających poruszona zostanie kwestia dołączenia biblioteki freeglut do projektu w środowisku programistycznym MS Visual Studio. Omówione zostaną dobre praktyki korzystania z tego środowiska.

    Oczekiwany wynik działania poprawnie zbudowanego programu z załączonego projektu:

    Wynik działania programu

    Materiały

  2. Zajęcia projektowe 1
    Transformacje geometryczne

    Na zajęciach omówione zostaną podstawy użycia OpenGL. Zbudowana zostanie prosta, złożona z kilku brył scena.

    Sposoby programowania grafiki z użyciem OpenGL które będą wykorzystywane na zajęciach nie odpowiadają współczesnemu podejściu. Jest to celowe i ma charakter edukacyjny - tzw. immediate mode i fixed pipeline, choć archaiczne, są dużo łatwiejsze do zrozumienia i pozwalają na bardziej bezstresowe zrobienie pierwszych kroków w dziedzinie grafiki komputerowej czasu rzeczywistego.

    Zainteresowanych podejściem współczesnym odsyłam do dokumentacji nowego OpenGL (wersja 3.2 i nowsze) i np. do bardzo dobrej książki Real-Time Rendering. Third edition. Akenine-Muellera, Hainesa i Hoffmana.

    Zadanie nr 1

    Zadaniem do wykonania na pierwszych laboratoriach jest utworzenie animowanego "pajacyka" składającego się z kilku prostych brył. Sugerowane jest posłużenie się załączonym projektem, jako punktem wyjściowym.

    Poniżej przedstawiono oczekiwany wygląd wykonanego zadania, w dwóch wersjach zależnych od ambicji wykonującego:

    Materiały

    Układ współrzędnych w OpenGL

    Rysunek, który jest często bardzo pomocny dla poprawnego wyobrażenia sobie struktury sceny:

    Układ współrzędnych w OpenGL

  3. Zajęcia projektowe 2
    Kamera FPP, obsługa wejścia z klawiatury

    Zajęcia będą obejmowały zagadnienie kontroli kamery pierwszoosobowej (FPP - First-Person Perspective). Poruszone zostaną kwestie związane z podstawową obsługą wejścia od użytkownika.

    Zadanie nr 2

    Zadaniem jest zaimplementowanie działania interaktywnej kamery pierwszoosobowej.

    • Wesja podstawowa
      • Kontrola ruchu za pomocą klawiatury: ruch do przodu, do tyłu, na boki
      • Kontrola obrotu wokół jednej osi za pomocą klawiatury
      • Wykorzystanie gluLookAt(...)
      • Poprawna obsługa repetycji klawiszy
      • Mile widziana inercja - ruch kamery nie zatrzymujący się natychmiastowo, ale płynnie wygasający

      Lab2 - Wersja podstawowa (Youtube)

    • Wesja zaawansowana

      To co wersja podstawowa, a także:

      • obrót wokół dwóch osi (przydadzą się współrzędne sferyczne)
      • obrót kontrolowany z użyciem myszy (przydatne: glutWarpPointer(x, y), glutSetCursor(GLUT_CURSOR_NONE), glutPassiveMotionFunc(f))

      Lab2 - Wersja zaawansowana (Youtube)

    Materiały

  4. Zajęcia projektowe 3
    Oświetlenie

    Celem zajęć jest poznanie podstawowych technik cieniowania z użyciem nieprogramowalnego potoku renderowania OpenGL (fixed pipeline).

    Fixed pipeline pozwala jedynie na uzyskanie cieniowania płaskiego per face lub gładkiego per vertex, gdzie dla drugiego z nich wynik jest obliczany dla każdego wierzchołka, po czym jest on interpolowany pomiędzy tymi wierzchołkami. Jest to tzw. cieniowanie Gouraud. Daje to kiepskie efekty wizualne szczególnie dla komponentu specular.

    Współcześnie standardem jest stosowanie lepszego jakościowo cieniowania per fragment (per pixel), a więc obliczanie koloru na podstawie modelu oświetlenia dla każdego fragmentu osobno, po uprzedniej interpolacji wektora normalnego. Ten rodzaj cieniowania, nazywany cieniowaniem Phonga (lub z małym uproszczeniem Phonga-Blinna), można jednak uzyskać tylko korzystając z programowalnego potoku renderowania, w oparciu o własne programy cieniujące wykonywane na karcie graficznej, tzw. shadery które wykraczają poza materiał przerabiany na laboratoriach w ramach tego przedmiotu (jednak gorąco zachęcam do zapoznania się z tą techniką).

    Zadanie nr 3

    Zadaniem jest umieszczenie na scenie różnych, zmieniających się źródeł światła.

    • Wesja podstawowa
      • Dwa źródła światła: directional i pointlight
      • Wykorzystanie komponentów ambient/diffuse
      • Wygaszanie światła (attenuation)
      • Kontrola położenia źródła światła - poddanie jego pozycji transformacjom geometrycznym, np. związanie jednego ze źródeł z położeniem gracza
      • Zmienność źródeł światła (np. zmiana koloru, jasności, kierunku, wygaszania)
      • Mile widziane zastosowanie w bardziej złożonym środowisku - jak w przykładzie

      Lab3 - Wersja podstawowa (Youtube)

    • Wesja zaawansowana

      To co wersja podstawowa, a także:

      • Świadome użycie komponentu specular
      • Światło typu spotlight
      • Przemyślane użycie światła dla celów estetycznych

      Lab3 - Wersja zaawansowana (Youtube)

    Materiały

  5. Zajęcia projektowe 4
    Definicja własnej geometrii

    Podczas zajęć omówione zostaną sposoby definiowania własnych brył z użyciem OpenGL i tzw. immediate mode. Choć zaawansowaną geometrię zazwyczaj modeluje się za pomocą specjalistycznego oprogramowania (np. Blender), następnie jedynie importując gotowy model, to wiedza o podstawach i wyobraźnia przestrzenna są mimo wszystko niezmiernie przydatne. Dlatego te zajęcia będą dotyczyły opisywania kształtów "ręcznie".

    Zadanie nr 4

    Zadaniem jest umieszczenie na scenie własnej, nieskomplikowanej, poprawnie oświetlonej bryły.

    • Wesja podstawowa
      • Własna bryła zawierająca zarówno krawędzie "ostre", jak i "gładkie"
      • Poprawnie zdefiniowane wektory normalne, pozwalające na poprawne oświetlenie bryły
      • Poprawne rysowanie bryły przy włączonym cullingu
      • Wstawienie wielu instancji bryły na scenie, posługując się transformacjami

      Lab4 - Przykładowa wersja podstawowa (Youtube)

    • Wesja zaawansowana

      To co wersja podstawowa, a także:

      • Niezależny ruch części bryły
      • Wstawianie wielu instancji w sposób efektywny, tj. bez każdorazowego przekazywania współrzędnych wierzchołków (np. przy użyciu Display List, Vertex Array, VBO)

      Lab4 - Przykładowa wersja zaawansowana (Youtube)

    Materiały

  6. Zajęcia projektowe 5
    Teksturowanie, import modeli

    Zadanie nr 5

    Zadaniem jest oteksturowanie niestandardowej bryły z użyciem dopasowanej do jej geometrii tekstury (najlepiej własnej).

    • Wesja podstawowa
      • Nałożenie niestandardowej tekstury na niestandardową bryłę
      • Tekstura musi być czymś więcej, niż jednolitym wzorem - chodzi o to, by była dopasowana do bryły, np. poprzez umieszczenie na niej elementów w świadomy sposób odpowiadających kształtowi. Tak, by nie było wątpliwości że współrzędne tekstury zostały dobrane celowo
      • Technika filtracji tekstury ma zostać wybrana w sposób świadomy

      Lab5 - Przykładowa wersja podstawowa (Youtube)

    • Wesja zaawansowana

      To co wersja podstawowa, a także:

      • Kilka poprawnie oteksturowanych brył/obiektów o skomplikowanej formie, np. zamodelowanych wcześniej w Blenderze
      • Mile widziany teren, skybox/skydome, mgła, etc.

      Lab5 - Przykładowa wersja zaawansowana (Youtube)

    Materiały

  7. Zajęcia projektowe 6
    Wykrywanie kolizji gracza z mapą

    Przykład dotyczy wykrywania i reakcji na kolizję gracza z elementami świata.

    Wykrywanie kolizji jest rzeczą zupełnie odrębną od renderowania sceny. Wymaga własnoręcznego zaimplementowania całego mechanizmu: przechowywania informacji o obiektach (bryłach na potrzeby wykrywania kolizji - nie muszą wcale pokrywać się z tym, co jest rysowane!), algorytmów wykrywania czy zaistniała pomiędzy obiektami kolizja (obliczenia matematyczne), oraz algorytmów służących do uzyskania pożądanej reakcji na zaistniałe kolizje (zmiana kierunku ruchu, wybuch, uszkodzenie, zdobycie punktów...).

    OpenGL nie służy do wykrywania kolizji, nie będzie tutaj pomocny. Wykrywanie kolizji należy napisać własnoręcznie.

    Prezentowana tutaj przykładowa implementacja powinna służyć jako inspiracja. Zamiast zwyczajnie kopiować ją do swojego projektu, należy ją przeanalizować, dostosować do swojej gry, udoskonalić.

    Elipsoida

    Gracz jest reprezentowany przez elipsoidę. Jest to o tyle wdzięczna bryła, że za pomocą prostej transformacji przestrzeni świata możemy doprowadzić do sytuacji, w której elipsoida staje się kulą o promieniu długości 1. Wówczas wszelkie obliczenia stają się dużo prostsze, a jednocześnie sama bryła (po powrocie do pierwotnej przestrzeni) wciąż pozwala nam na przybliżenie gracza w sposób "wydłużony" w pionie, co jest często przydatne w realnych zastosowaniach. Dodatkowo kształt ułatwia "wspinanie się" po niewielkich przeszkodach, schodach i pochyłych powierzchniach.

    Elipsoidę definiujemy za pomocą długości trzech promieni, odpowiadających kolejno osiom układu współrzędnych (w wersji przykładowej - współrzędnych świata, nieobracających się wraz z graczem, przez co Rx i Rz powinny być równe).

    Przykładowy projekt

    Projekt (GKiW_Lab6) przedstawia implementację systemu dynamicznego wykrywania kolizji elipsoidy z wielokątami (w załączonej scenie - z czworokątami). Jest to w niewielkim stopniu zmodyfikowana implementacja techniki opisanej przez Fauerby'ego (Improved Collision detection and Response). Gracz ma możliwość swobodnego poruszania się po terenie ograniczonym ścianami. Może też wspiąć się na niewielką przeszkodę.

    Użycie tej implementacji obsługi kolizji w swojej grze będzie skutkować bardzo wnikliwymi pytaniami nt. sposobu jej działania, które padną podczas oddawania projektu. To nie jest gotowe rozwiązanie tylko przykład!

    Sposób reakcji na kolizje jest niedoskonały. Praktycznie we wszystkich grach stosuje się w tym obszarze różnego rodzaju uproszczenia i hacki, jak np. każdorazowe odsuwanie o stały offset od powierzchni ściany. Zachęcam do podjęcia próby rozwinięcia całego algorytmu tak, aby reakcje były pozbawione nieprzyjemnego skakania przy jednoczesnym braku możliwości napotkania tzw. efektu tunelowania, czyli niepoprawnego przechodzenia przez przeszkody (przy odpowiednim rozmachu i uniwersalności zaproponowanego rozwiązania mogłaby z tego powstać przyzwoita praca inżynierska).

    Cały projekt z racji swojej większej złożoności posiada bardziej rozwiniętą niż dotychczasowo architekturę. Jego struktura opiera się na idei użycia sceny jako podstawowego elementu hierarchii elementów świata oraz wprowadzenia posiadającego wspólny korzeń drzewa klas dla wszystkich elementów świata. Jest to podejście, które daje dużo większą elastyczność kodu i możliwość jego łatwej rozbudowy. Polecam zastosowanie podobnego (lub lepszego) rozwiązania w swoich projektach.

    Materiały

Zasady zaliczenia przedmiotu

Kontakt

dr inż. Bartosz Bazyluk
bartosz@bazyluk.net

Przewiń do...