Sferyczne mapowanie środowiska (ang. Sphere Environment Mapping) jest szybko metodą na dodanie odbicia na powierzchniach metalicznych. Chociaż nie jest ono tak dokładne jak w rzeczywistości, albo jak sześcienne mapowanie środowiska (ang. Cube Environment Mapping), to jest o niebo szybsze! Jako szablonu użyjemy lekcji osiemnastej o kwadrykach. Nie wykorzystamy jednak tych samych tekstur - użyjemy mapowania sferycznego i jednej tekstury na tło.
Zanim zaczniemy... The Red Book definiuje mapowanie sferyczne jako obraz sceny na metalowej kuli z nieskończoności do punktu centralnego. Takie coś jest niemożliwe w rzeczywistości. Najlepszą metodą jaką znalazłem na stworzenie dobrej mapy sferycznej bez używania 'rybiego oka' jest użycie programu Adobe Photoshop.
Tworzenie mapy sferycznej w Photoshop'ie
Potrzebujesz obrazka środowiska, które ma się odbijać w kuli. Otwórz obraz w Photoshop'ie i go zaznacz. Skopiuj obraz, po czym utwórz nowy PSD (format Photoshop'a) tego samego rozmiaru. Wklej obrazek w nowe miejsce. Robimy tak, żeby Photoshop mógł nałożyć swoje filtry. Zamiast kopiować, możesz wybrać menu rozwijane i wybrać tryb RGB. Wszystkie filtry powinny być wtedy dostępne.
Teraz musimy przeskalować obrazek, żeby jego wymiary były potęgą dwójki (zobacz lekcję 6.). Pod menu obrazka wybierz rozmiar obrazka, odznacz zachowanie proporcji i zmień jego rozmiary na poprawne. Jeżeli masz obrazek 100x90 to wybierz raczej 128x128 niż 64x64. Zmniejszając obrazek tracisz szczegóły.
Ostatnią rzeczą jaką musisz zrobić to wybrać menu filtrów, wybierz zniekształcenie i nałóż modyfikator sferyczny. Powinieneś zobaczyć, że środek obrazka wybuchł jak balon, teraz w normalnej mapie sferycznej obszar zewnętrzny będzie czarny, ale to nie ma znaczenia. Zapisz kopię obrazka jako bitmapę i zaczynamy kodzić!
Nie dodajemy żadnej zmiennej globalnej tym razem, a jedynie modyfikujemy liczbę tekstur na 6.
Teraz zmodyfikujemy funkcję LoadGLTextures() tak, że możemy załadować 2 tekstury i stworzyć 3 filtry. Wykonujemy dwa obiegi pętli tworząc 3 tekstury z różnymi opcjami filtrowania. Prawie cały kod jest nowy lub zmodyfikowany.
Zmodyfikujemy kod rysujący sześcian. Zamiast używać -1.0 i 1.0 dla normalnych, użyjemy 0.5 i -0.5. Zmieniając te wartości możesz przybliżać i oddalać odbicie. Im większa normalna tym odbijany obrazek będzie większy i może gorzej wyglądać. Przez ustawienie normalnych na 0.5 i -0.5 zapobiegamy temu zjawisku, bo odbijany obraz jest dalej. Ustawienie zbyt małych normalnych stworzy obraz mniej wyraźny.
Teraz, w InitGL(), dodajemy dwa nowe wywołania funkcji. Ustawiają one sposób generowania współrzędnych tekstury na mapowanie sferyczne. Współrzędne tekstury S, T, R i Q odpowiadają współrzędnym x, y, z, w. Jeżeli używasz tekstur jednowymiarowych (1D) to użyjesz współrzędnej S. Jeżeli dwuwymiarowych to S i T.
Poniższy kod mówi OpenGL, żeby automatycznie wygenerował współrzędne tekstury bazują na formule mapowania sferycznego. Współrzędny R i Q są zwykle ignorowane. Współrzędna Q może być wykorzystana do zaawansowanego teksturowania korzystając z rozszerzeń. Współrzędna R może okazać się przydatna kiedy mapowanie tekstur 3D zostało dodane do OpenGL, ale na razie zignoruj koordynaty R i Q. Współrzędna S działa poziomo, a współrzędna T pionowo wzdłuż ściany naszego wielokąta
Prawie skończyliśmy! Teraz wszystko co musimy zrobić to ustawić rendering. Usunąłem pare kwadryk, ponieważ nie chciały współpracować z mapowaniem środowiska. Pierwsza rzecz, jaką robimy to włączenie generowania tekstury. Następnie wybieramy odbijaną teksturę (mapę sferyczną) i rysujemy nasze obiekty. Po tym wyłączamy generowanie tekstur, bo wszystko zostanie wymapowane sferycznie :) Wyłączamy mapowanie sferyczne przed narysowaniem tła sceny. Zauważysz pewnie, że bindowanie tekstury wygląda trochę bardziej złożenie. Wszystko co robimy to wybór filtra, którego użyjemy podczas rysowania map sferycznych lub tła.
Ostatnia rzecz jaką robimy to uaktualnienie sekcji ze spacją, żeby zmieniała mapowane sferycznie kwadryki. (Usunęliśmy dysk)
Podczas zamykania programu koniecznie trzeba usunąć kwadryki, żeby nie doszło do wycieków pamięci
Skończyliśmy! Teraz umiesz zrobić kilka imponujących rzeczy z mapowaniem środowiska jak np. tworzenie prawie dokładnego odbicia pokoju! Planowałem pokazać sześcienne mapowanie środowiska, ale moja karta graficzna go nie wspiera :( może za miesiąc, jak kupię GeForce'a 2 :) Jeżeli coś w tej lekcji jest niedokładnie wyjaśnione to napisz do mnie albo do NeHe.
Dziękuję i życzę powodzenia!
Odwiedź moją stronę: http://www.tiptup.com/