All blog entries, ordered from most recent. Entry count: 1198.
# Generowanie liczb pseudolosowych
Fri
20
Jun 2008
Wczorajszy wieczór spędziłem na zajmowaniu się liczbami pseudolosowymi. Ogólne wnioski: Są różne algorytmy. Do kryptografii potrzebne są wyjątkowo dobre i istnieją różne hardcore'owe metody ich badania, ale w zwykłym programowaniu nie trzeba aż tak kombinować.
Popularnym algorytmem jest Linear congruential generator, który działa wg wzoru: x[i] = (x[i-1] * a + c) mod m. Z niego korzystają biblioteki standardowe w popularnych kompilatorach C, C++, Delphi. Działa szybko, ale ma słabo losowe młodsze bity.
Napisałem sobie program pozwalający oceniać generatory liczb pseudolosowych metodą organoleptyczną ;) czyli wizualizując wyniki - wartości, rozkład wartości oraz poszczególne bity generowanych liczb. (Przy okazji przekonałem się, jak beznadziejną i pełną błędów biblioteką jest DevIL.) Oto wyniki:
Rozwiązaniem jest po prostu branie tylko starszych bitów z liczb generowanych przez Linear congruential generator. Tak z resztą robią biblioteki standardowe w różnych środowiskach. Można też użyć innego algorytmu - dobry i szybki jest podobno Mersenne twister.
Przy okazji ciekawostki: Na Random.org można sobie wygenerować prawdziwie losowe liczby, łańcuchy, bitmapy, a także rzuty kośćmi czy monetą (w tym polskimi złotymi! :) Po wyczerpaniu limitu liczb losowych na adres IP można sobie dokupić więcej. Są też w sprzedaży generatory liczb prawdziwie losowych pod USB :)
# Firefox 3
Thu
19
Jun 2008
Przedwczoraj miała miejsce premiera długo oczekiwanej, zupełnie nowej wersji popularnej przeglądarki WWW - Firefox 3. Na pierwszy rzut oka zmiany nie są duże. Przeglądarka faktycznie sprawia wrażenie trochę lżejszej i szybszej, a przede wszystkim szybciej (albo raczej - bardziej wielowątkowo) robi swoją robotę, nie dając się zablokować jakiemuś dużemu obrazkowi czy JavaScriptowi. Twórcy wprowadzili zmiany głównie do paska adresu (wpisywane słowa szuka nie tylko w adresach, ale i tytułach odwiedzonych wcześniej stron) i mechanizmu zakładek (np. można dodać bieżacą stronę do zakładek jednym kliknięciem). Strony można powiększać razem z obrazkami. No i jeszcze ma nowe, ładniejsze ikonki :)
Comments | #software #web Share
# mgr inż. Adam Sawicki
Mon
16
Jun 2008
Stało się. Obroniłem pracę magisterską. Temat: "Architektura i implementacja silnika grafiki trójwymiarowej". Od dziś nie jestem już student, tylko wyżej wykształcony magister inżynier informatyk :) Tysiące myśli, radości ale i smutków, wspomnień ale i nadziei... Nie ma sensu ich wymieniać. Zobaczymy, co dalej przyniesie los.
Comments | #studies #life Share
# Jutro obrona
Sun
15
Jun 2008
Wszystko wskazuje na to, że jutro mam obronę pracy magisterskiej, a przy okazji egzamin dyplomowy, który obejmuje materiał z całych studiów. Co to będzie... :/ Gram ostatnio w WoW-a, to może znajdę jeszcze jakąś tarczę, co ma +50 do obrony :)
Comments | #studies #life Share
# Metaballs
Sat
14
Jun 2008
Metaballe (inaczej bloby) to takie kulki, które zlewają się ze sobą. Matematycznie to są izopowierzchnie opisane odpowiednimi wzorami. Metod ich renderowania jest kilka. Można je wyliczać bezpośrednio przez jakiś ray-casting. Można je zamieniać z reprezentacji wokselowej na siatki trójkątów za pomocą Marching Cubes Algorithm. Do renderowania dużych ilości metaballi w czasie rzeczywistym ze wsparciem GPU wymyślono nawet technikę w Image Space.
Ja chciałem być sprytniejszy i wpadłem na pomysł, żeby renderować metaballe odkształcając siatkę kulki w kierunku drugiej kulki. Niestety nic z tego nie wyszło, bo nie udało mi się znaleźć wzoru, który by zapewnił ładne łączenie między kulkami.
Comments | #rendering #math Share
# Subsurface Scattering
Wed
11
Jun 2008
W ostatnich dniach pracowałem nad SSS - Subsurface Scattering. Zacząłem od artykułu Simon Green, "Real-Time Approximations to Subsurface Scattering" z książki "GPU Gems 1" (rozdz. 16). Metoda działa tak jak Shadow Mapping, tekstura przedstawia głębokość z punktu widzenia światła i z niej wyliczana jest w każdym miejscu grubość obiektu w kierunku źródła światła. Nie uzyskałem zadowalającego efektu. Model wygląda dziwnie i wyraźnie widać na nim "cień" od światła. Nie o to chodzi.
Wkurzony, wziąłem do ręki plastikowy przedmiot i obserwowałem go pod różnymi kątami padania światła, żeby opracować swój model SSS. Moja główna obserwacja polega na tym, że najważniejsza jest grubość modelu w kierunku patrzenia kamery, niezależnie od światła. Renderowanie głębokości z punktu widzenia przeciwnego do kamery dało dobry efekt, najlepszy jaki udało mi się uzyskać.
Ta metoda działa idealnie dla obiektów wypukłych, ale dla niewypukłych pod niektórymi kątami wyraźnie widać niestety geometrię z przeciwnej strony modelu.
Potem spróbowałem wyliczyć i zapisać w wierzchołkach grubość modelu w danym miejscu w kierunku zanegowanej normalnej. Efekt, jak można się spodziewać, jest daleki od oczekiwanego, bo pojedyncza grubość nie bierze pod uwagę kąta patrzenia kamery ani światła.
Wreszcie, spróbowałem wyliczać i zapisywać dla każdego wierzchołka po 3 grubości w 3 różnych kierunkach, zgodnie z "bazą Half-Life 2", której Valve użyło do Radiosity Normal Mapping. Gdyby się udało, to by mógł być epokowy wynalazek :) Ale się nie udało.
# Jakie programy graficzne?
Tue
10
Jun 2008
Trafiłem dzisiaj na fajny program do przeglądania plików graficznych - FastStone Image Viewer. Jest darmowy i wygląda na lepszy, niż stara wersja ACDSee, której używałem dotychczas jako szczęśliwy posiadacz jej pełnej, oryginalnej wersji. Ta zmiana zainspirowała mnie do wypisania listy znanych mi programów graficznych, które warto mieć. Przy okazji chętnie przeczytam w komentarzach wasze typy.
Oprócz przeglądania zdjęć z aparatu i innych ładnych obrazków ;) bywają też potrzebne funkcje specjalistyczne i wtedy trzeba sięgnąć po odpowiednie oprogramowanie. Nie wiem jak to jest ze sprawami graficznymi, takimi jak RAW czy CMYK. Ze spraw gierkoderskich, obsługę formatu DDS i generowanie normal map załatwiają odpowiednie wtyczki do GIMP-a.
Comments | #graphics #software Share
# Jak zrobiłem kd-tree
Sat
07
Jun 2008
Do testowania kolizji promienia od kamery do świateł napisałem sobie drzewo kd, w którym przechowałem odniesienia do trójkątów mapy. Właściwie to jest swobodne drzewo kd, analogicznie do swobodnych drzew ósemkowych.
Interesujący jest sposób, w jaki go zapisałem. Wcześniej zawsze węzeł drzewa był u mnie prawdziwym, alokowanym dynamicznie obiektem przechowującym własny wektor trójkątów. Tym razem wszystko mieści się w zwykłych tablicach:
struct NODE
{
BOX Bounds; // AABB węzła
unsigned FirstTriangle;
unsigned TriangleCount;
unsigned SubnodeIndex[2];
};
// To jest kd-tree
std::vector<NODE> Nodes;
std::vector<unsigned> Triangles;
// To jest siatka mapy
std::vector<unsigned> Indices;
std::vector<VERTEX> Vertices;
Pierwszy element tablicy węzłów to korzeń. Każdy węzeł przechowuje indeksy swoich dwóch podwęzłów SubnodeIndex odnoszące się do tablicy Nodes. Każdy węzeł wyznacza też zakres trójkątów, które do niego należą - FirstTriangle i TriangleCount odnoszące się do tablicy Triangles. Każdy element Triangles to z kolei numer pierwszego z indeksów wierzchołków należących do danego trójkąta, odnoszący się do tablicy Indices. Natomiast Indices to już zwykły bufor indeksów siatki, odnoszący się do tablicy Vertices.
Jak takie drzewo powstaje? Funkcja rekurencyjna dla danego węzła z Nodes tworzy dwa podwęzły, a zakres trójkątów należących do tego węzła rozdziela na trzy podzakresy: te które trafiają do pierwszego podwęzła, które trafiają do drugiego podwęzła i które zostają w tym węźle. W tym celu wykonuje dwukrotnie algorytm podziału zakresu na dwa podzakresy - tego samego którego używa QuickSort. On ma złożoność liniową i jest do dyspozycji w STL jako algorytm std::partition.
Podsumowując, takie podejście do tworzenia i przechowywania drzewa podziału przestrzeni ma liczne zalety: drzewo zajmuje mniej pamięci, szybciej się wylicza, łatwiej się zapisuje i odczytuje z pliku. Ma też jedną wadę - wymaga używania zamotanych odwołań takich jak to:
x = Vertices[Indices[Triangles[Nodes[ NodeIndex].FirstTriangle+ti]+vi]].Pos.x;
Profesjonaliści pewnie mnie wyśmieją że dopiero teraz na to wpadłem, a początkujący i tak tego nie zrozumieją, ale co mi zależy... Piszę to na co mam ochotę :)