piątek, 28 listopada 2008

HDR, Mesh i takie tam narzekania

Znowu ktoś mi wytknie, że zaczynam kolejną notkę od usprawiedliwiania się za małą aktywność na tej stronie w ostatnim czasie. Niestety - gorący okres a uczelni i inny projekt sprawia, że nie mam za bardzo czasu na literackie wyrażanie swoich myśli. Dobre jest jednak to, że powoli (bardzo powoli) kończy mi się taki pierwsza "gorączka" w semestrze i być może uda mi się częściej coś napisać.

Nawiasem mówiąc, nie życzę nikomu pisania programu na zaliczenie (z Delphi) w taki sposób, jaki ja to wczoraj robiłem. Przez dwa tygodnie nie mogłem znaleźć błędu, który niszczył realizację polecenia liczenia wygranych w wyścigach konnych. Mniejsza o treść - po prostu jak głupi, przez cały czas szukałem błędu w procedurze obliczającej wyniki - zmieniałem, grzebałem, dodawałem, odejmowałem, wrzucałem do biblioteki DLL, wyrzucałem z niej. I co? Okazało się, że błąd leżał w wyświetlaniu w komponencie Memo... Dowiedziałem się o tym wczoraj o 21 i po poprawieniu zacząłem kreślić schemat blokowy. W momencie, kiedy rysowałem szóstą stronę A4, z pocieszającą wieścią odezwał się kolega, który poinformował mnie, że schematu do tego programu nie trzeba oddawać...

Cóż, wypadki chodzą po ludziach. Trafiający ich szlag również. Tak czy inaczej, na dwa tygodnie przed terminem uzyskałem zaliczenie z tego programu, choć jakby tak popatrzeć, wcale okropny nie jest - pod warunkiem, że bym go pisał w C++, a nie Delphi. Choć z nim też miałem do czynienia, konkretnie z Pascalem. Kiedyś. Aczkolwiek dłużej w nim dłubałem aniżeli w C++.

W każdym razie - nieważne. W planach mam też notkę poświęconą organizacji zespołu tworzącego grę przez Internet - taki plan na przyszłość. Dzisiaj jednak chciałem się zająć tym, co w ostatnim - hmmm - miesiącu (chyba) dopisałem do Yesty. A muszę przyznać, że niezbyt dużo. Zresztą z tych samych powodów, co długie przerwy pomiędzy notkami. I do tego jeden "ficzerek" został błędnie zaimplementowany, aczkolwiek po 3 tygodniach walki uznałem, że i tak nie znajdę błędu, jak go będę szukał - stanie się to na przykład przy wiązaniu butów czy innej prozaicznej czynności.

Aha - ktoś (chyba Shirou Noir - pozdrawiam) ostatnio mnie nakłaniał o opisaniu "życia uczelnianego" (oczywiście, tego naukowego, bo z towarzyskim mam mało wspólnego). Spokojnie - jeśli zbierze się dostateczni dużo materiałów, to felietonik będzie.

High Dynamic Range Rendering

Otóż, na bazie tego przykładu, udało mi się dołączyć do przestrzeni nazw CEffects efekt HDR na bazie shaderów CG (w przykładzie jest na GLSL) oraz wielu niepotrzebnych i niedziałających zmiennych typu OKTTT (O Kant Tyłka To Trzasnąć). O dziwo, sam algorytm działa w miarę poprawnie - jest widoczny efekt zwiększonego zakresu barw i potwornej jasności, co można w sumie już nazwać efektem bloom (choć tak naprawdę, mieszają mi się definicje - dla mnie bloom to odmiana HDR, która jedynie bardziej rozjaśnia jasne miejsca). Jaki jest więc problem? A taki, że tekstura (specjalnie przygotowana w formacie RGBE) niesamowicie się rozjeżdża ku górze. Co ciekawe, na te rozjechane miejsca również działa efekt HDR. Dodatkowo, nie udało mi się zmusić już "powalającego" (jeśli chodzi o sposób komplikacji) kodu do zatwierdzania więcej niż jednej tekstury HDR. Cóż - rozwiązanie przyjdzie z czasem.

