Shaderki

AplikacjaPostanowiłem wreszcie zająć się wyświetlaniem grafiki opartej na shaderach. Stworzyłem sobie prosty framework oparty na moim “silniku”, który jest aktualnie tylko szkieletem aplikacji. Framework składa się z kilku klas, których zadaniem jest uprościć wykonywanie różnych rzeczy. Aktualnie w zestawie jest kamerka FPP, prosty system cząsteczek oraz klasy do wczytywania modeli i zarządzania efektami.

Na dole tej notki znajduje się link do aplikacji, która reprezentuje aktualny stan kodu. Aplikacja wyświetla 4 modele wczytane z plików w formacie .x, 1 model z formatu .sdkmesh oraz cząsteczki, których pozycja obliczana jest w shaderze. Światło użyte w scenie jest punktowe, a obliczenia są wykonywane w pixel shaderze. Materiały modeli pochodzą z ich plików, dlatego nie wszystko wygląda super ;).

Kamerkę obsługuje się za pomocą myszy i klawiszy WSAD, a światło za pomocą strzałek oraz klawiszy PG_UP i PG_DN.

Pobierz

NViDo v0.3 Release

Tym razem chciałbym przedstawić mój nowy program. NViDo jest to aplikacja do pobierania filmów z serwisów takich jak Youtube. Zaletą programu jest prostota obsługi, która może sprowadzić się do skopiowania linku do schowka i wciśnięciu skrótu klawiszowego “SHIFT + ALT + D”. Innymi funkcjami aplikacji są:

  • NViDoodtworzenie filmu zaraz po ściągnięciu
  • tworzenie historii pobranych plików wideo (z której można bezpośrednio odpalić dany plik)
  • pobieranie również wersji HD jeżeli istnieje w serwisie

Aktualnie ilość serwisów, które NViDo obsługuje nie jest szałowa, ponieważ są to tylko (już wspomniany) Youtube i Vimeo (w przyszłości pewnie dodam więcej). Aplikacja jest w miarę odbugowana, jeśli wystąpią jakieś błędy to postaram się naprawić (choć nie obiecuję).

Pobierz

W tym miejscu chciałbym zareklamować również inną aplikację tego typu, a mianowicie jDownloader. Ten program, oprócz tego, że automatycznie pobiera pliki z takich serwisów jak rapidshare, potrafi ściągać filmy z większości znanych serwisów podobnych do Youtube.

jDownloader

Defekt optymalizacji kompilatora x64

Podczas dalszego kodowania mojego silnika natrafiłem na bardzo dziwny błąd kompilatora Visual Studio. Zaczynając od początku – mam oto taki kod:

enum
{
	// Rozmiary pól
	MAX_BITS_INDEX = sizeof(Size_t) * 4,
	MAX_BITS_MAGIC = sizeof(Size_t) * 4,
	// Maksymalne wartości pól (Przesunięcie 1 w dwóch operacjach, ponieważ inaczej kompilator nie daje rady)
	MAX_INDEX = ((1 << MAX_BITS_INDEX / 2) << MAX_BITS_INDEX / 2) - 1,
	MAX_MAGIC = ((1 << MAX_BITS_MAGIC / 2) << MAX_BITS_MAGIC / 2) - 1
};
/* ... */
 
// handle = 0x0000000400000006;   - przykladowo
// Size_t ma rozmiar wskaźnika (jest zależny od platformy)
Size_t value = handle & MAX_MAGIC;

