Kurs Direct3D goes official.

•Lipiec 26, 2009 • Dodaj komentarz

Hej!

A wypoczywam sobie. Od ostatniego tygodnia rezyduję pod namiotem, na słodkich Mazurach. Jak jednak każdy co bardziej zaciekły geek wziąłem ze sobą laptopa, zaopatrzyłem się w Simplusowy pakiet internetowy (200MB za koszt 20 złotych), ażeby utrzymać choć jakąś łączność ze światem.

Niestety! Nie zabrałem ze sobą ani swoich projektów, ani SDK Directa. Żeby ściągać je żal mi było transferu. Toteż, poza przeglądaniem forum oraz portalu gdpl, basha, kretyn.com, oraz dyskutowania na ircu nie miałem kompletnie nic do roboty (zważywszy również na to, że przez prawie cały tydzień pada przelotnie deszcz). Stan tej bezczynności zmusił mnie do paru rzeczy.

Po pierwsze, zainteresowałem się Direct3D11, do czego pobudziła mnie ta dyskusja. Parę nowości z tego API to, między innymi, możliwość renderingu z wielu wątków (poprzez oddzielenie kontekstów od urządzenia), tesselacja sprzętowa Catmull-Clarka (taka, jak używana w większości programów graficznych), oraz Compute Shadery. Przy okazji, niejako z rozpędu, doczytałem dużo o Direct3D10 – o którym to nie wiedziałem zbyt wiele. Postanowiłem też, że zaraz po powrocie biorę się za naukę tego przyszłościowego API.

Przeglądając różne dokumentacje, natrafiłem też na coś co bardzo mnie ucieszyło – mianowicie WARP. Jest to wbudowany w Windows 7 Software Rasterizer. Coś na kształt, znanego już od dawna, urządzenia REF – w pełni zgodne z najnowszą wersją pakietu Direct3D. Co najciekawsze jednak, WARP potrafi działać z całkiem przyzwoitą prędkością! No, to pojęcie względne. Na popularnym procesorze (C2D @ 2.4Ghz), dla Crisisa uruchomionego w 800×600 z minimalnymi detalami, daje to 2 klatki na sekunde. Ale ludzie! To Crisis! WARP zaś jest idealnym rozwiązaniem dla spopularyzowania Direct3D10 i 11 wśród gier Indie i Casual – skoro nie trzeba posiadać karty grafiki wspierającej API (a świat i tak niedługo zacznie przesiadać się na Win7 i Vistę), to dlaczego nie?

Natomiast głównym punktem tej notki jest chęć powiadomienia was o dodaniu przeze mnie mojego Kursu Direct3D na portal gamedev.pl. Przenoszenie serii artów z bloga wydawało mi się wcześniej nudną i raczej głupią robotę, więc mimo paru podejść szybko dawałem sobie spokój. Tym razem zaś, czasu miałem sporo, chęci także, więc zakasałem rękawy, odpaliłem Worda, przeglądarkę i irca. Tym sposobem, używając trzech znanych mi konstrukcji HTML – <p></p>, <img /> oraz <a href> </a>, a także podrzuconego mi przez Daba <pre<>/pre> do kodów źródłowych, przeniosłem pierwsze 6 części. Po pewnych przygodach zaraz po wrzuceniu – zaakceptowany został także wysłany przeze mnie tekst z uwagami do moderacji ( :D ) – tutorial jest już na portalu i wspiera adeptów w walce z grafiką 3D. Oczywiście skorzystałem z okazji i poprawiłem parę błędów – których to nie chce mi się poprawiać tu, na blogu. Głównie to literówki i pomniejsze szczegóły, ale jednak, wersję z gdpl można uznać za troszkę pełniejszą. Tym niemniej, tutorial na pewno zawiera błędy, nieścisłości i (szczególnie pierwsze lekcje) jest z lekka lapidarny. Jednak, pozostaje mi mieć nadzieję, że będzie wartościowym źródłem wiedzy dla początkujących, szczególnie teraz, po udostępnieniu szerszej publiczności. :)

XNA jest do bani.

•Lipiec 12, 2009 • 6 komentarzy

Oto najpowszechniejsza opinia. Jest to środowisko podobne raczej do gamemakera, nieprawdziwe, dające małe możliwości, wolne i ograniczone bo zarządzane, prawda?