Mesh, czyli siatka wierzchołków

Postanowiłem połączyć relaksujące z pożytecznym. Mianowicie, chciałem napisać coś, do czego nie będę "używał" tutoriali (jeśli chodzi o sam cel kodu) oraz wykorzystującego jakąś fajną mechanikę, której wcześniej nie próbowałem, a powinienem. I tak powstała obsługa siatki wierzchołków z użyciem mechanizmu VBO (Vertex Buffer Objects), który dosyć mocno przyspiesza renderowanie. Posługując się tą lekcją Nehe, udało mi się stworzyć klasę gromadzącą wierzchołki, tworzącego VBO (o ile to możliwe), renderującą siatką, a także umożliwiającą eksport i import z i do pliku. Dodatkowo, klasa została zaprojektowana w ten sposób, że względnie łatwe jest jej zintegrowanie z obiektami klasy CCollisions, które posłużą do ustawienia i wykrywania kolizji.

Podczas pisania HDR, naszła mnie jedna refleksja - nieprojektowany kod się mści. Owszem, od początku zamierzałem dodawać kolejne funkcjonalności na luźno, bez wielkich planów związanych z rozwojem frameworka. Odczuwam jednak już tego skutki, czym są powtarzające się inicjalizacje shaderów, brak elastyczności przy efektach itd. Oczywiście, zamierzam dalej to rozwijać (o ile będę miał na to czas), aczkolwiek z całą pewnością muszę obmyślić, czy nie da się tego przeprojektować od nowa i dzięki temu zuniwersalizować nieco cały system, aby był prostszy dla osoby pielęgnującą kod (dla użytkownika pozostanie bez zmian). Innymi słowy - w dalekiej przyszłości myślałem nad dodaniem trybu DirectX (wypada się go w końcu, cholera, nauczyć) oraz organizacją kolejnych struktur na wzór tych z darmowych silników (chociażby OGRE). Może nawet uda się framework wyprowadzić na silnik - kto wie. To jednak, jak mówię, dopiero w dalekiej przyszłości - na razie skupiam się na projektach, uczelni oraz dodawaniem kolejnej funkcjonalności do Yesty, o ile będę miał czas i pomysły.

Morał jest jednak taki, że jeśli nie musisz robić tego inaczej - projektuj chociażby szkielet aplikacji. Aż mi się zresztą głupio zrobiło na Wprowadzeniu do Informatyki i wykładzie dotyczącym Inżynierii Oprogramowania. A także z tego powodu, iż nie zaufałem od razu Doxygenowi, żeby zautomatyzować dokumentację. Cóż, człowiek uczy się na błędach, a dzięki braku wsparcia dla Doxygena zachowałem przynajmniej specyficzny styl kodowania. Ale na przyszłość radzę pamiętać o tych "wspomagaczach".

Pozdrawiam i dziękuję - SceNtriC.

czwartek, 13 listopada 2008

Nadszedł (znaczy: przybył do mnie)

Sporo się u mnie teraz dzieje, aczkolwiek nie jest to raczej aktywność, jakiej bym pragnął. Pierwsze kolokwia, projekt, zadania do policzenia, drugi projekt... Kupa roboty. Przy Yeście też nie grzebałem, aczkolwiek jak mnie weźmie ochota, to nic mnie nie odciągnie, aby popróbować z następnym efektem. A mam już coś ciekawego na oku.

