RSS

Grafika w grach: jak to robiły stare komputery

Liczba odsłon: 284

Kompute­ry by­ły wy­ko­rzys­ty­wa­ne do roz­ryw­ki prak­tycz­nie od zaw­sze. Gry kom­pu­te­ro­we pi­sa­no na­wet dla ma­szyn, któ­re po­zba­wio­ne by­ły moż­li­woś­ci two­rze­nia gra­fi­ki ra­stro­wej. Prawdzi­wą re­wo­lu­cję wy­wo­ła­ła jed­nak do­pie­ro dyna­micz­na, ko­lo­ro­wa gra­fi­ka wy­so­ko­roz­dziel­cza mi­kro­kom­pu­te­rów do­mo­wych.

Gdy pa­trzy­my dzi­siaj na gry uru­cha­mia­ne na ta­kich kul­to­wych ma­szy­nach jak ZX Spec­trum, Atari XL/XE czy Com­mo­dore 64, nie zda­je­my so­bie na­wet spra­wy, jak skom­pli­ko­wa­ne by­ło ko­do­wa­nie szyb­kiej i płyn­nej ani­ma­cji, peł­nej po­ru­sza­ją­cych się w róż­nych kie­run­kach obiek­tów. Dzisiejsze kom­pu­te­ry rea­li­zu­ją ta­kie za­da­nia bez naj­mniej­sze­go wy­sił­ku, mie­sza­jąc na ekra­nie ty­sią­ce obiek­tów ra­stro­wych wy­so­kiej roz­dziel­czoś­ci. Kompute­ry 8-bi­to­we nie mia­ły ta­kich moż­li­woś­ci i by gry ta­kie jak Cauldron czy Mayhem in Monster­land mog­ły ku­sić ko­lo­ro­wą ru­cho­mą gra­fi­ką, pro­gra­miś­ci mu­sie­li wy­ko­rzys­ty­wać wie­le sztu­czek.

Grafika kaf­lo­wa za­miast ra­stro­wej

Dzisiejsze mi­kro­kom­pu­te­ry bez prob­le­mu prze­twa­rza­ją set­ki me­ga­baj­tów na se­kun­dę. Dla 8-bi­to­wych pio­nier­skich ma­szyn wy­peł­nie­nie ca­łe­go obra­zu ra­stro­we­go – zaj­mu­ją­ce­go za­zwy­czaj od 8 do 16 KiB – by­ło nie la­da za­da­niem. Wykorzy­sta­nie w grach zwyk­łe­go try­bu ra­stro­we­go nie wcho­dzi­ło za­tem w ogó­le w ra­chu­bę.

Rozwią­za­niem by­ła gra­fi­ka kaf­lo­wa (ang. tile-based gra­phics). Technika ta po­le­ga na zmo­dy­fi­ko­wa­niu za­war­toś­ci ge­ne­ra­to­ra zna­ków tak, by ry­su­jąc na ekra­nie li­te­ry i sym­bo­le za­peł­niać go gra­fi­ką. Najle­piej jest, oczy­wiś­cie, je­że­li ry­so­wa­ny ob­raz ma wie­le po­wtó­rzeń nie­któ­rych ele­men­tów, ale ty­po­we gry właś­nie tak wy­glą­da­ją: jed­no­li­te ścia­ny plat­for­mó­wek, kil­ka ta­kich sa­mych drzew roz­rzu­co­nych po ma­pie, du­że po­ła­cie łąk al­bo la­sów. Zamiast ge­ne­ro­wać i prze­no­sić dzie­więć baj­tów re­pre­zen­tu­ją­cych 64 pik­se­le, moż­na prze­nieść dwa baj­ty za­wie­ra­ją­ce kod ko­lo­ro­we­go zna­ku-kaf­la. Naryso­wa­nie ca­łe­go ekra­nu 30 ra­zy na se­kun­dę wy­ma­ga w ta­kim przy­pad­ku prze­pu­sto­wo­ści rzę­du nie 400 KiB/s, lecz 50 KiB/s — naj­zu­peł­niej real­nej dla mi­kro­pro­ce­so­ra dzia­ła­ją­ce­go z częs­to­tli­woś­cią 1 MHz i wy­ko­nu­ją­ce­go jed­no prze­nie­sie­nie w kil­ku cyk­lach ze­ga­ro­wych.

