Teksturowanie

Te zajęcia są kontynuacją poprzednich. Zalecam wykorzystać ukończony kod z poprzednich zajęć. Projekt startowy to tylko częściowo ukończone zadania.

Zadanie

Obejrzyj plik Texture.h, aby zapoznać się z interfejsem do obsługi tekstur.

Przygotuj shadery i załaduj teksturę:

W kolejnych zadaniach będziemy potrzebować trzeciej pary shaderów: shader_5_tex.vert i shader_5_tex.frag. Są to gotowe shadery z poprzednich zadań. Wczytaj shadery i przechowuj adres programu pod zmienną globalną programTex.

Pod namespace texture znajdują się zmienne globalne typu GLuint, które będą przechowywać adresy tekstur. W funkcji init() załaduj tekstury z folderu textures przy pomocy funkcji Core::LoadTexture. Ta funkcja zwraca adres wczytanej tekstury, przypisz je do zmiennych w namespace texture. (Aby odwołać się do grid w namespace texture, użyj texture::grid.)

Stwórz funkcję odpowiedzialną za rysowanie teksturowanych obiektów. Skopiuj funkcję drawObjectColor. Nazwij kopię drawObjectTexture() i zmodyfikuj ją tak, aby przyjmowała jako parametr identyfikator tekstury, a nie wektor koloru. (Usuń w niej linijkę odpowiadającą za przesyłanie koloru, aby uniknąć błędu komunikacji, później dodamy ładowanie tekstury na jej miejsce.)

Zmodyfikuj shader, aby nakładał teksturę na obiekt:

Narysuj jedną z planet za pomocą drawObjectTexture(), użyj programTex jako programu.

  1. Prześlij współrzędne mapowania tekstur z vertex shadera do fragment shadera.
  1. Prześlij teksturę do fragment shadera:
  1. Użyj wartości uzyskanej z tekstury zamiast koloru (objectColor) do pokolorowania obiektu:

Pobaw się mechanizmem teksturowania:

Zadanie *

Nadaj jakieś tekstury wszystkim obiektom, które znajdują się w scenie.

Multitexturing

W tej części pokażemy, jak wykorzystać więcej niż jedną teksturę przy rysowaniu obiektu na przykładzie zachmurzonej Ziemi.

Zadanie

Wykorzystamy teksturę chmur jako maskę. Ustaw kolor Ziemi jako mix między białym a kolorem tekstury Ziemi, a za współczynnik mieszania weź kanał r tekstury chmur.

Zadanie*

W podobny sposób wykorzystaj tekstury ship.jpg, scratches.jpg i rust.jpg, żeby dodać zarysowania do statku. Załaduj wszystkie trzy tekstury, użyj scratches.jpg jako maski, która będzie wskazywała współczynnik, którym będziemy mieszać pomiędzy dwoma pozostałymi teksturami.

Teksturowanie proceduralne

  1. Stwórz czwartą parę plików z shaderami (np. shader_proc_tex.vert i shader_proc_tex.frag). Następnie zainicjalizuj program jak w I.6.a) i II.1.a) (nazwij go np programProcTex). Do wywołania rysowania wykorzystuj funkcję drawObject (Żeby nie tracić oteksturowanych planet, możesz rysować za ich pomocą wyłącznie statek).

  2. Prostym sposobem proceduralnego teksturowania, jest uzależnienie koloru od pozycji piksela w przestrzeni lokalnej (użycie przestrzeni świata spowodowałoby, że wzór na obiekcie zmieniałby się przy poruszaniu go).