Nieprawda. Wszystko to co napisałem wyżej to jeden wielki stek bzdur. Oczywiście, żeby być szczerym, nie dalej jak dwa tygodnie temu sam podpisałbym się pod tymi postulatami. Co prawda próbowałem kiedyś XNA, kiedy wchodziło, jednak wydało wtedy mi się ono toporne i niespecjalnie porządne.

Tym niemniej, jakiś czas temu postanowiłem dać XNA drugą szansę, głównie przez chęć zrobienia gry na Xboxa 360. Podchodziłem do sprawy raczej sceptycznie, głównie przez trudności ze skonfigurowaniem połączenia Xbox – PC, które to spowodowane były, w kolejności od łatwiejszych do rozwiązania, przez zapomnienie hasła do XBLA, zasięg mojej sieci – router musiał stać przy konsolce, a WiFi nie sięgało do komputera, oraz – co zdenerwowało mnie dokumentnie – konieczności wpisania znalezionego w Internecie kodu pocztowego (pod hasłem British Postal Codes). Wszak jestem z krwii i kości brytyjczykiem (dla Microsoftu), gdyż Polski nie ma na mapach nowoczesnego świata. Cóż…

W każdym razie, po pokonaniu tych problemów, stworzyłem nowy projekt według template (z główną klasą, paroma callbackami typu OnUpdate i OnRender, głównie pustymi), który to następnie wypełniałem według dokumentacji i przygodnie znalezionych w Internecie kursów, kiedy było trzeba. Różne rzeczy testowałem, napisałem prosty klon Space Invaders. Co mnie szczególnie zaintrygowało w pisaniu w XNA jest to, iż jest to całkiem kompletny silnik – obsługa inputu zrobiona jest tak jak sobie to wyobrażałem(GamePad.GetState(Player.One).Get…), dźwiękiem, zarządzaniem zasobami które uwielbiam (jedna base class dla zasobów, ładowanie całości na zasadzie dowolnyZasob = Cont.Load<Typ>(„nazwa”);, do tego parsowane czymś takim jak content processor – który to jest programowalny). Niby nic nowego, ale jest out of the box. Poza tym, biblioteka matematyczna, różne utilities, wszystko nawet bez potrzeby sięgania do dokumentacji (bo VIsual sam dołącza odpowiednie usingi, a wszystko pokazuje Intellisense – wystarczy znać pojęcie lub strzępek nazwy).

W każdym razie, po jakimś czasie postawiłem sobie za zadanie napisanie prostej gry 2D – maks tydzień roboty do etapu Make It Work. Zasada prosta – przedostać się z jednej części planszy do drugiej, pokonując przy okazji różne zagadki fizyczne, oraz używając zdolności – cofania czasu (Braid!), dzielenia bohatera na paru (gdyż jest on po prostu kulką stworzoną z płatków róż), itp., z fizyką pod kontrolą silnika Farseer Physics, będącego portem na XNA skądinąd znanego silnika Box2D, a przedstawiającego sobą całkiem niezłe możliwości. Do tego gra utrzymana jest w klimatach raczej ciężkich – smutna, przytłaczająca fortepianowa muzyka wraz z czarno, szaro, bladoczerwonymi wstawkami nie sprawia wrażenia typowej gry dla pań w średnim wieku. Nie jest to gra ani specjalnie skomplikowana, ani tym bardziej ambitna, ani nie wykorzystuje możliwości sprzętu – po prostu yet another nieskomplikowana produkcja 2D. I do takich właśnie marzyłem o środowisku, jakie daje mi XNA. Oczywiście, gry 3D również można tworzyć – jednak na razie się za to nie zabrałem. Jak sprawdzę, to dam znać.

Na koniec, jako smaczek tzw. dodatkowy (znaczy kolejna nudna informacja po nudnej notce ;P): mega fajny jest mój sposób debuggowania. Konsola leży na parterze, przy telewizorze. Komputer zaś mam na piętrze, w pokoju. Po paru godzinach testowania (a szczególnie testowania różnych parametrów, czy (o zgrozo!) stawiania breakpointów) jestem nieźle spocony, przez ciągłe bieganie góra-dół. :)