Fakt jednak, że ostatnio postanowiłem zaszaleć. Oczywiście, zaszaleć w iście informatyczny sposób - w końcu, nie od dziś wiadomo, że jeśli ktoś czeka, aż przekonam się do imprezowego stylu życia, to równie dobrze może oczekiwać na Duke Nukem Forever i jeszcze odleglejsze wydarzenia (słowem - srodze się zawiedzie [a przy okazji mamy tutaj przykład niestrawnego zdania wielokrotnie złożonego]). Tak czy inaczej, pochylony w Empiku nad stoiskiem z grami, rozpocząłem debatę z przyjaciółką Martusią (pozdrawiam serdecznie) odnośnie tego, czy kupno Perły Polskiego Gamedevu (w skrócie: PPG) nie osłabi mojej motywacji odnośnie pracy na studiach. Debata bardzo szybko się skończyła, ustępując żelaznemu uporowi towarzyszki, a także mojej "chcicy" posiadania czarnego pudełeczka za 79,90 zł. I kupiłem. Co? Wiedźmina - Edycję Rozszerzoną.

Gry oczywiście jeszcze nie przeszedłem (nie mam takiego zamiaru, ażeby szybko to uczynić), jednak ideą notki jest przekazanie pierwszych wrażeń z rozgrywki tego bardzo oczekiwanego dziecka CD-Projekt Red Studio (przy okazji - pozdrowienia dla całego zespołu). Muszę też przyznać, że najnowsze cRPG-i w jakie przyszło mi grać, to Wielka Trójca z 2002 roku, czyli Icewind Dale II, The Elder Scrolls III: Morrowind oraz Neverwinter Nights. Swoją drogą, każda z tych produkcji miała coś w sobie wyjątkowego - zwłaszcza "Morrek" (chociażby system rozwoju bohatera, który mi się cholernie podoba [inspirujące dla powstającego wówczas szkieletu systemu RPG dla niedoszłej gry], a także perspektywa pierwszej osoby) i "Newerek" (ukochane zasady DnD). Dlaczego o tym piszę? Żeby usprawiedliwić się, jeśli coś za bardzo będzie mi się podobało w Wiedźminie. Po prostu nie znam nowszych standardów gier z gatunku cRPG.

Po powrocie do domu, otwarciu pudełka, obejrzeniu zawartości (pełno płyt, mapka, poradnik do gry, opowiadanie imć Sapkowskiego,...) i zainstalowaniu, moim oczom ukazało się ładne intro i jeszcze ładniejsze menu główne... Uch, ale pewnie nie chcecie o tym czytać. W takim razie postaram się nieco to streścić w punktach.

1. Grafika jest świetna. Przynajmniej cut-scenki robią wrażenie, a także woda. Zdaję sobie sprawę, iż to nie jest mistrzostwo świata i że podobne rzeczy widać u konkurencji, ale ważne, że nie w żaden sposób nie odbiegamy od niej. Jest też pewny drobny fakt - musiałem zmniejszyć detale, gdyż konfiguracja Core Duo 2.4 GHz + 3 GB RAM + GeForce 9300M G niezbyt przychylnym okiem spojrzała na konieczność wyświetlania wszystkich cudów-niewidów na ekranie mojego laptopa. Nie wiem zatem również, jak się prezentuje gra na najwyższych detalach, ale podejrzewam, iż punkt ten opływałby wtedy w zachwyty. Choć do Crysisa chyba daleko.

2. System rozwoju postaci. Mamy możliwość (nawet konieczność) grania Naczelnym Bohaterem Prozy Sapkowskiego, Której Autor Notki Nie Czytał Nigdy, Gdyż Nie Miał Okazji Ani Ochoty (A Sam Jest Wyznawcą Pratchetta [I Ostatnio Przeczytał "Zbrojnych", Która To Książka Jest Dobra Niczym Groszek Z Majonezem]) (w skrócie - NBPS,KANNCN,GNMOAO(ASJWP[IOP"Z",KTKJDNGZM]) - podobny efekt można osiągnąć wpuszczając dowolne zwierzę futerkowe lub niefuterkowe na klawiaturę. No, może z wyjątkiem większych stworzeń w stylu słonia). Co poziom zdobywamy pewną ilość punktów brązowych, srebrnych i/lub złotych, które tylko czekają, aż je rozdysponujemy na interesujące nas talenty podzielone na wiele typów. Ogólnie przyznam, iż nie jest to styl, który szczególnie uwielbiam - dla mnie ideałem jest jasny podział na klasy z równie jasnym drzewkiem umiejętności dla każdej profesji (wypisz, wymaluj - Diablo II). Oczywiście, nie sposób odmówić Wiedźminowi przejrzystości pod tym względem - choć gdzieś brakuje mi też informacji o tym, jakie bonusy na danę chwilę posiadam (albo nie umiem szukać).