Duszki

Gry zbu­do­wa­ne wy­łącz­nie na ba­zie gra­fi­ki kaf­lo­wej są pry­mi­tyw­ne i nud­ne. Wystar­czy og­ląd­nąć kil­ka gier dzia­ła­ją­cych na Com­mo­dore VIC-20 by do­strzec naj­waż­niej­szą ce­chę wspól­ną: brak płyn­no­ści ru­chu i sko­ko­we prze­miesz­cza­nie się ele­men­tów obra­zu.

Problem roz­wią­za­no za po­mo­cą tak zwa­nych dusz­ków (ang. spri­tes). Duszek to nie­za­leż­ny obiekt gra­ficz­ny, na­kła­da­ny na ob­raz ge­ne­ro­wa­ny za po­mo­cą kaf­li. Jednoczes­na licz­ba ry­so­wa­nych dusz­ków jest moc­no ogra­ni­czo­na (za­zwy­czaj kil­ka sztuk), po­dob­nie jak ich roz­miar. Duszki moż­na jed­nak umie­szczać na ekra­nie w do­wol­nym miej­scu, z do­kład­no­ścią do jed­ne­go pik­se­la, dzię­ki cze­mu mo­gą ru­szać się płyn­nie, bez wy­raź­nych sko­ków ty­po­wych dla kaf­li. Kolory dusz­ków mo­gą być usta­la­ne rów­nież nie­za­leż­nie od tła, co po­zwa­la unik­nąć kon­flik­tu atry­bu­tów (ang. at­tri­bu­te clash), ty­po­we­go na przy­kład dla Sin­clair ZX Spec­trum. W ra­zie po­trze­by, by uzys­kać wie­lo­barw­ne­go dusz­ka, moż­na na­ło­żyć na sie­bie w jed­nym miej­scu ekra­nu kil­ka prost­szych dusz­ków.

Stosowa­nie dusz­ków da­wa­ło auto­rom gier nie­ja­ko „za dar­mo” do­dat­ko­we moż­li­woś­ci. Układy sprzę­to­we auto­ma­tycz­nie wy­kry­wa­ły ko­liz­ję dusz­ków ze so­bą lub z kaf­la­mi tła i zgła­sza­ły ten fakt pro­gra­mo­wi w po­sta­ci przer­wań. Wystarczy­ło od­po­wied­nio skon­fi­gu­ro­wać dusz­ki i za­rzą­dzać ich prze­miesz­cza­niem się na ekra­nie: je­że­li gracz ze­tknął się z wro­giem lub po­cis­kiem, pro­gram był o tym po­wia­da­mia­ny bez ko­niecz­noś­ci wy­ko­ny­wa­nia obli­czeń na włas­ną rę­kę.

Przerwa­nie ra­stra

Bardziej am­bit­nym auto­rom gier kom­pu­te­ro­wych ogra­ni­cze­nie licz­by dusz­ków szyb­ko da­wa­ło o so­bie znać. Rozbudo­wa­ne pro­duk­cje mog­ły mu­sieć ry­so­wać na ekra­nie nie kil­ka, lecz kil­ka­naś­cie jed­no­cześ­nie ani­mo­wa­nych po­sta­ci. Tymcza­sem na przy­kład ta­ki Com­mo­dore 64 po­zwa­lał ry­so­wać na­raz je­dy­nie osiem dusz­ków, a je­że­li mia­ły być one wy­so­ko­roz­dziel­cze i wie­lo­barw­ne, ich licz­ba szyb­ko spa­da­ła do czte­rech lub dwóch.

Rozwią­za­niem by­ły przer­wa­nia ra­stra (ang. ra­ster in­ter­rupts). Układ gra­ficz­ny ob­słu­gu­ją­cy przer­wa­nia ra­stra moż­na za­pro­gra­mo­wać, by w mo­men­cie ry­so­wa­nia kon­kret­ne­go wier­sza obra­zu wy­ge­ne­ro­wał prze­rwa­nie. Mikropro­ce­sor jest wy­raź­nie szyb­szy od ukła­dów od­chy­la­nia dzia­ła elek­tro­no­we­go, za­tem za­nim ko­lej­ne pik­se­le wier­sza po­ja­wią się na ekra­nie, moż­na do­ko­nać drob­nych mo­dy­fi­ka­cji pa­ra­met­rów obra­zu.

