Bump mapping

Program do ściągnięcia

Powyższy odnośnik wskazuje na program, który realizuje efekt zwany bump mapping. Program można skompilować poleceniem make. Powstanie plik wykonywalny o nazwie program. Efekt bump mapping polega na dodaniu do obrazka oświetlonych wypukłości. Działa on na dwóch obrazkach. Pierwszy jest mapą wypukłości. Im jaśniejszy piksel na tym obrazku, tym większa wypukłość w tym miejscu. Drugi obrazek, zwany teksturą jest obrazkiem, który nakładamy na wypukłości.

Ogólnie, jasność piksela w obrazku wynikowym zależy od nachylenia wypukłości w danym miejscu oraz od kąta padania promieni światła. Obliczenia w programie przykładowym są uproszczone i zapewne daleko im do rzeczywistości. Miarą nachylenia są różnice wysokości między pikselem a jego dolnym i prawym sąsiadem. Różnice te są mnożone przez współczynniki zależne od położenia piksela względem środka oświetlonego obszaru. Współczynniki te z kolei są obliczane przed rozpoczęciem wyświetlania animacji i zapisywane w tablicach light_map.

Zadanie

Zadanie polega na zoptymalizowaniu procedury rysującej efekt. Można, a nawet należy korzystać z rozszerzenia MMX. Nie można korzystać z rozszerzenia SSE, a w szczególności z rozkazów operujących na spakowanych liczbach zmiennoprzecinkowych.

Uzupełnienie: Powyższe ograniczenia nie dotyczą procedury inicjującej. Można więc tam używać arytmetyki zmiennoprzecinkowej.

Nie jest istotna efektywność inicjacji, jednak proszę nie przesadzać, program powinien uruchamiać się w co najwyżej kilka sekund. Program przykładowy nie ustawia źródła światła w zbyt wielu położeniach i na jego potrzeby można by zawczasu obliczyć obrazki ze wszystkimi potrzebnymi położeniami źródła światła. Proszę jednak napisać procedurę tak, aby działała dla dowolnych wartości x i y, przy których całe oświetlone pole mieści się na ekranie.

Dopuszczalne są zakłócenia wynikające z przekroczenia zakresu w miejscach, gdzie wysokość sąsiednich pikseli (czyli ich jasność w mapie wypukłości) przekracza 64.

Forma

Rozwiązania powinny być zawarte w plikach bump2.c i bump_asm.asm gotowych do zastąpienia plików o takich samych nazwach w udostępnionym archiwum. Można założyć, że definicje stałych w pliku bump.h nie zostaną zmienione. Załączony plik Makefile kompiluje program asemblerem NASM. Można jednak nadsyłać rozwiązania w składni asemblera GNU.

Punktacja

Za program działający tak jak załączony, ale szybciej, można zdobyć do 8 punktów. Można sobie uprościć zadanie pomijając w obliczeniach teksturę i rysując efekt tak, jakby wszystkie piksele tekstury miały jednakowy kolor. Za takie rozwiązanie można zdobyć do 5 punktów.

Cztery dodatkowe punkty można zdobyć za wprowadzenie w ruch mapy wypukłości. Proponuję obracać ją względem osi prostopadłej do ekranu i przechodzącej przez jego środek. Wystarczy proste obracanie, bez filtrowania. Rozszerzenie MMX chyba nie okaże się pomocne przy obracaniu, dlatego nie trzeba go używać. Nie trzeba też kodować obracania w asemblerze.

Uzupełnienie: Moim zamiarem było by to zadanie było ćwiczeniem na MMX. Będę premiował jego użycie, więc warto rozwiązać zadanie z wykorzystaniem MMX nawet, jeśli miałoby to być rozwiązanie nieco wolniejsze od innych. Oczywiście ma to być sensowne użycie MMX, czyli takie, w którym rzeczywiście pewne rozkazy wykonują parę potrzebnych operacji jednocześnie.

Sposób oddania

Rozwiązania proszę nadsyłać na adres tmal@mimuw.edu.pl do poniedziałku 29 maja do godziny 12:00 w południe. Rozwiązania nadesłane z opóźnieniem mogą zostać ocenione niżej.