A legtöbb ember emlékezetében úgy marad meg egy demó, hogy látott egy rövid filmet. Ez lényegében igaz is, de pont az a különlegessége a demóknak, hogy számítógépes programok: elkészítésükben programozóknak is fontos szerep jut. Az ő tevékenységükbe pillantunk most bele.
Az alapoknak neki lehet indulni már az általános iskolai 8. osztályos matek tudással is, és nagyon gyorsan lehet fejlődni. Ugyanakkor egy igazán világszínvonalú demó elkészítése még a legképzettebb programozók számára is kihívás lehet: a Mojo Dreams készítői például a 30-as éveikben járnak.
C Nyelv
A legtöbb demó (akár a számítógépes játékok) C vagy C++ programozási nyelven készül. A C nyelv talán a “legtisztább�? strukturált programozási nyelv, a C++ ugyanennek a bővített, objektum-orientált változata. Ez az írás nem a C nyelv bemutatásáról szól. Ha még nincs tapasztalatod benne, a mezeic.uw.hu címen találhatsz egy bevezetést a C nyelv programozásába magyar nyelven. Az MSDN is tartalmaz egy elég jó C nyelv leírást, persze csak angolul.
Szinte minden anyag angol nyelven van a neten, ezért megéri az angol tudásodat fejleszteni, ha komolyan érdekel a grafikai programozás – akár demoscene, akár számítógépes játék fejlesztés céljából.
C Fordító
Tehát szerezzünk be egy C fordítót. Szerencsére ezért nem kell a pénztárcánkba nyúlnunk, sok jó C fordítót lehet ingyen is letölteni. Itt a Windows alat futtatható rendszerekről lesz szó.
A legelterjedtebb és a legjobban használható fejlesztőrendszer a Microsoft Visual C++ Express Edition. Ezt ingyen le lehet tölteni a microsoft.com-ról, de a Visual C++ Express mellett kell a Platform SDK is, és mindkettő 400 megabyte körüli méretű. Jobban jársz, ha nem bízod a Microsoft telepítőprogramjára a letöltést, hanem egyből az ISO image-eket töltöd le, és a Daemon Tools-szal használod őket.
Ha nem akarsz ennyit letölteni, akkor a DevC++ programot szerezd be (13.5 megabyte). Ez egyébként a MinGW rendszert tartalmazza, amiben a Linux-ból származó GCC nevű C fordítóprogram dolgozik.
Miből is építkezünk?
Egy demóhoz alapvetően képmegjelenítés és hanglejátszás kell, de érdemes a tömörítés, generálás, illetve az időzítés témakörét is átfutni.
Hanglejátszás
A hanglejátszással általában nem foglalkozunk sokat. Egy demó általában fmod-ot vagy bass-t használ. 64k intróhoz célszerű a minifmod használata. Ehhez a modplug tracker-ben lehet zenét írni. A 4k intrók esetében szinte mindig teljesen generált hang van, külső lejátszó használata nélkül. A hang-programozás egy külön világ. Ebbe betekinthetsz pl. a Jeskola Buzz program letöltésével. Vannak, akik saját Buzz plugin-eket írnak, és így készítenek hangot a 4k, ill. 64k intróhoz is.
Képmegjelenítés
A legtöbb demó 3d gyorsítót használ. A 3d gyorsító videokártya saját processzorral és memóriával rendelkezik, gyakorlatilag egy önálló “gép a gépben”. A legtöbb videokártya ATI vagy Nvidia processzorral készül, de minden egyes típus másként működik. Szerencsére nem kell több száz változatot készítenünk a programunkból, hanem egy szabványos interface segítségével használhatjuk az összes 3d gyorsítót. Két ilyen interface közül választhatunk: Direct3D vagy OpenGL. Az előbbi a Microsoft terméke, az utóbbi a Silicon Graphics bábáskodásával készült nyilvános program.
A Direct3D programozáshoz a DirectX 9 (vagy legújabb) SDK-t kell letölteni a microsoft.com-ról. Ez 100-200 megabyte méretű, és elég sok példaprogramot is tartalmaz.
Az OpenGL alapból “benne van” a legtöbb fejlesztőrendszerben, de jól jön egy OpenGL specifikáció az opengl.org címről, illetve ajánlhatom a NeHe cikksorozatot, ami egy nagyon részletes és újabban nagyon jó minőségben szerkeszett bevezető az OpenGL programozásba.
Sajnos a Direct3D-s vagy OpenGL-es programok nem fognak futni olyan gépeken, ahol nincs ilyen gyorsító (pl. régebbi gépeken, egyszerűbb notebook-okon). Továbbá erősen ajánlott a programunkat egy ATI és egy Nvidia videokártyán is tesztelni, hogy tényleg ne csak a saját gépünkön fusson.
Tömörítés vagy generálás
Ha egy adat sok ismétlődést tartalmaz, akkor kis okoskodással kevesebb helyen is el lehet tárolni – ez a tömörítés (data compression). A tömörítés legelterjedtebb módszerei a Huffman, Lempel-Ziv (ZIP), diszkrét koszinusz transzformáció (JPG). Lehet a tömörítés veszteségmentes (lossless), vagy veszteséges (lossy). Az utóbbi esetben nem pont az eredeti jelet kapjuk vissza, de majdnem :) �?gy működik a JPG és az MP3.
Demóknál a programot nem fontos tömöríteni, de az adatfáljok (textúrák, képek, zene) egyberendezéséhez a minizip library lehet elegáns megoldás. 64k intrókhoz az UPX, illetve a az Upack programok ajánlottak. 4k intrók tömörítésére a Crinkler programot lehet használni.
Egy állókép 640×480 felbontásban, tömörítetlen BMP formátumban 900 kb helyet foglal el. Veszteséges JPG tömörítéssel ezt lecsökkenthetjük akár 100 kb-ra is. Ez nagyszerű teljesítmény, de mégis hogyan lehet egy 64k intróba akár 10-20 nagyfelbontású textúrát is belepréselni?
Nos, nem lehetetlen, csak ekkor tömörítés helyett generálni kell. A generálás azt jelenti, hogy a grafikus apró részletekból (pl. négyzetekből, körökből, zaj-mintákból) építi fel a képet – és a 64k intro nem a végeredményt, hanem a létrehozás lépéseit tartalmazza. Ezek alapján a program a betöltés közben hozza létre a tényleges képet.
Ezzel a módszerrel meglepően valósághű anyagmintázatokat lehet létrehozni (fa, égbolt, fém, stb). Értelemszerűen fotókat nem tudunk így összerakni, hiszen szinte minden egyes pixel kirajzolását kénytelenek lennénk külön megadni.
4k, 64k intrók esetében nem csak a textúrákat, hanem a modelleket és a zenét is érdemes generálni. Van egy jó kis gyűjtemény a generálási algoritmusokból az In4K honlapján (persze angolul).
Időzítés
A demók különlegessége, hogy a képet a megjelenítés közben hozza létre a számítógép. A legtöbb film és animáció pontosan 25 képkocka/másodperc sebességgel van rögzítve. Egy demónál azonban minden egyes képkocka kirajzolása más-más időtartamot vehet igénybe – az adott PC sebességétől és az aktuális kép bonyolultságától függően.
De akkor hogyan érjük el, hogy mégis állandó sebességgel fusson a program, és ne veszítsük el a kép-hang szinkront?
A demó futása közben sosem indulhatunk ki abból, hogy hány képkockát rajzoltunk ki eddig. Minden kép kirajzolása előtt meg kell néznünk, mennyi idő telt el a demó kezdete óta – például a Windows beépített GetTickCount() függvényével, vagy a zenelejátszónk lejátszási pozíciójának lekérdezésével.
A program során az idő pontos egyezését sohasem szabad tesztelni. Példaképpen, ha van egy űrhajós jelenetünk a 34 és az 53. másodpercek között, az űrhajók megjelenítését akkor kell bekapcsolni, amikor először jutunk a 34 és 53 másodperc közötti idősávba (nem pedig akkor, ha pont 34 másodperc telt el a demó kezdése óta).
Forráskódok
A legtöbb programozó mások forráskódjából tanul a leggyorsabban. Rossz hozzáállás, hogy “csalás�? megnézni, amit mások már megírtak. Igazából az a helyzet, hogy fölösleges mégegyszer feltalálni az alapvető dolgokat. Az időnket érdemes inkább saját, egyedi ötleteink megvalósítására fordítani.
Forráskódok
17points: 4k intro, C, OpenGL (pouet)
Wobbler: 4k intro, C, OpenGL, sound (pouet)
Anruf aus Schweden: 64k intro, C++, OpenGL+shaders (pouet)
Dingus: demo engine, C++, Direct3D+shaders (pouet)
Portálok
NeHe – OpenGL programozás az alapoktól
in4k – 4k intró fejlesztői portál
gamedev.net – minden a játékfejlesztésről, elég sok grafikai programozásról szóló cikk
flipcode.com – sok régebbi, de jó cikk a grafikai programozásról
Végül…
Sok-sok önállóság kell a programozói tudásod fejlesztéséhez. Ha egy leírásban elakadsz, olvasd el többször, keress rá a google-ön vagy a wikipediában. Ha programhibába ütközöl, nézz bele egy olyan példaprogram forráskódjába, ahol működik a dolog.
Végül azonban hatalmas élmény azt látni, amikor “beindul�? a műved és úgy érezheted, létrehoztál valamit.
Ez egy jó kis összefoglaló :)
Hozzátenném, hogy akinek kérdése van demokódolással kapcsolatban, az a #scene.hu IRC csatornán szinte biztosan talál segítőkész kódereket :)
Szerintem is jo, koszonet erte!