Te zajęcia są kontynuacją poprzednich. Zalecam wykorzystać ukończony kod z poprzednich zajęć. Projekt startowy to tylko częściowo ukończone zadania.
Obejrzyj plik Texture.h, aby zapoznać się z interfejsem do obsługi 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.)
Narysuj jedną z planet za pomocą drawObjectTexture()
, użyj programTex
jako programu.
vertexTexCoord
.out
w vertex shaderze i odpowiadająca jej zmienna in
we fragment shaderze).uniform sampler2D
(nazwij ją na przykład colorTexture
) we fragment shaderze - analogicznie do innych zmiennych typu uniform, służy ona do przesyłania informacji bezpośrednio z kodu C++ do shadera.Core::SetActiveTexture
wewnątrz funkcji drawObjectTexture()
, aby ustawić zmienną sampler2D
na wczytaną wcześniej teksturę.objectColor
) do pokolorowania obiektu:vec4 textureColor = texture2D(~nazwaZmiennejSampler2D, ~nazwaZmiennejWspolrzedneTekstury)
(gdzie vec4
zawiera kolor RGBA).Nadaj jakieś tekstury wszystkim obiektom, które znajdują się w scenie.
W tej części pokażemy, jak wykorzystać więcej niż jedną teksturę przy rysowaniu obiektu na przykładzie zachmurzonej Ziemi.
shader_earth
, skopiuj poprzednie shadery, jakie wykorzystywaliśmy,uniform sampler2D
nazwij go clouds
,clouds.png
, ustaw indeks tekstury na 2,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.
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.
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).
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).