Na kompletny koniec, żeby już na amen zepsuć wrażenie, ze dwa screeny. Jeden – a jak! – z menu, drugi z samego gameplayu (jedynego levelu który mam gotowy – pierwszego ;P): 

a1

b2

(oczywiście, już standardowo, przepraszam, za niepisanie przez tyle czasu – wakacje to ciężki czas ;P )

O nowinkach u Charibo słów kilka

•Czerwiec 15, 2009 • 9 komentarzy

Hej!

Oto minęły dwa miesiące od poprzedniej notki, licznik odwiedzin spada nieubłaganie w dół, więc trzeba coś na ten temat poradzić ( ;) ). NIe pisałem z dwóch powodów. Po pierwsze, nie miałem o czym. Po drugie zaś, w związku z końcem roku szkolnego (oraz, naturalnie, początkiem wakacji) cierpię na brak czasu. Wyjazdy, spotkania ze znajomymi i tzw. life sprawiły, że od dobrych pięciu weekendów nie miałem czasu przysiąść nad kodem, ani nad komputerem w ogólności. Tym niemniej, napisałem nową część kursu Direct3D – Staje się jasność – implementacja modeli oświetlenia – traktującą o implementacji oświetlenia diffuse, oraz specular (wg. Phonga i Blinna).

Drugą nowością jest fakt, iż zrezygnowałem z funkcji redaktora WMaga. Nie jest mi szczególnie przykro, że zostałem o to poproszony, a wręcz przeciwnie – cieszę się, że pismo się rozwija. Patrząc zaś na dzieło Capada, widzę że ekipa nie próżnuje, a Mag dostał „kopa”, mówiąc kolokwialnie.

Mój brak czasu spowodowany był też, tutaj muszę się przyznać, graniem w gry kiedy tylko miałem chwilę czasu. Spowodowane było to zakupem XBoxa 360 – konsola podoba mi się bardzo, a komfort grania na telewizorze, siedząc na kanapie, czasami z rodziną, z padem w ręku jest znacznie większy niż na klawiaturze, przed monitorem. Poza tym, XBox Live to marzenie – dema gier, wypożyczalnia filmów – wszystko na telewizorze, bez kombinowania; właśnie tak jak być powinno.

Na koniec tej i tak przykrótkiej notki wypadałoby wrzucić cokolwiek. Wrzucam więc starego screena, z bardzo-testowej-wersji programiku nad którym pracowałem kiedy jeszcze miałem czas:

 

image

Trochę pracy, trochę rozrywki i duży fail.

•Kwiecień 11, 2009 • 5 komentarzy

Hej!

Witam was wszystkich po kolejnej długiej przerwie. Licznik odwiedzin per dzień nieubłaganie idzie w dół, więc oto mam dla was, drodzy czytelnicy kolejną porcję nudnych jak flaki z olejem przemyśleń.

Tak oto pojechałem, wraz ze szkolną wymianą, do kraju tulipanów, wiatraków i używek – Holandii. Dane na szczęście mi było podziwiać jedynie tulipany i wiatraki, przy czym to pierwsze głównie na obrazkach (pory kwitnienia itd.). Ale głównym powodem, dla którego kogokolwiek mogłyby te bzdety interesować jest WMag. Wyjeżdżając, zostawiłem opiekę nad zinem innym. Niestety, przez parę zawirowań oraz zbiegów okolicznośći, które wyjaśniam dokładnie w tym[1][2] wątku forum, magazyn przechodzi przez trudny okres.  Dość powiedzieć, że marcowy WMag nie ukazał się, a przyszłość pisemka nadal jest dla mnie mglista, z powodu braku etatowego składacza.

Poza tym, zająłem się trochę silnikiem. Przede wszystkim, przepisałem cały renderer na Deferred Shading. Dałem się skusić, głównie prezentacją NecroVisioN na tegorocznym IGK. Jak dotąd jestem z rozwiązania zadowolony (chociaż jeszcze nie walczyłem z jednym z większych problemów – Antialiasingiem ;P ). Trochę sztucznie ograniczam target do Shader Model 3 (MRT, oraz ogólna zasobożerność technologii), jednak wydaje mi się to do przeżycia, skoro i tak jak dotąd piszę ten silnik dla siebie.  Przy okazji udowodniłem sobie, że architektura mojego tworu jest całkiem dobrze przemyślana – zmiana renderera wymagała jedynie kosmetycznych zmian w API (głównie w części jego odpowiedzialnej za postprocessing – znacznie się to uprościło).

