All blog entries, ordered from most recent. Entry count: 1198.
# Switching to English
Tue
16
Jun 2009
I've decided to switch my website to English. I'm aware I'm not a master of English, so I can make some horrible language mistakes. Please forgive me that and also don't be afraid to tell me about them. You can post your comments in both English and Polish, as my website encoding is still Polish ISO-8859-2.
So why did I do it? I think game programming is a narrow and exotic subject, so if I share some knowledge here, more people will be able to benefit from it if I post it in English. Besides, most of programming stuff I read is in English, so it's actually even easier for me to write about programming in English than trying to translate all these technical terms to Polish, where there's often no single elegant translation. Many of other Polish programmers also blog in English, like Yarpen or SirMike, just to name a few. It's not that I don't care about my Polish friends. I still love you guys :) I just believe that all the programmers who can understand the stuff I post here can also read in English, as it's very important skill for every programmer.
All my older blog entries, descriptions of my productions and many other stuff will be still in Polish, as I'm not going to translate all these 677 records. I hope it won't bother anyone - all in all Internet is full of websites in exotic languages :)
# forum.gamedev.pl z innej strony
Sun
14
Jun 2009
W ostatnim czasie bardzo się zmieniłem. Może spowodował to wiek, mała ilość wolnego czasu, może jeszcze coś innego... W każdym razie udzielanie się na forum.gamedev.pl już nie sprawia mi tyle frajdy, co dawniej. Nie będę ogłaszał żadnego oficjalnego "odejścia z Warsztatu", bo nadal pasjonuję się programowaniem gier, a w Sieci nadal chętnie odpowiadam na ciekawe, techniczne, konkretne pytania. Jednak ogólnie na nasze forum patrzę teraz trochę z innej strony i dostrzegam ogólne schematy, które mnie nużą. Wg mnie większość pytań na forum można podzielić na takie typy:
[+] "Nie działa mi", czyli problem z utworzeniem projektu, błąd kompilatora albo linkera, ewentualnie problem z instalacją jakiejś biblioteki. Najczęściej problem polega na tym, że pytający nie zna podstaw obsługi Visual C++ albo języka C++ (np. nie umie wyłączyć Unicode albo Precompiled Headers w opcjach projektu). Nie mam nic przeciwko takim pytaniom. Zdaję sobie sprawę, że to, co dla zaawansowanych jest banalne, to dla początkujących stanowi nie lada przeszkodę - a przecież każdemu należy się szacunek i pomoc. Kwestia tylko, że te pytania wracają bardzo często jak bumerang, a odpowiedź musiałaby być zawsze taka sama.
[+] "Który wybrać" - język programowania, IDE, silnik, książkę do nauki, kartę graficzną, uczelnię lub cokolwiek. Problem z tego typu pytaniami jest taki, że nie ma jednej dobrej odpowiedzi. Oczywiście, są opcje lepsze i gorsze, ale każdy z odpowiadających ma swoje preferencje i dlatego zwykle nie mam ochoty czytać kilku stron odpowiedzi w stylu "ja polecam to", "a ja polecam tamto".
[+] Typowe problemy, przez które każdy musi przejść w początkach nauki programowania gier. Nie ma w nich nic złego, ale osobom z dłuższym stażem na forum po prostu nie chce się odpowiadać na to samo pytanie po raz setny. Najczęściej chodzi m.in. o: wydajne sprawdzanie kolizji (rozwiązanie: techniki podziału przestrzeni), działanie gry w stałym tempie (rozwiązanie: mnożenie prędkości razy delta_t), konwersja między liczbą a łańcuchem.
[+] "Porozmawiajmy o...", czyli ktoś rzuca temat (nazwa jakiejś nowinki, gry, technologii, czegokolwiek) tak jakby chciał powiedzieć: "niech każdy z was napisze teraz pod spodem, co o tym myśli". Dalej zgodnie z tym życzeniem ciągną się odpowiedzi w stylu "ja myślę że tak", "a ja myślę że tak", "a wcale nie bo tak" i nic z tego w sumie nie wynika.
[+] "Jak wydać grę" i inne tematy biznesowe: Są tacy, którzy chcieliby widzieć więcej takich dyskusji zamiast tylko o programowaniu, ale ja widzę z takimi wątkami co najmniej kilka problemów. Pierwszy: pytania często zadają młodzi pasjonaci, którzy nie skończyli i nie mają szansy w najbliższym czasie skończyć pisania swojej gry, a martwią się na zapas. Drugi: odpowiadającymi są często "profesjonaliści", którzy w swoich wiadomościach nie piszą żadnych konkretów i chcą tylko pokazać, jak bardzo są obeznani z tym biznesem. Trzeci: do takiej dyskusji często włączają się jacyś anonimowi panowie (nieraz specjalnie w tym celu zarejestrowani), którzy wygłaszając swoje mądrości nie szczędzą krytyki innym osobom czy nawet całym firmom. Przy takich tematach nigdy nie wiadomo, kto jest kim i po co napisał to co napisał, czy to nie "pijarowiec" z konkurencyjnej firmy.
[+] Wracająca co jakiś czas, epicka, ogólnowarsztatowa dyskusja jednego z dwóch rodzajów: albo nad "losami" naszego community, gdzie przeważa narzekanie tak jakbyśmy przeżywali wielki kryzys (chociaż tak naprawdę jest bardzo dobrze - w końcu ciągniemy już ponad 9 lat!!!), albo propozycja zebrania się i wspólnego napisania jednej, wielkiej gry (co jak wynika z wielokrotnego doświadczenia, nie ma szansy się udać).
Na zakończenie coś śmiesznego: Prawo Godwina (znane też m.in. jako "argumentum ad hitlerum"), które brzmi:
Podczas przeciągającej się dyskusji w Internecie prawdopodobieństwo przyrównania czegoś lub kogoś do nazizmu bądź Hitlera dąży do 1.
Brzmi nieprawdopodobnie, bo jakże można przejść od programowania do Hitlera? A jednak! Całkiem niedawno był sobie wątek Zarobki programisty. Dyskusja toczyła się i toczyła, aż około 15 strony zeszło na temat obozów koncentracyjnych i wątek trzeba było zamknąć. Cóż... Internet ma swoje prawa, a praw przyrody się nie oszuka :)
Comments | #humor #warsztat #web Share
# Dithering i inny postprocessing
Thu
11
Jun 2009
Dziś dalej bawiłem się w pisanie efektów postprocessingu. Szczególnie zainteresował mnie Dithering. Ta technika była stosowana do polepszania jakości obrazów w czasach, kiedy komputery dysponowały ograniczoną liczbą dostępnych kolorów. W szerszym kontekście Dithering oznacza celowe wprowadzanie szumów do sygnału celem zniwelowania nieprzyjemnego efektu powstającego w wyniku kwantyzacji do pewnej, małej liczby możliwych wartości (np. tylko kilka bitów na składowe RGB piksela czy próbkę dźwięku).
Dzisiejszy DirectX już nawet nie obsługuje palet, ale pomyślałem sobie, że napisanie takiego efektu renderowanego w czasie rzeczywistym za pomocą shaderów to będzie ciekawa część poznawania zagadnień związanych z tematem efektów pełnoekranowych i Non-Photorealistic Rendering.
Zasada działania takiego efektu jest stosunkowo prosta. Jeśli w kodzie shadera HLSL mamy dany kolor piksela Color.rgb, to możemy zmniejszyć precyzję każdego kanału do tylko 2, 3, 4 itd... możliwych wartości (g_DownsamplingFactor) za pomocą takiej operacji:
float Bias = 0.5; Color.rgb = floor(Color.rgb * g_DownsamplingFactor + Bias) / g_DownsamplingFactor;
To 0.5 służy do zaokrąglenia części ułamkowej, zamiast jej obcięcia. Jeśli teraz to przesunięcie 0.5 zastąpimy przesunięciem losowym w zakresie 0..1 (bez wartości skrajnych), to otrzymamy Dithering. Oto efekt:
Comments | #graphics #rendering #tools Share
# Czcionki z komputera Atari
Tue
09
Jun 2009
Współcześnie "Atari" kojarzy się z wydawcą gier, ale kiedyś pod tą marką produkowane były komputery - w czasach, zanim jeszcze pecet podbił świat. W sobotę byłem na imprezie demoscenowej poświęconej miłośnikom klasycznych platform (przede wszystkim, jak się okazało, 8-bitowych Atari). Na tym spotkaniu m.in. wykłady miał TDC. Dowiedziałem się z nich bardzo dużo o budowie i możliwościach sprzętu tamtej generacji (w tym układu graficznego), ówczesnym oprogramowaniu i rynku gier. Okazuje się, że Wolfenstein i Doom wcale nie były pierwsze i że bardzo dużo działo się już w czasach, kiedy mnie jeszcze nie było na tym świecie :)
Przy okazji trafiłem na polskie strony poświęcone Atari - atari.area i Atari Online, a na nich znalazłem kolekcję czcionek z tej platformy: [1], [2]. W przypływie dziwnej ochoty (zapewne spowodowanej niewyspaniem) postanowiłem dopisać wsparcie dla nich do swojego domowego projektu (pisanego oczywiście na PC i w DirectX).
Specyfikacji formatu pliku FNT nigdzie nie znalazłem, ale udało mi się go rozgryźć samemu. To z resztą nie było trudne, jeśli wiadomo, że taki plik ma 1024 bajty, a zawarta w nim czcionka to 128 znaków bitmapowych po 8x8 pikseli monochromatycznych. W końcu 128*8*8 = 8192 b = 1024 B :) Toteż napisałem samemu specyfikację tego formatu: Atari Font FNT File Format.txt, a czcionki z wyżej wspomnianej strony (razem ze screenami) pozwoliłem sobie spakować i udostępnić jako jedno archiwum, żeby łatwiej było ściągać - Atari_Fonts.zip. Przykładowa czcionka (jedna z 335) o nazwie "Atari" wygląda tak:

A efekt mojego kodowania prezentuje się tak (niezły oldschool :D)
Comments | #events #gui #rendering #gallery #demoscene Share
# MFC i Smart PropertyGrid
Sat
06
Jun 2009
Używam w pracy MFC i powiem wam, że wbrew temu co się mówi (i co wcześniej powtarzałem za innymi), to wcale nie jest taka zła biblioteka. Ta dostępna w płatnych wersjach Visual C++ biblioteka do GUI to tak naprawdę cienka, obiektowa nakładka na WinAPI. Tak więc ma swoje klasy odpowiadające m.in. różnym kontrolkom interfejsu, obiektom GDI itp., ale z zestawów flag bitowych czy też zasobów z zaprojektowanymi graficznie okienkami korzysta już z tych samych, co czyste WinAPI. Nie oferuje zbyt wiele ponad to, co API systemowe, ale trochę uprzyjemnia pracę. Jeśli ktoś zna dobrze WinAPI, to nie ma kłopotów z opanowaniem MFC ani powodów do narzekań, chyba że co najwyżej na to, że biblioteka jest tym czym jest i niczym więcej.
Szukałem wczoraj rozwiązania kwestii kontrolki Property Grid dla MFC i znalazłem bibliotekę Smart PropertyGrid.MFC firmy Visualhint. Jest świetna - ładna, potężna, rozszerzalna, a dzięki dobrze zaprojektowanemu interfejsowi opartemu na wielu klasach i koncepcji iteratorów, także wygodna w użyciu. Twórcy udostępnili ją całkowicie za darmo, bo teraz rozwijają i sprzedają wersję tej kontrolki dla .NET (choć przecież platforma .NET ma taką kontrolkę w standardzie).