Otóż problem z tym kodem jest taki, że gdy zostanie skompilowany na platformę x64, zostaje wygenerowany następujący kod w assemblerze:

    79:                 {
    80:                         Size_t value = handle & MAX_MAGIC;
 
000000013FC96F94  mov         rax,qword ptr [handle]
000000013FC96F9C  mov         qword ptr [value],rax
 
    81:                         if(value == *it) return true; // Dalszy kod

Jak widać problem polega na braku kluczowej instrukcji and, której zadaniem jest odcięcie najstarszych 32-bitów. Dla porównania kod assemblera wygenerowanego dla platformy x86 jest następujący:

    79:                 {
    80:                         Size_t value = handle & MAX_MAGIC;
00DC9DDC  mov         eax,dword ptr [handle]
00DC9DDF  and          eax,0FFFFh
00DC9DE4  mov         dword ptr [value],eax
    81:                         if(value == *it) return true; // Dalszy kod

Tutaj instrukcja ta występuje.

Błąd ten jednak nie występuje gdy samemu sprecyzuję stałą, tj.:

Size_t value = handle & 0xffffffff;

W tym przypadku zostanie wygenerowany poprawny kod.

Wniosek jest taki, że kompilator widząc operację and zmiennej ze stałą typu enum (który przechowuje wartości 32-bitowe), traktuje tą zmienną jako typ 32-bitowy. W tym przypadku stwierdza, że instrukcja and nie ma sensu, bo wartość MAX_MAGIC zawiera maksymalną wartość (0xffffffff). Według mnie jest to ewidentny błąd i nie powinno takie coś wystąpić.

// Edit :)
Problemem oczywiście jest to, że enum jest tak naprawdę typem int, więc się dokładnie tak zachowuje.

Problemów z x64 ciąg dalszy

Postanowiłem przekompilować aktualnie pisany framework pod platformę x64. Jest to już trochę napisanego kodu, więc objawiło się to trzema problemami, z których najważniejszym jest ten komunikat:

LNK1112: module machine type 'X86' conflicts with target machine type x64''

Zostaje on wyrzucony wtedy, gdy podczas składania programu x64 Linker napotka bibliotekę skompilowaną pod target x86.Poprawne ustawienie bibliotek

Przyczyną tego konfliktu są błędne wpisy ścieżek do bibliotek statycznych, które znajdują się w opcjach Visual Studio. Niestety wpisy dla platformy x64 są po prostu kopiowane z platformy Win32 (nie wszystkie, bo jest ich mniej). Należy je poprawić tak aby wskazywały na foldery z bibliotekami x64. Obok jest obrazek z poprawnymi ustawieniami mojego Visual Studio.

Drugim, ale już mniej znaczącym problemem jest ostrzeżenie

conversion from 'size_type' to 'int', possible loss of data

powodowane rozrzeszeniem rozmiaru typu ‘size_type’ z 4 do 8. Typ ten jest zwracany przez funkcje size() w kontenerach biblioteki standardowe. W tym przypadku rozwiązaniem jest po prostu zamiana powszechnie używanego (unsigned) int na size_type bądź własny odpowiednik zdefiniowany w klauzulach #ifdef/#endif :).

Ostatnim problemem jest brak inline’owych wstawek assemblerowych. W moim przypadku za ten błąd odpowiadało makro NAssert, w środku którego jest wykorzystana konstrukcja:

__asm 
{
   int 3 
}

Powoduje ona wywołanie Breakpointa w miejscu asercji. Okazuje się, że rozwiązanie tego jest bardzo proste, ponieważ Visual Studio posiada następującą funkcję typu intrinsic:

__debugbreak()

Powoduje ona dokładnie tę samą akcję co podana wyżej wstawka w assemblerze.

A poniżej wynik całego procesu przenoszenia :).
End

Problem z kompilacją x64 na Win7 RC

Dzisiaj postanowiłem spróbować skompilować coś pod platformę 64-bitową. Jako że dysponuję teraz już odpowiednim sprzętem, systemem, więc nic nie stało na przeszkodzie aby to uczynić. Ze znalezionych w internecie informacji dowiedziałem się tyle, że wystarczy przestawić docelową platformę z Win32 na x64 i już można przystąpić do próby kompilacji.Przed poprawką

Niestety tu pojawił się problem, ponieważ jedynymi dostępnym platformami oprócz Win32 są platformy ARM. Po kolejnym skorzystaniu z wyszukiwarki Google dowiedziałem się, że winę za to ponosi nieodpowiednia kolejność instalacji Windows SDK 7, Visual Studio oraz braku odpowiedniego dla niego Service Packa. Poprawna kolejność instalacji jest następująca:

  1. Visual Studio 2008
  2. Service Pack 1 dla Visual Studio 2008
  3. Windows SDK 7

Oczywiście nie miałem ochoty robić reinstalacji VS i WSDK, dlatego poszukałem innego rozwiązania. Oto ono:

  1. Deinstalacja “Microsoft Visual C++ Compilers 2008 Standard Edition – enu – x64” oraz “Microsoft Visual C++ Compilers 2008 Standard Edition – enu – x86”
  2. Naprawa instalacji Visual Studio (Przez funkcję Repair)
  3. Instalacja Service Packa

Należy zaznaczyć, że użycie funkcji Repair na instalacji WSDK7 usunie tę poprawkę.

Po poprawce

Tutaj znajduje się oryginalna stronka z opisem naprawy.

Windows Seven 64-bit

TaskMan

Po trzech tygodniach wreszcie odzyskałem notebooka, w którym jak się okazało, popsuła się płyta główna (brak możliwości restartu, ponieważ po wyłączeniu systemu operacyjnego, komputer się przez pół godziny nie dawał uruchomić). Po powrocie z serwisu niestety kilka programów zaczęło szwankować, ale jest to konsekwencją wymiany płyty głównej. Przynajmniej dostałem w końcu dobry pretekst, żeby usunąć z dysku ostatni 32-bitowy system a zarazem Vistę :).