Kiedy już miałem dosyć kodu renderera (a było parę takich chwil :P ), zajmowałem się edytorem. Nie jest to szczyt techniki, ale jest to mój pierwszy tool tego typu. Jest on napisany w, modny ostatnio sposób, jako klient do serwera – gry (a więc gra po prostu renderuje w oknie edytora, całą logikę zostawiając po stronie własnego kodu) Wykorzystuję komunikację opartą o Named Pipes. Rozwiązanie to podoba mi się, chociaż nie jest pozbawione wad. Zaletą jest to, że nie duplikuje się żaden kod między edytorem a grą.

Jak dotąd, napisane mam jedynie prosty edytor konfiguracji (widoczny z prawej), oraz równie prosty edytor shaderów (jak dotąd jest to edytor raw plików .fx. Docelowo nie będzie to tak wyglądać. :P). Oczywiście, jeśli potrzebujemy, każdą zakładkę możemy zamknąć lub schować, dzięki użyciu DockPanel Suite. Jednakowoż, mimo że całość jest nieskomplikowana, narzędzie znacznie ułatwia debugowanie – możliwość dostrajania parametrów aplikacji oraz edytowanie shaderów w realtime w trakcie działania programu znacznie przyśpiesza cały proces.

Na koniec, mały screen z owego edytora. Grafika to stworzona w Milkshape 3D sfera, oteksturowana przykładowymi kamyczkami z DX SDK, oświetlona jednym światłem punktowym Blinna.

image

Compoty i IGK

•Marzec 16, 2009 • 5 komentarzy

Hej!

Ostatnimi czasy odbyły się dwa Compo, w których brałem udział. Pierwszym jest Scene.pl Code Compo. Napisałem na nie intro. Planowałem, że będzie to 4k, oryginał trwał coś ponad półtorej minuty, było parę różnych scen, trochę pracy kamerą – całość ważyła ~3kb. Niestety, nie zdążyłem napisać synthu, więc w ostatni dzień tego konkursu postanowiłem obciąć intro do 2k – w których to karygodny brak dźwięku jest w miarę wybaczalny.

Efekt jest mizerny, dlatego nazwałem swoją pracę CheckerFAIL ;). W każdym razie, cięcie rozmiaru zabrało parę ciekawych scen; nie miałem również czasu na dobre zsynchronizowanie, dlatego przejścia są – delikatnie mówiąc – biedne. W każdym razie, dla tych którzy naprawdę mają ochotę, moja praca (jak również całą reszta) do ściągnięcia tu. :)

Poza tym, odbyło się 3h Compo w serwisie gamedev.pl. Tutaj frekwencja była aż porażająca, bo doszło aż 28 prac. W takim tłoku również nie liczę na żadne punkty, ale krótkie Compo to frajda co nie miara, więc cieszę się że wziąłem udział. :) Jestem również szczególnie dumny z tego, że udało mi się narysować dosyć fajne krowy i świnie – własnoręcznie – oraz dograć samemu improwizowaną melodyjkę na gitarze. :D

Trzecim punktem tej notki (może tego nie widać, bo to czwarty akapit) jest konferencja IGK. Tutaj właściwie wszystko co mogło być napisane zostało napisane na innych blogach i na innych serwisach, od siebię tylko powiem, że serdecznie zapraszam. :) Ja oczywiście wybieram się, a ewentualnie zainteresowani wspólnym wyjazdem poznaniacy niechaj wiedzą, że razem z bs.mechanikiem wyjeżdżamy z P-ńa w nocy z czwartek na piątek, pociągiem relacji Poznań – Terespol o 2:20. :)

Na zakończenie po screenie z moich prac na Compo. :)

image  image

image

Trawa

•Luty 27, 2009 • 8 komentarzy

Hej!

Skoro założyłem sobie, iż będę pisał o największych nawet bzdurach, byleby pisać jakiekolwiek notki, oto jest – trzecia notka w Lutym. :P

Tak więc przez ostatnie parę dni pracowałem nad trawą. Pomyślałem sobie, że trawę chciałem napisać od dawna, a jednak wydawała mi się prosta i zawsze odkładałem te plany. Wczoraj jednak wziąłem się w garść – tak powstało coś takiego:

image

Dorzuciłem jeszcze parę drzewek ściągniętych (znaczy – ukradzionych) z jakieś strony internetowej, bo sama łąka pełna trawy wyglądała pusto. ;)

W każdym razie, sprawa okazała się nie tak banalna – ponieważ miałem problem projektowy. Na początku rysowałem trawę z włączonym Alpha Blendingiem i wyłączonym zapisem Z. Jednak wtedy trzeba sortować pojedyńcze kępki według odległości od kamery (od tył) – co też oznacza, że musimy rysować je osobnymi DIP-ami, albo pakować do dynamicznych VB/IB co klatkę. Oba rozwiązania średnio mi się podobały pod względem wydajnościowym. Jednak, jako że nie wpadłem na nic lepszego – pakuję wszystkie kępki do jednego bufora w preprocessie, a wyświetlam z wyłączonym blendingiem i włączonym ZWrite – używając jedynie Alpha Testu. Nie wygląda to gorzej, a lepszego pomysłu na rozwiązanie tego problemu nie mam. W arcie opisującym tworzenie trawy w GPU Gems w ogóle o tym zagadnieniu zaś nie piszą. :)

Na koniec notki, mała dygresja. Wzorując się na Gynvaelu zwracałem ostatnimi czasy na frazy pod jakimi wyszukiwarki podwały adres mojego bloga. Spośród wielu zwykłych, znajdują się dwie perełki – rysowanie urządzeń, oraz coś, co kompletnie mnie zaskoczyło: vertex shader za darmo. Oto pragnę uświadomić każdego, kto odwiedza mojego bloga a jeszcze o tym nie wie – jeśli kiedykolwiek płaciliście za możiwość pisania własnych vertex shaderów – zostaliście oszukani. :P

Compo 2h i Screen Tygodnia

•Luty 21, 2009 • 6 komentarzy

Hej!

Na początek mała dygresja – tą i poprzednią notką postanowiłem przełamać trochę konwencję tego bloga. Od dzisiaj nie będę pisał tu o tym, co działo się miesiąc temu jednocześnie oszukując was że nie miałem czasu pisać (no dobra, zazwyczaj nie oszukuję, po prostu nicnierobienie pożera cały mój czas i faktycznie go nie mam). :) Dlatego też możecie spodziewać się notek o tym, o czym tylko da się napisać. ;)

Oto więc mniej-więcej w połowie lutego meehav zorganizował Compo 2h. Szlachetna ta inicjatywa tym razem nie spaliła na panewce i udział wzięło 11 (!) osób. Mi przyszło zająć zaszczytne trzecie miejsce, wespół z naisho. Aby to osiągnąć wystarczyło D3DXCreateTeapot i trochę klepania kodu, którego nigdy w  życiu nikomu bym nie pokazał – z tej mieszanki wyszedł taki oto arkanoid:

image

Gra moja jest o tyle dopracowana i grywalna, że da się w nią przegrać – co nie jest wcale takie oczywiste. :)

scrn

Drugim niusem jakim chcę się podzielić jest to, że zaimplementowałem futro. Nie byłoby w tym nic ciekawego, gdyby nie to, że postanowiłem z tegoż futra wrzucić screen na Warsztat – w ciągu paru godzin uzyskał on 2k punktów stając się Screenem Tygodnia. Jako że screen jest w gruncie rzeczy brzydki, to czuję się zobligowany zaznaczyć, że nie mam z tym nic wspólnego ;P

Futro natomiast zaimplementowałem metodą Shells and Fins – polega ona na „wyciąganiu” geometrii wzdłuż normalnej, a następnie teksturowaniu jej odpowiednio spreparowaną teksturą wolumetryczną – to shells (nieudolne tłumaczenie – skorupki). Często dodaje się również tzw. fins, czyli żeberka. Są to „poprzeczne” trójkąty wystające z siatki, z nałożoną teksturą sierści. Mają one za zadanie maskować artefakty powstałe przez extrusion  geometrii.

Na koniec tej notki, dla porównania z efektem końcowym, pierwsza próba z futrem.

// Disclaimer: screen ma charakter humorystyczny. Jego biedność nie może być podstawą do naśmiewania się z autora. :P

image

 
Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.