7. Odwzorowywanie tekstur

7.1. Displacement mapping

Bardziej zaawansowaną metodą odwzorowania wypukłości jest metoda displacement mapping, czyli  odwzorowywania przemieszczeń. Wierzchołki renderowanej geometrii (siatki wierzchołków) podlegają modyfikacji zgodnie z mapą przemieszczeń – co pozwala kształtować rzeczywiste wypukłości, zasłaniające się wzajemnie, rzucające cienie itp. – jest to technika znacznie kosztowniejsza niż bump mapping, ale znacznie podnosząca realistyczny wygląd sceny.

Oba zaprezentowane powyżej aplety dawały możliwość tzw. filtrowania tekstur. Bez tej możliwości trudno uzyskać poprawne efekty w sytuacji, gdy wiele tekseli (elementów mapy tekstury) trafia w wyniku odwzorowania w jeden i ten sam obszar obiektu. Dzieje sie tak na przykład przy rzutowaniu perspektywicznym; Kolejny aplet ukazuje najbardziej typową sytuację:

 

Rysunek 51. Różne rodzaje filtrowania tekstur dostępne w OpenGL

 

Rysunek 52. Kolor teksturowanego piksela jest wynikiem obliczenia wartości średniej ważonej kolorów czterech elementów tekstury, które znajdują się najbliżej środka teksturowanego piksela.
Współczynniki wagowe poszczególnych tekseli wyznaczane są w zależności od ich odległości od analizowanego piksela.

 

Może też zdarzyć się sytuacja odwrotna: gdy jeden teksel pokrywa kilka pikseli na ekranie Powyższe efekty odwzorowywania nazywają się, odpowiednio, zmniejszaniem (minifikacją) i powiększaniem (magnifikacją) tekstur:

Rysunek 53, Powiększanie (magnifikacja) i zmniejszanie (minifikacja) tekstur

 

Istnieją też sytuacje, dla których zastosowanie pojedynczej tekstury dla wszystkich obiektów w scenie może powodować pewne problemy jej renderowania. Przykładem takiej sceny może być scena animowana, gdzie rozmiary i kształty obiektów zmieniają się wraz ze zmianą pozycji obserwatora w scenie (jego odległości i kąta patrzenia). Ponieważ tekstury są powiązane z obiektami na które są nakładane, to efekt teksturowania musi być zgodny z zachowaniem obiektów sceny. I tak w miarę zmniejszania się obiektu na ekranie, mapowana tekstura staje się mniej wyraźna i widoczna. Zatem obiekt oddalony od obserwatora, nie musi być wyświetlany z dużą dokładnością (rozdzielczością), ponieważ i tak nie zostanie to zauważone. Z drugiej strony rysowanie odległych obiektów teksturą o dużej rozdzielczości zmniejsza szybkość renderowania sceny.
Aby umożliwić równie szybkie teksturowanie wszystkich obiektów sceny niezależnie od ich rozmiaru i położenia (w stosunku do obserwatora), stosowane są tzw. mipmapy. Termin mippochodzi z łacińskiego "multum in parvo", co oznacza "wiele w małym", w tym wypadku - wiele danych w małej przestrzeni. Mipmapy tworzą zbiór tekstur charakteryzujących się tym, że każda następna (o mniejszym rozmiarze) ma mniejszą rozdzielczość tzn. zawiera mniej informacji o obrazie tekstury. Określają one zestaw tablic przedstawiających ten sam obraz. Mipmapy są tak skonstruowane, że informacje o obrazie zostają upakowane w jak najmniejszym obszarze pamięci, tworząc tzw. piramidę mipmap:

 

Rysunek 54. Piramida mipmap.

 

Podejście takie realizowane jest przez bibliotekę OpenGL, która automatycznie wybiera mniejszą teksturę z piramidy, jesli tylko obraz obiektu się zmniejsza.

Zaawansowany efekt korzystania z tekstur w bibliotece OpenGL przedstawia ostatni, najbardziej rozbudowany aplet przedstawiający układ słoneczny. Aplet prezentuje wiele z poprzednio omówionych zagadnień:

  • Oświetlenie (słońce jest źródłem punktowym światła)
  • Teksturowanie
  • Filtrowanie (mipmapy)
  • Przezroczystość (pierścienie planet)

Rysunek 55 Układ słoneczny.