3. Walka. Wiąże się ona z opanowaniem wiedźmińskich szkół sztuki walki mieczem, których jest trzy - styl silny, szybki oraz grupowy. Wszystkie rodzaje są dostępne zarówno dla stalowego miecza (dobrego na humanoidy) oraz srebrnego (użytecznego na potwory). Jest też wprawdzie możliwość walki orężem w rodzaju siekiery czy sztyletu, ale ani razu z tego nie skorzystałem - satysfakcja z machania silnym mieczykiem może być chyba tylko przyrównana do radości z cięcia pulsującym mieczem świetlnym ze Starego Warsa. Nieźle też rozwiązano ciosy specjalne - po udanej serii uderzeń, na chwilę pojawia się ikonka z płonącym mieczem, co oznacza (jeśli zdążymy kliknąć) wyprowadzenie "zuej i mhrocznej" kombinacji zniewalajacych ciosów, gdzie wrogowie patrzą tępym wzrokiem jakby byli na wiecu przedwyborczym. Jedyne, co mi się nie podoba, to automatyczne chowanie przez bohatera broni po końcu aktualnej walki czy podniesieniu przedmiotu - ponowne wyjęcie oręża trwa troszkę czasu, a jego zawsze jest mało, gdy nadchodzą potwory z jedynym słusznym okrzykiem bojowym, czyli "aaaaa"!.

4. Magia. Reprezentowana ona jest tutaj za pomocą mechanizmu Znaków, które dodatkowo mogą być ulepszane za pomocą talentów. Niestety, nie wypowiem się tutaj zbyt gwałtownie, gdyż na maga się raczej nie nadaję...

5. Akcja i fabuła. Największa zaleta Wiedźmina. To miasto żyje! Ludzie wychodzą do pracy o 9 rano, wracają również o określnych porach i rzeczywiście pracują - nie porozmawiamy z Shani o sprawach prywatnych w momencie, kiedy zajmuje się ona chorymi w Szpitalu Lebiody. Nie ma też co marzyć o spotkaniu wieczorem naszego przyjaciela Zoltana na ulicach miasta Wyzimy - w końcu komu by się chciało spacerować o trzeciej w nocy, gdy niedaleko grasują bandyci (no dobrze, Geralt się nie liczy)? Sama akcja też jest bardzo dynamiczna i przede wszystkim - wątki się zazębiają. Można się pogubić w zadaniach, które w większości się na siebie nakładają, ale tworzą przy tym logiczną i harmoniczną całość. Wielkie brawa dla zespołu projektowego. Jedyne co mnie denerwuje, to konieczność upojenia się alkoholem w niektórych fragmentach gry (i mówię to jaki maniakalny abstynent, więc nie bierzcie tego tak bardzo do serca).

Cóż, mogę tylko polecić Wiedźmina. Być może to samo co on, a nawet więcej oferują inne współczesne produkcje, ale to Wiedźmak jest polski, nasz i konsultowany z pisarzem, którego spora część fantastów uwielbia. Niezręcznie mi też mówić za dużo, skoro tak naprawdę jestem dopiero u początku rozgrywki. Dlatego też nie mówię, iż ten artykuł nie doczeka się ciągu dalszego.

Pozdrawiam i dziękuję - SceNtriC.

poniedziałek, 3 listopada 2008

Znowu po przerwie...