Przechodząc do meritum, po próbach zainstalowania Windows XP 64-bit, Windows 2k8 Server x64, dopiero Windows Seven 64-bit okazał się być odpowiednim systemem, ponieważ jako jedyny posiada sterowniki do mojej, jakże wydajnej karty “GeForce 6100 Go!”. Z innymi sterownikami też nie było problemu, gdyż na stronie ASUS mimo tego, że sterowniki oznaczone są jako 32-bitowe, zawierają również wersje 64-bit.
Po sterownikach przyszedł czas na oprogramowanie. Starałem się instalować programy x64, jeżeli były one dostępne. Wśród nich są między innymi Mozilla Firefox (Minefield) oraz Mozilla Thunderbird (Shredder) dostępne na tej stronie. Niestety największą bolączką przeglądarki 64-bitowej jest brak programu Adobe Flash Player w tej samej wersji (istnieje wersja testowa, ale przeznaczona tylko na systemy Linux).
Oprócz przeglądarki, ważnym programem (przynajmniej dla mnie) jest Visual Studio. Samo IDE jest aplikacją opartą o .NET więc jest 32-bitowa, ale kompilator w nim zawarty ma już wsparcie dla 64-bitów. W ustawieniach projektu jest możliwość wyboru docelowej platformy x86/x64/IA-64 (pozostaję póki co przy x86). Niestety przy instalacji DirectX SDK pojawił się drobny dylemat. W Visualu, w opcjach (dla ułatwienia oczywiście) można podać ścieżkę do katalogu z bibliotekami statycznymi, jednak w przypadku gdybym chciał kompilować program w dwóch wersjach, dochodzi problem żonglowania ze ścieżkami do wersji x64 i x86. Lepiej by było, gdyby Visual sam wybierał ścieżki na podstawie tego, na jaką platformę kompilujemy dany projekt.
sbdksohtaOstatnią ciekawostką jest brak możliwości zainstalowania NVIDIA SDK 9, którego instalator wyrzuca komunikat o braku wsparcia dla x64.

