2011-12-11

Zmiany w kodzie

Cały kod obecnie odpowiadający za resamplowanie generuje obrazy nie tak dobrej jakości jakby mógł, gdyż zamiast opierać się na prawdziwej odległości pozycji promienia na płaszczyźnie projekcji od pozycji piksela który chcemy zrekonstruować, obecnie najpierw generowana jest bitmapa subpixeli i ona jest reskalowana. Ta metoda ma też inną wadę, wymaga strasznie dużo pamięci. Tak więc wraz z przepisaniem samplowania (zmianie musi ulec sposób generowania próbek) i resamplowania (sposób rekonstrukcji) zamiast bitmapy subpixeli będziemy tylko pamiętali tyle subpixeli ile potrzebne nam jest do przyszłej rekonstrukcji sąsiednich pixeli.

Niejaki przy okazji pojedyńczy obiekt kamery zostanie zastąpiony kolekcją kamer z jedną aktywną. Każda kamera zostanie połączona z obiektem klasy Film. Klasy Film utworzą swoją własną kolekcję, tak więc wiele kamer będzie mogło korzystać z tego samego filmy. Do klasy Film zostanie zaś przeniesione większość opcji z RenderOptions. W tym wszelkie informacje pozwalające zbudować łańcuch postprocesorów obrazu.

InterestRects zostały przeniesione do Filmu. ... I w trakcie zrezygnowałem z tego. Prawie tego nie używałem. Poza tym dla o ile na początku się starałem by rzeczywiście dobrze definiować obszary zainteresowania to później nie miałem już na to sił - liczba testowych scen to już przeszło tysiąc. Poza tym tak naprawdę to w wyniku zmian w kodzie popsuć się może wszystko i wszędzie nie tylko w obszarach zainteresowań.

SceneElement został zastąpiony przez SceneActor. SceneActor to baza dla wszystkich obiektów mogących występować na scenie - posiadających pozycję. ScemeElement jest od teraz klasą bazową dla SceneActor - posiada nazwę i właściwość Scene. Jest też dolnym ograniczeniem parametru generycznego dla ObjectList.

Klasa Material dziedziczy z SceneElement. Klasa MaterialsList dziedziczy z ObjectsList.

Dodałem do kamery dwie nowe metody UVToPixel i PixelToUV. Przestrzeń UV to zawierający się od 0 do 1 zbiór punktów z których może zostać wypuszczony promień. Dla kamer które wysyłają promienie z prostokątnego obszaru płaszczyzny wartość UV nie różnią niczym w sensie znaczenia od koordynatów tekstury. Co innego kiedy dojdą kamery które wysyłają promienie z wycinka walca (panoramiczne) albo z wycinka sfery (tzw. fish-eye). Procedura Camera.CreateRay wymaga do wygenerowania promienia współrzędnych UV.

Samplery generują próbki zawsze w zakresie 0 do 1. Parametry do generacji do liczba wierszy i kolumn. Ich iloczyn to ilość punktów do wygenerowania. Dla samplerów jednorodnych na każdy prostokąt będzie przypadać jedna próbka, dla samplerów niejednorodnych niekoniecznie.

Postprocesory tworzą łańcuch ustalany w runtime. Parametry dla nich (gamma correction, tone mapping) zniknęły z klasy Film. Łańcuch postprocesorów podłączony jest do klasy Film. Na razie zrezygnowałem z utworzenia osobnej kolekcji łańcuchów postprocesorów. Taki łańcuch postprocesorów jest serializowany do xml bezpośrednio.

Parametrami dla postprocesingu jest jest bitmapa wejściowa i wyjściowa. Z reguły mogą być one takie same. Jeśli tak nie jest to od postprocesora wymaga się by podał jaki ma być jej rozmiar. O ile ma się on zmienić. Wymaga się też od niego by prawidłowo przeliczył na nowy obszar prostokątu. Sama klasa odpowiedzialna za wywołania postprocesorów będzie się starała utrzymać taką bitmapę wyjścia do następnego razu aby nie tworzyć ich za każdym razem. Taka bitmapa wyjściowa będzie mu później wielokrotnie w trakcie generowania poszczególnych obszarów przesyłana mu do uzupełnienia tych obszarów i będzie wykorzystana w dalszym łańcuchu. Jeśli postprocesor nie skaluje obrazu bitmapa wyjściowa będzie równa wejściowej. Posprocesor winien w niej zmodyfikować tylko zadany obszar.

Ponieważ kod resamplujący ulegnie zmianie postanowiłem obecny kod, który jest tak naprawdę kodem na zmniejszanie wielkości obrazka o SampleSize przekształcić w uniwersalny postprocesor pozwalający na skalowanie wyrenderowanej bitmapy.

Brak komentarzy:

Prześlij komentarz