Datorspelshistoria: : 50-tal Datorspelsgrafik Gustav Taxén gustavt@nada.kth.se http://en.wikipedia.org/wiki/tennis_for_two 2D1640 Grafik och Interaktionsprogrammering VT 2006 Datorspelshistoria: : 60-tal Datorspelshistoria: Tidigt 70-tal Universitetsdatorer Hackers och studenter CRT-sk skärmar Enkel interaktiv grafik Ex: SpaceWar Oscilloskop Analoga och tidiga digitala datorer Enkla brädspel typ tic- tac-toe toe Enkla interaktiva simuleringar,, ex: William Higinbotham's Tennis for Two Ralph Baer uppfinner och patenterar TV- spelet Nolan Bushnell grundar Atari och skapar en marknad för arkadspel med Pong Magnavox börjar sälja Ralph Baer's Odyseey-maskin En-spelskonsoller i massor (de flesta är olika Pong-varianter varianter) http://www.classicgaming.com/museum/pong/ Datorspelshistoria: : Sent 70-tal Datorspelshistoria: : ~1978-83 83 Arkadspelen (amerikanska och japanska) blir extermt populära ra.. Ex: Asteroids (Atari), Space Invaders (Taito) Spelkonsoller för hemmabruk blir programmerbara (Ex: Atari VCS 2600) Cartridges http://en.wikipedia.org/wiki/space_invaders TV- och arkadspelens "guldålder" 8-bitarsgrafik, laserdisk Flexibel och programmerbar hårdvara Arkadspel för konsoller Activision skapar marknad för spelutveckling http://en.wikipedia.org/wiki/pac-man 1
Datorspelshistoria: Krashen ~1983 Datorspelshistoria: : Sent 80-tal Hemdatorer,, Ex: Sinclair ZX Spectrum, Commodore 64, Commodore Amiga Diskett- och bandstationer TV-spelsmarknaden mättad med usla spel och jämförelsevis dålig hårdvara Återförsäljare får kalla fötter Japanmarknaden påverkas inte nämnvärt http://en.wikipedia.org/wiki/ Video_game_crash_of_1983 Hemdatormarknaden är fortsatt framgångsrik Stort antal mindre spelproducenter Skapar ny marknad: spelförl rläggare Nintendo får nytt grepp om europeiska och amerikanska marknaden med NES och "kvalitetsstämpeln" http://en.wikipedia.org/wiki/ Leisure_Suit_Larry Datorspelshistoria: Tidigt 90-tal Datorspelshistoria: : Sent 90-tal PCns modulära och snabba hårdvara får genomslag BBS:er och Internet ger upphov till ny marknad: : shareware Tidig 3D-grafik, ex: Wolfenstein 3D, Doom CD-ROM http://en.wikipedia.org/wiki/doom 3Dfx släpper specialhårdvara för 3D- grafik och skapar ny marknad för grafikkort 16-bitarsgrafik Multiplayerspel över LAN och Internet, t.ex. Quake, Ultima Online Konsollmarknaden hämtar ikapp PCns försprång, t.ex. Sega Saturn,, Sony PlayStation http://en.wikipedia.org/wiki/half-life http://en.wikipedia.org/wiki/myst Datorspelshistoria: : 2000-tal Nya konsoller, t.ex. Microsoft XBox och Nintendo GameBoy Advance Prestandan hos stationär konsoller är bättre än PC vid release Programmerbara grafikkort DVD-ROM Bredband Realism och simulering (bildsyntes, mekanik, akustik,,...) http://en.wikipedia.org/wiki/farcry http://www.elderscrolls.com/art/obliv_pc_screens_01.htm 2
http://media.pc.gamespy.com/media/739/739585/img_3378715.html http://screenshots.teamxbox.com/screen-hires/46349/fight-night-round-3/ http://media.ps2.ign.com/media/490/490849/img_3098669.html http://screenshots.teamxbox.com/screen-hires/42485/gears-of-war/ Datorspelmotorns komponenter Basbibliotek (matematik, minneshantering, spara/ladda tillstånd nd,, etc.) Grafikmotor Ljudmotor Fysikmotor Animationsmotor AI / behaviors argr ndargränssnittnssnitt och inenheter Nätverkskommunikation http://www.alanwake.com/ 3
Middleware Sedan några år tillbaka finns en ny marknad för middleware för spel Grafikmotorer Fysikmotorer Ljudmotorer Nätverkslösningarsningar Animationspaket Hårdvara Idag är grafikhårdvaran rdvaran programmerbar Man kan anta att parallella kärnor och specialiserad hårdvara blir alltmer vanligt i framtiden Specialhårdvara för t.ex. fysik finns redan Fokus på parallellalgoritmer, synkronisering, trådar dar,, etc. Content Ageia PhysX http://www.ageia.com/index.html Minst lika resurskrävande som spelmotorn! Underleverantörer rer för t.ex. filmsekvenser, texturer, animationer, musik / ljud Billigare att licensiera en spelmotor än utveckla en egen Ökade krav på realism och detaljer ökar kraven på content explosionsartat - och resurserna som krävs Automatgenerering (t.ex. texturer,, vegetation, terräng ng) "Dissekering" av ett spel Screenshots från http://www.planethalflife.com/half- life2/screenshots http://www.gamespot.com/pc/action/halflife2/ 4
Borttagning av skymda ytor Level-of of-detail Kommer alltid vara grundläggande ggande! Färre polygoner som ritas i onödan mer tid åt annat Innomhus: Portaler eller PVS; Utomhus: Octrees Bounding volumes för dynamiska objekt Klipp mot kamerans frustum http://graphics.lcs.mit.edu/~seth/ pubs/pubs.html Kommer alltid vara grundläggande ggande! Fler versioner av samma objekt, där antalet polygoner reducerats successivt Blanda / morpha mellan detaljnivåerna erna Lägsta detaljnivån är ofta en impostor eller billboard Särskilda algoritmer för terräng Simplistic ROAM Implementation Bryan Turner brturn@bellsouth.net Karaktärer rer och monster Hierarkiska "skelett" "Skinning" Förinspelade animationer, ofta motion capture Inverse kinematics Karaktärer rer och monster "Skinning" + "muskler" muskler" eller s.k.. "pose blending/morphing" för ansiktsanimation Hudshader uppbyggd av många lager texturer som kombineras på olika sätt Belysning Belysning Statisk vs. dynamisk belysning Statisk belysning ofta någon variant av radiosity-metoden metoden, lagrad i texturer Dynamisk ljussättning adderas under körning i shaders 5
Belysning Radiositytexturer kombineras med "detaljtexturer" för att få ljussatta material Skuggor Dynamiska skuggor fås genom att rita scenen från ljuskällans llans position Det ljuskällan llan "kan se" är belyst Det ljuskällan llan "inte ser" är i skugga er nder texturering på ett "smart" sätt Reflektioner Environment mapping Färdigrenderad bild av världen (utan vatten) kopieras till textur (låg upplösning sning) nd shader för att i varje vattenpixel hämta reflektionen baserat på vattnets normal Refraktion hanteras liknande Normalmappning Lagra en textur med normaler nd dessa vid ljussättningen Sekvenser av sådana kan också användas ndas för t.ex. vågor på vatten Specialeffekter Explosioner, eld, rök, damm, partiklar i luften, etc. Ofta billboardtexturer Ibland baserade på videosekvenser, t.ex. av riktig eld nd alpha för att göra genomskinliga Summera ihop bidraget från olika billboards Specialeffekter "Light shafts" är oftast billboardtexturer som är placerade längs med ljuskällans llans riktning (och så att de följer fönstrets form) Mer avancerade metoder finns också men bygger på ungefär samma idé 6
Post-processing Ta bilden och kopiera till textur Applicera t.ex.. Gauss- eller boxfilter på de pixlar vars intensitet är hög Tone mapping förekommer också (kräver pipelines där pixlar får vara flyttal utanför intervallet [0, 1]) Labben Göra ett enkelt spel OpenGL, Director, eller Java Grupper om 3-4 personer C:a 40 timmar per gruppmedlem Planera och dela upp arbetet! Interna deadlines! Håll kontakten med Gustav! Action- och shoot-em em-up-spel 2D-adventure http://en.wikipedia.org/wiki/defender_%28game%29 http://www.mobygames.com/game/dos/secret-of-monkey-island/screenshots Pusselspel Brädspel/strategispel http://en.wikipedia.org/wiki/tetris http://en.wikipedia.org/wiki/reversi 7
Shooting gallery Enkla 3D-shooters http://www.mobygames.com/game/wolfenstein-3d/screenshots http://www.mobygames.com/game/nes/duck-hunt/screenshots Exempel: : OpenGL / GLUT / C++ Corona (http://corona.sourceforge.net corona.sourceforge.net/) för att ladda JPEG-filer PortAudio (http://www.portaudio.com www.portaudio.com/) och LibSndfile (http://www.mega- nerd.com/libsndfile/) /) för ljud C:a 50 timmars arbete (inkl.. content) http://www.nada.kth.se/~gustavt/ink-roids/ glenable(gl_blend); glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA); gltexenvi(gl_texture_env, GL_TEXTURE_ENV_MODE, GL_REPLACE); roids: fixa alpha-kanal i textur Skapa två JPEG-filer, en med färgerna och en där RGB-kanalerna är samma och motsvarar de alphavärden du vill ha Ladda båda filerna till var sin array Skapa en ny array med dimensionerna: w h 4 Iterera över pixlarna och lägg ihop informationen från RGB- och A-bilderna nd resultatet som en RGBA-textur 8
roids: hantera framerate Se till att alla uppdateringar är i "enhet/s" enhet/s" Registrera en timer på 100 ms Räkna varje frame som ritas Då timern aktiveras, kolla hur många frames som hunnit ritas = f 1 / f är då antalet sekunder per frame! Nollställ timern och frameräknaren roids: : input glutkeyboardfunc() resp. glutkeyboardupfunc() glutspecialfunc() resp. glutspecialupfunc() Gör en statusvariabel för varje tangent När tangenten trycks ned, sätt till true När tangenten släpps pps, sätt till false I din idle()-funktion funktion, kolla statusen på tangenterna och uppdatera parametrar roids: fullskärm glutgamemodestring("1024x768:16@ 60"); glutentergamemode(); Innan du avslutar programmet måste du säga glutleavegamemode() ()! nd glutignorekeyrepeat(true) för att stänga av key repeat Glöm inte att återaktivera key repeat innan du avslutar programmet! roids: kollisionsdetektion Cirklar Om avståndet mellan två punkter är mindre än de två radierna tillsammans har vi en kollision roids: handtextade siffror Varje nummer (0-9) är en textur med alphakanal Alla texturerna har samma dimensioner För att rita ett nummer, dela upp det i sina siffror Välj rätt textur, rita siffran, flytta utritningspositionen enligt texturens bredd roids: : wrap-around around Se till att objekten flyttas runt när de kommit utanför skärmen. För varje riktning, translatera världen en skärmdimension och rita om. 9