Na przy­kład, nor­mal­nie ka­fel obra­zu mo­że być ry­so­wa­ny tyl­ko dwo­ma lub czte­re­ma róż­ny­mi ko­lo­ra­mi. Jeżeli jed­nak w mo­men­cie do­tar­cia do po­ło­wy wy­so­koś­ci kaf­la zmie­ni­my atry­bu­ty, dol­na po­łów­ka ry­so­wa­nych kaf­li mo­że mieć in­ną ko­lo­ry­sty­kę, niż gór­na. W ten spo­sób moż­na uzys­kać efek­tow­ny, wie­lo­barw­ny tekst na­wet je­że­li układ gra­ficz­ny po­tra­fi ry­so­wać je­dy­nie dwu­barw­ne zna­ki wy­so­kiej roz­dziel­czoś­ci.

A co się sta­nie, je­że­li w mo­men­cie do­tar­cia do po­ło­wy ekra­nu prze­nie­sie­my ku do­ło­wi obra­zu dusz­ka, któ­ry nor­mal­nie znaj­du­je się przy gór­nej kra­wę­dzi? Powinien zniknąć u gó­ry, a po­ja­wić się na do­le, jed­nak je­go ob­raz prze­cież już zo­stał na­ry­so­wa­ny przez dzia­ło elek­tro­no­we. Efekt? Na ekra­nie po­ja­wią się dwie ko­pie dusz­ka. A je­że­li do­dat­ko­wo prze­łą­czy­my wskaź­nik da­nych obra­zo­wych dusz­ka, na­ma­lu­je­my dwa zu­peł­nie róż­ne dusz­ki w dwóch miej­scach ekra­nu. Oczywiś­cie, w tym ce­lu trze­ba co ram­kę obra­zu prze­łą­czać dwa ra­zy kon­fi­gu­rac­ję dusz­ka, co zna­czą­co kom­pli­ku­je pro­gram i mo­że ozna­czać ko­niecz­ność re­zyg­na­cji z auto­ma­tycz­ne­go wy­kry­wa­nia ko­li­zji, jed­nak war­stwa wi­zu­al­na gry zys­ku­je na tym tak zna­czą­co, że pro­gra­mi­ście opła­ca się utrud­nić so­bie pra­cę: za­miast oś­miu dusz­ków, na ekra­nie moż­na użyć jed­no­cześ­nie na­wet kil­ku­dzie­się­ciu.

Płynne prze­wi­ja­nie obra­zu

Duszki i przer­wa­nia ra­stra nie roz­wią­zu­ją głów­ne­go prob­le­mu zwią­za­ne­go z bu­do­wa­niem obra­zu z kaf­li: sko­ko­we­go prze­wi­ja­nia za­war­toś­ci ca­łe­go ekra­nu. Dopóki pi­sa­na gra prze­łą­cza plan­sze w ca­ło­ści, moż­na tę kwe­stię ukryć przed gra­czem. Jeżeli jed­nak wę­dro­wa­nie gra­cza po ma­pie ma się od­by­wać płyn­nie, zbli­ża­nie się do kra­wę­dzi ekra­nu nie po­win­no po­wo­do­wać nag­łe­go prze­sko­ku za­war­toś­ci ekra­nu o ca­ły ka­fel.

Na szczęś­cie po­myś­le­li o tym twór­cy wie­lu ukła­dów gra­ficz­nych. Na przy­kład, sto­so­wa­ny w Com­mo­dore 64 VIC-II ma moż­li­wość prze­wi­ja­nia obra­zu w pio­nie oraz po­zio­mie z do­kład­no­ścią do jed­ne­go pik­se­la. Autor gry mu­si za­dbać je­dy­nie o to, by w pa­mię­ci obra­zu zna­lazł się opis kaf­li z re­zer­wą wy­star­cza­ją­cą do wy­świet­le­nia do­dat­ko­we­go wier­sza lub ko­lum­ny, wsu­wa­ją­cych się zza kra­wę­dzi ekra­nu. Następ­nie sie­dem ra­zy do­ko­nu­je się prze­su­nię­cia o je­den piksel, by w koń­cu za ós­mym ra­zem wy­ze­ro­wać re­jest­ry prze­su­nię­cia i prze­su­nąć ob­raz o pe­łen ka­fel.