Podsumowując muszę stwierdzić, że przejście na platformę 64-bitową jest dla mnie krokiem naprzód, ponieważ jakby nie patrzeć mogę wykorzystać posiadany sprzęt w 100% (2x więcej rejetrów xmm :)), a dodatkowo dobrze się bawić poznając dokładniej tę architekturę. Ogólnie programów 64-bitowych nie ma jeszcze za wiele, ale myślę, że ich ilość stale wzrasta. Mam również nadzieję, że system Windows Seven będzie ostatnim systemem, który jest dostępny w wersji 32-bitowej, dzięki temu producenci nie będą mieli problemy z wyborem platformy docelowej dla sterowników.

Systemy operacyjne

Już od jakiegoś czasu zanoszę się z wrzuceniem programów, które musiałem przygotowywać na zajęcia laboratoryjne z Systemów operacyjnych. Oczywiście wiadomo że “chęci największe, gdy możliwości najmniejsze”, więc wrzucam je dopiero teraz, gdy mam dostęp do komputera. Wszystko przez firmę ASUS, która zapewniła mi odwyk od komputera dzięki długoterminowej naprawie notebooka (niech będą przeklęci! :P).

Wracając do tematu, programy które należało przygotowywać miały symulować działania algorytmów takich jak:
– planowanie dostępu do procesora
– planowanie dostępu do dysku twardego
– pamięć wirtualna

Programy te nie są zbyt wyszukane, ale spełniają założenia. Oczywiście na przekór temu, czego używamy na wydziale (Java), swoje programy pisałem w C++. Programy są “prawie” multiplatformowe. Aby ruszyły pod linuksem wystarczy zamienić kilka funkcji i nagłówków na ich odpowiedniki.

Zadanie 1
Zadanie 2
Zadanie 3
Zadanie 4

Spotkanie warsztatowe we Wrocławiu

Dzisiaj odbyło się kolejne wrocławskie spotkanie Warsztatu. Niestety znów frekwencja była niezbyt duża. Na początku spotkaliśmy się z Revo pod umówionym barem, który okazał się restauracją, gdzie lekko nie pasowaliśmy. Potem przenieśliśmy się do pizzerii, gdzie dołączył do na DJ_cool_. No cóż mam nadzieje, że następnym razem będzie lepiej.

Odnośnie ostatniego dnia IT Days – z powodu braku ciekawych tematów zrezygnowałem z nich :).

IT Days 2009 na Politechnice Wrocławskiej

Od wczoraj, czyli od wtorku (22.04.2009), na Politechnice Wrocławskiej trwają Dni Technologii Informatycznych (IT Days). Celem konferencji, organizowanej przez AIESEC Polska, jest prezentacja działalności firm biorących w niej udział, a także możliwość zapoznania się z ofertami pracodawców na Targach Pracy, które odbędą się jutro, czyli w ostatni dzień konferencji.

Jak do tej pory udało mi się uczestniczyć tylko na na dwóch wykładach. Pierwszym jest, składający się z dwóch części, wykład firmy AMD, na którym w pierwszej (dłuższej) części, została zaprezentowana nowa platforma do gier PC o nazwie “Dragon”, natomiast druga część traktowała o technologiach oszczędzania energii wykorzystywanych w procesorach AMD.
Drugi wykład został zaprezentowany przez przedstawicieli firmy Nokia Siemens Networks, a jego tematem były technologie UMTS, HSDPA, HSUPA oraz kilka innych. Niestety nie jest to tematyka, o której mógłbym cokolwiek powiedzieć, ale mimo wszystko wykład był bardzo ciekawy.

O czwartku postaram się napisać w najbliższym czasie :>.

IGK 2009 – podsumowanie

W tym roku wreszcie mogłem w pełni uczestniczyć na konferencji Inżynieria Gier komputerowych, która odbywała się w Siedlcach (W zeszłym roku byłem niestety tylko na jeden nocleg). Jest to jedyne w roku wydarzenie, w którym tak duża ilość ludzi z Warsztatu spotyka się w jednym miejscu.