Comments | #c++ #gui #libraries #winapi #visual studio Share
# Non-Photorealistic Rendering
Thu
04
Jun 2009
Szukając informacji na temat cieniowania kreskówkowego (Cell Shading) stwierdziłem, że temat renderowania obrazów stylizowanych, nie dążących do fotorealizmu, jest badany od wielu lat i stanowi obszerną dziedzinę. Dwa linkowiska zbierające sporo publikacji na ten temat to: Stylized Depiction in Computer Graphics, Non-Photorealistic Rendering.
Mnie szczególnie wpadł w oko artykuł A Non-Photorealistic Lighting Model For Automatic Technical Illustration (Amy Gooch, Bruce Gooch, Peter Shirley, Elaine Cohen, SIGGRAPH 1998). Autorzy przedstawili bardzo prostą, ale ciekawie pomyślaną technikę cieniowania stawiającą na czytelność ilustracji technicznych. Żeby ją zastosować, trzeba pomieszczać zwykłe oświetlenie światłem kierunkowym (Diffuse + Specular, brak cienia) z przejściem od kolorów ciepłych w stronę światła (żółty) do zimnych w stronę przeciwną (niebieski) i do tego dodać wykrywanie krawędzi.
Napisałem sobie coś takiego i wyrenderowałem śrubkę. Model znalazłem na tej stronie.
# Zabawy z GIMP-em #1 - Bloom
Tue
02
Jun 2009
Wiadomo, że programista to nie grafik - talentu artystycznego mieć nie musi. Ale warto umieć obsługiwać jakiś program graficzny, bo jego wykorzystanie bywa przydatne i całkiem ciekawe. Na przykład za pomocą GIMP-a możemy "statycznie" uzyskiwać efekty, które na co dzień kodujemy w czasie rzeczywistym, na GPU i za pomocą wszelkich zaawansowanych technik koderskich.
Jako przykład weźmy "słynny" efekt Bloom. Do jego wykonania posłuży darmowy GIMP. Mamy zdjęcie (Warszawa, centrum handlowe Złote Tarasy):
Duplikujemy jego warstwę (Layer / Duplicate Layer). Tą warstwę wyższą przekształcamy za pomocą krzywej (Color / Curves) tak, żeby wybrać tylko jasne obszary:
Potem tą warstwę mocno rozmywamy za pomocą Filter / Gaussian Blur:
Wreszcie przestawiamy tryb warstwy (Mode w panelu Layers) na addytywny (Addition) i Bloom gotowy - wszystko świeci! :D
Comments | #graphics #tools #rendering Share
# Windows 7 RC - moja recenzja
Sat
30
May 2009
Zainstalowałem na swoim laptopie dostępną za darmo, testową wersję Windows 7 RC. Laptop jest raczej złomowy i nie spełnia nawet wymagań (procesor Turion 64, 1.8 GHz, 1 GB RAM, a wersja 64-bitowa wymaga 2 GB RAM). Mimo tego nowy Windows działa całkiem nieźle. Ale po kolei... Poniżej moja mała recenzja Windows 7, z perspektywy stałego użytkownika Windows XP, który nie lubi i nie używa Visty.
Instalacja trwała ok. pół godziny. Pierwsze wrażenie: system jest ładny, podoba mi się jego styl graficzny. Pamięć RAM zajęta po uruchomieniu systemu, bez żadnych uruchomionych programów: 500 MB. To już mi się mniej podoba.
Nowy sposób, w jaki najczęściej używane programy można dodawać do paska zadań i do menu Start, podoba mi się bardzo. Nareszcie można przestawiać przyciski programów na pasku zadań!!! - coś czego od zawsze brakowało w Windowsie i o czym zawsze marzyłem :)