Płynne prze­wi­ja­nie obra­zu moż­na też po­łą­czyć z ob­słu­gą przer­wań ra­stra. W ten spo­sób część ekra­nu mo­że za­wie­rać prze­wi­ja­ną ma­pę gry, pod­czas gdy wzdłuż gór­nej i dol­nej kra­wę­dzi plan­szy ry­so­wa­ne są nie pod­le­ga­ją­ce prze­wi­ja­niu tab­li­ce przy­rzą­dów ste­ro­wa­ne­go po­jaz­du lub in­for­mac­je o wy­ni­ku gry. Z kolei włą­cza­jąc i wy­łą­cza­jąc prze­wi­ja­nie po­zio­mie na róż­nej wy­so­koś­ci obra­zu moż­na stwo­rzyć efekt płyn­ne­go prze­wi­ja­nia jed­ne­go lub kil­ku wier­szy tek­stu — czy­li ty­po­wy scroller.

Centralne ste­ro­wa­nie ko­lo­rem tła i obra­mo­wa­nia

Większość ukła­dów gra­ficz­nych daw­nej ery dys­po­no­wa­ła po­ję­ciem tła obra­zu (ang. back­ground). Elementy przez­ro­czy­ste by­ły ry­so­wa­ne jed­nym, wspól­nym dla ca­łe­go obra­zu ko­lo­rem tła. Typowo by­ła to czerń, jed­nak pro­gra­mis­ta mógł w kil­ku cyk­lach ze­ga­ro­wych zmie­nić bar­wę tła na in­ną. Jeżeli sek­wen­cję zmian wy­ko­ny­wa­ło się od­po­wied­nio szyb­ko, uzys­ki­wa­ło się efekt mi­go­ta­nia z po­wo­dze­niem to­wa­rzy­szą­cy eks­ploz­jom na ekra­nie.

Łącząc moż­li­wość zmia­ny ko­lo­ru tła i obra­mo­wa­nia z ob­słu­gą przer­wa­nia ra­stra, moż­na by­ło też nie­wiel­kim na­kła­dem pra­cy po­dzie­lić ekran na częś­ci o róż­nej za­war­toś­ci, uni­ka­jąc ogra­ni­cze­nia licz­by barw wy­stę­pu­ją­cych jed­no­cześ­nie na ekra­nie. I tak, gór­na część obra­zu mog­ła mieć sza­re tło z de­ta­la­mi uda­ją­cy­mi chmu­ry, po­ni­żej mógł znaj­do­wać się nie­bies­ko-tur­ku­so­wy ob­szar nie­ba, jesz­cze ni­żej sza­re, zie­lo­ne i brą­zo­we ob­sza­ry skał, tra­wy i zie­mi, a na sa­mym dol­ne czar­ne tło plan­szy z punk­ta­cją.

Pod­su­mo­wa­nie

Dzisiaj wszyst­kie te efek­ty są cał­ko­wi­cie nie­po­trzeb­ne. W cza­sie po­mię­dzy dwie­ma klat­ka­mi obra­zu no­wo­czes­ne pro­ce­so­ry gra­ficz­ne są w sta­nie do­ko­nać ra­ste­ry­zac­ji ca­łej skom­pli­ko­wa­nej sce­ny 3D. Nawet w przy­pad­ku gier kla­sy ret­ro wy­ko­rzys­tu­je się zwyk­łe wie­lo­barw­ne dusz­ki ra­stro­we w nie­ogra­ni­czo­nej licz­bie i roz­mia­rach. Olbrzymia moc obli­cze­nio­wa obec­nych mi­kro­kom­pu­te­rów po­zwa­la ujed­no­li­cić pro­ces ge­ne­ro­wa­nia gra­fi­ki i sku­pić się na treś­ci, a nie na środ­kach poz­wa­la­ją­cych uzys­kać pew­ne efek­ty. Warto jed­nak znać za­pom­nia­ne już tech­ni­ki, choć­by dla za­spo­ko­je­nia cie­ka­woś­ci „jak się to daw­niej ro­bi­ło”.