Standardowym składnikiem konferencji są referaty, które są wygłaszane przez ludzi zarówno z Akademii Podlaskiej jak i ludzi z zewnątrz przez pierwsze dwa dni. Bardzo podobał mi się referat Jakuba Jastrzębskiego, który bardzo fajnie przedstawił swój referat, w którym zawarł informacje o rodzajach silników fizyki, przykładowej architekturze, implementacji własnych rozwiązań.
Również kolejnym ciekawy referat przedstawił Hubert Rutkowski, który poruszył w nim głównie problemy niezwiązane bezpośrednio z programowaniem, lecz z pracą przy komputerze, czyli problem bolących nadgarstków oraz szybkiego pisania. W swojej pracy polecił kilka ciekawych wtyczek do środowiska Microsoft Visual Studio.
Referat Karola Gasińskiego był także bardzo ciekawy. Omawiał on w swojej pracy wykorzystanie megatexturingu w renderingu planety z dynamicznym poziomem dokładności.
Ostatnim, a zarazem najlepszym referatem okazała się praca Wojciecha Tomana omawiająca jego dotychczasowy dorobek przy pracy nad silnikiem nGene. W swojej prezentacji zaprezentował sposób renderowania realistycznej wody jako efekt post-process, w której poszczególne składowe światła zanikają wraz ze wzrostem głębokości. Za swoją pracę otrzymał nagrodę za najlepszy referat ufundowaną przez firmę Seventhtear.

Niestety najsłabsze okazały referaty przedstawicieli Akademii Podlaskiej. Pierwszy, dotyczący implementacji trójwymiarowej gry zręcznościowej na telefon komórkowy, miał zbyt dużą ilość tekstu w prezentacji, a wygłaszający po prostu go czytał, jednak mimo tego gratuluje napisania działającej gry.
Natomiast drugi temat pt. “Rola języków skryptowych w technologii gier” owszem posiadał w miarę poprawną formę prezentacji, ale sprawiał wrażenie projektu na uczelnię, ponieważ prowadzący nie byli w stanie odpowiedzieć na pytanie zadane na końcu prezentacji.

W tym roku gościem specjalnym konferencji IGK, był przedstawiciel firmy The Farm 51, który przedstawił prezentację na temat ewolucji renderera i mechaniki ich najnowszej gry FPS Necrovision. Prezentacja była świetna, a prowadzący demonstrował wszystko w edytorze gry bądź na filmikach.

Tak jak w zeszłym roku i tym razem odbył się Quiz nt. IT, którego pomysłodawcą i prowadzącym jest Regedit. W tym roku jednak za zajęcie pierwszego miejsca były przyznawane nagrody rzeczowe. Najlepszy okazał się Krzysiek K., gratulacje :).

Ostatnim oficjalnym składnikiem konferencji był konkurs Compo, w którym należało napisać grę na temat: “Gra psychodeliczna”. W konkursie wzięło udział 9 drużyn, a tegorocznym zwycięzcą okazał się zespół Rzeźnicy Inc., w którego skład wchodzą: Krzysiek K., Regedit, gemGreg, Ayufan. Drugie i trzecie miejsce zajęły odpowiednio zespoły Kryzys oraz Vertex.

Oczywiście nie obyło się bez wieczorowych integracji, które miały miejsce w piątek i niedziele wieczorem, w pokoju grupy Vexillium. W trakcie tych integracji można było zagrać w takie gry jak Starcraft, Quake 3 Demo, Urban Terror oraz World of Goo :D. W niedziele wieczorem odbył się turniej Quake’a, w którym zająłem zaszczytne ostatnie miejsce :P, a oczywiście wygrał Gynvael, zresztą więcej na jego stronce.
Aktualnie zastanawia mnie tylko jedna sprawa, czy w przyszłym roku również będzie nas gościć hotel Arche (uczestnicy wiedzą ocb :)).

Ogólnie podsumowując, mam nadzieję że w przyszłym roku frajda z uczestnictwa będzie minimum taka jak w tym. Mam nadzieję, że jednak więcej osób zgłosi się z referatami, żeby było czego posłuchać :).