Uaaa... Ostatnio sporo się działo. Nie chodzi mi tu tylko o sprawy "zawodowe" (uczelnia, zaliczenia, prace, a niedługo rozpoczynające się kolokwia). Od końca wakacji jednak troszkę programowałem i chociaż tak naprawdę powinienem się skupić na czymś innym (także innym projekcie), to od czasu do czasu troszkę pomęczę frameworka. Przy okazji kończę kolejną książkę w mojej czytelni pratchettowskiej, a mianowicie Straż nocną. Polecam - Prawda, Wolność, Sprawiedliwość. I Jajko Na Twardo. To są naczelne prawa rewolucji - zapamiętajcie na wszelki wypadek.

No dobrze, ale skupmy się na rzeczach związanych z frameworkiem. Przede wszystkim odkryłem sposób na...

Całkowite odblokowanie wydajności OpenGL-a pod Vistą

Ogólnie sprawa jest bardzo dziwna, żeby nie powiedzieć - kretyńska. Według tego, czego się nauczyłem w latach młodości (ach, kiedy to było...), pliki z roszerzeniem DLL raczej pomagały, aniżeli przeszkadzały działać aplikacji. Dlatego się dziwię, bo nie wyobrażałem sobie, że zbiory dyskowe opengl32.dll i glu32.dll zamieszczone w katalogu z programem sieją zamęt, zło, mrok i ogólnie cała konstrukcja trzęsie portkami przed DLL (wygląda na to, ze są nimi Drapieżne Ludożerne Lemingi). Po usunięciu tych plików nie dość, że aplikacje zaczęły działać w normalnym tempie, to jeszcze obsługiwały rozszerzenia i shadery CG. Prawdę mówiąc - nadal nie wiem, gdzie leżał problem. Ktoś potrafi mnie naprowadzić?

Następna sprawa wyniknęła dosyć gwałtownie. Otóż musiałem naprędce wymyślić rzecz, która zowie się...

Nazwa frameworka

Chciałem to już mieć za sobą, gdyż tak czy siak głowy do kreowania niesamowitych nazw nie mam (wystarczy wspomnieć Graphratora), a poza tym nie lubię skupiać na tym swojej uwagi, wychodząc też z założenia, że im szybciej coś wybiorę, tym będzie to dziwniejsze, a im będzie to dziwniejsze, to tym więcej interpretacji/wytłumaczeń/rozwinięć skrótów można wymyślić. A że inni będą się śmiali, to swoją drogą.

Tak czy inaczej, nazwa frameworka brzmi:

Yesta

Nie, nie jest to skrót od "Yes, Extremely Stupid Test Application", choć nie ukrywam, że podoba mi się takie absurdalne rozwinięcie. "Yesta" to inaczej "Początek", "Pierwszy". Samo słowo pochodzi z języka, z którego postanowiłem coś wybrać, a mianowicie elfickiego (konkretnie dialekt Quenya). Mam nadzieję, że nie jest aż tak głupia. Przynajmniej ładnie brzmi i kojarzy się z Vist... A nie, to akurat nie jest zaleta.

Przejdźmy teraz do wykazu "ficzerków", jakimi uraczyłem Yestę.

Mapy BSP

Tego typu obiekty są znane z produkcji pod egidą moich ideałów programistycznych, a mianowicie pana C. i spółki, czyli id Software (swoją drogą, jeśli ktoś jest aż tak zarozumiały i mu się wydaje, że jest na zaawansowanym poziomie oraż iż według niego na pewno będzie pracował w przyszłości w gamedevie [ba - może już nawet teraz pracować!], to niech popatrzy na oferty pracy id. Życzę powodzenia w spełnieniu wymagań). Mowa oczywiście o mapy BSP. Całkiem fajny i niegroźny mechanizm - a może się czasem przydać. Jest przy tym dosyć wydajny - stosuje algorytm obcinania powierzchni BSP (proszę mnie poprawić, jeśli się mylę) i ładnie "lajtmapuje" cały teren. Niezły widok. No i kolejny punkt w gonitwie za "ficzerkami" Esenthela, Final Quest, nGENE czy innych (pozdrawiam przy okazji twórców i żywię wielki szacunek).

