Te zajęcia są kontynuacją poprzednich Zalecam wykorzystać ukończony kod z poprzednich zajęć. Projekt startowy jest tylko częściowo ukończonymi zadaniami
Obejrzyj plik Texture.h, aby zapoznać się z interfejsem do obsługi tekstur.
W kolejnych zadaniach będziemy potrzebować trzecią parę shaderów: shader_5_tex.vert i shader_5_tex.frag są one gotowymi shaderami z poprzednich zadań. Wczytaj shadery i przechowaj 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 Core::LoadTexture
. Ta funkcja zwraca adres do wczytanej tekstury, przypisz je do zmiennych z namespace texture
. (odwołanie się do namespace
wykonuje się za pomocą ::, czyli by odwołać się do grid
w namespace
texture
należy napisać texture::grid
)
Stwórz funkcje odpowiadająca 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, żeby uniknąć błędu komunikacji, później dodamy na jej miejsce ładowanie tekstury).
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 shaderaCore::SetActiveTexture
wewnątrz drawObjectTexture()
aby ustawić zmienną sampler2D
na wczytaną wcześniej teksturę.objectColor
) do pokolorowania obiektu:vec4 textureColor = texture2D(~nazwaZmiennejSampler2D, ~nazwaZmiennejWspolrzedneTekstury)
" (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 maskę, 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).