Bufor pikselowy

Czyli mechanizm umożliwiający renderowanie do tekstury, poza ekran. Muszę powiedzieć, że byłem tutaj dużo większym optymistą, a skończyło się jak zwykle. Przede wszystkim, myślałem, że bazowanie na przykładzie będzie łatwe i proste, a tak naprawdę nie wszystko wyszło tak jak należy. A największym problemem jest to, że do końca nie wiem, co tak-naprawdę-nie-wyszło-jak-należy. Uważałem też, że od momentu wprowadzenia tej partii frameworka bardzo szybko przejdę do efektów typu bloom czy HDR i że w ogóle będę profesjonalny, podziwiany i będę miał prawo do dodatkowych kartek na wędliny. Ale i tak cieszę się z tego, co mam. Postanowiłem również poniżej umieszczać linki do kodów, na których się opierałem - na pewno komuś się to kiedyś przyda. A nie wątpie, że przeanalizuje je szybciej i dokładniej niż ja.

Fake Radial Blur

Cóż, jako że będzie trzeba powoli zacząć pisać efekty graficzne, utworzyłem sobie przestrzeń nazw CEffects, gdzie będą znajdowały się takowe funkcje. Na pierwszy ogień poszedł efekt Fake Radial Blur. Nie będę tutaj za bardzo się rozpisywał (w ogóle dzisiaj za bardzo się nie rozpisuję) - bardzo ładny opis jest właśnie w lekcji z Nehe [link poniżej]. Krótko tylko nadmienię, iż jest to coś w rodzaju rozmycia ekranu pod wpływem ruchu obiektów. Ciekawe zjawisko. Dobre, jak ktoś chce być zahipnotyzowany.

Usprawnienie liczenia klatek i klasy CCore

Tutaj także nie ma co się rozpisywać. Po prostu usprawniłem obydwie partie w dosyć znaczący sposób. Wynika to oczywiście z wymagań, jakie nakładały blur oraz p-bufor i konieczność chociażby pobierania uchwytu na konteksty WinAPI. Natomiast złe liczenie FPS-ów wytknęło już mi parę osób. Postanowiłem to poprawić - mam nadzieję, że będzie teraz wyglądać i działać lepiej.

Sockety

Od jakiegoś czasu myślałem też nad tym, jak zmusić programy do komunikacji między sobą i wymiany danych. Jest to najmniej rozwinięta i przetestowana część z dzisiejszych nagłówków. Myślę jednak, że już na tyle zaawansowana, że zasługuje już na wymienienie. Więcej o niej - przy kolejnych okazjach.

Widać na pewno jedną rzecz - to, że zakończyłem pracę nad jakimś kawałkiem kodu, nie oznacza wcale, iż już nigdy do niego nie powrócę. Dotyczy to w szczególności klas takich jak CCore czy CTextureManager. Myślę jednak, że jak na działanie typowo hobbystyczne i tak naprawdę nieplanowane (jeśli kogoś to interesuje - nie mam żadnej rozpiski, co zamierzam robić po kolei) nie wygląda to tak tragicznie. Póki co jednak, muszę mocno zwolnić pracę. Pewne sfery życia "zawodowego" zaczynają naciskać coraz mocniej.

Jak zwykle, uraduję się mogąc odpowiedzieć na jakiekolwiek pytania i komentarze z Waszej strony. Mam nadzieję, że prędzej czy później uda mi się wysmażyć kolejny artykulik o tym czy innym zagadnieniu. W końcu wypada zadbać o dydaktyczną warstwę tej witryny.

http://www.ultimategameprogramming.com/zips/Gl_BspLoader.ZIP

http://www.ultimategameprogramming.com/zips/Gl_OffScreen.ZIP
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=36
http://www.ultimategameprogramming.com/zips/Gl_FPS.ZIP
http://www.ultimategameprogramming.com/zips/Cpp_SendingReceiving.ZIP

Pozdrawiam i dziękuję - SceNtriC.