Spelutveckling med.NET Johan Lindfors
Agenda Introduktion till DirectX och Direct3D ◦ Komponenter ◦ Grafik DirectX SDK och Visual Studio ◦ Visual Studio 2005 Express? XNA ◦ XNA Framework ◦ XNA GameStudio Express
Vad är DirectX? ◦ En grupp av tekniker som erbjuder multimedafunktioner till Windows-applikationer ◦ En samling komponenter ◦ API oberoende av hårdvara
Grafik ◦ Direct3D – 3D grafik ◦ DirectDraw – 2D grafik Ljud ◦ DirectSound Inspelning och uppspelning Mixning i realtid “Surround” och positionering i 3D Filter och effekter (reverb, dist osv) ◦ DirectMusic
DirectInput ◦ Hanterar inmatning med kontroller ◦ Tangentbord, joysticks, möss osv. ◦ Stöd för “Force Feedback” DirectPlay ◦ Protokoll-oberoende nätverksmöjligheter ◦ Fungerar med NAT och brandväggar DirectShow ◦ “Streaming media” ◦ Video
“Managed DirectX” “High Level Shader Language” API för animationer Förbättrat 2D stöd ◦ Interoperabilitet med GDI En massa annat
Komponenter ◦ DirectX grafik 2D – DirectDraw 3D – Direct3D ◦ DirectSound ◦ DirectInput ◦ DirectPlay ◦ AudioVideoPlayback Enklare hantering av ljud och video Alla funktioner och “features”
Bättre prestanda ◦ Eliminerar flaskhalsar med COM interoperabilitet ◦ Prestandan ligger i paritet med ren C++ Enklare utveckling ◦ Färre rader kod ◦ ”Ingen” minneshantering ◦ Kraftfull debuggning med Visual Studio Fördelar med MDX
Koordinatsystemet ◦ Vänsterhänt ◦ Högerhänt (OBS standard i XNA) Nästan allting konstrueras av trianglar En modell (kallas för Mesh) är en geometrisk struktur av trianglar Y Z X Grundläggande 3D
Vektorer (Vector3) ◦ Används för att definera punkter, riktningar, avstånd Matriser ◦ Matrix = 4x4 matris ◦ Används för transformationer Quaternion ◦ Används för rotationer 3D matematik
”Rendering Pipeline” Applikation ◦ Logik som är specifik för applikationen Geometri ◦ Definerar hur “världen” ser ut ◦ Operationer på polygoner Rasterisering ◦ Tilldelar färger till pixlar på skärmen ◦ Operationer på pixlar
Initialisera Hantera inmatning Uppdatera variabler Uppdatera skärm Städa upp Starta Direct3D ◦ Initialisera objekt ◦ “RestoreDeviceObjects” “Main Loop” ◦ Uppdatera ◦ Rita ◦ Repetera Städa upp Anatomin av en 3D-applikation
Vilken är den optimala loopen?
Videominne ◦ Vertexdata, texturer, osv. 3D kort har mer och mer tagit över geometriska operationer 3D kort är mycket bättre på geometri än en vanlig CPU ◦ Specialiserade för vektor-matematik Programmerbar “pipeline” ger nya möjligheter 3D kort
Exponerar funktionalitet från grafikkorten Hanterar dubbel- och trippel-buffring ”Hardware” ◦ Erbjuder bara existerande förmågor ”Reference” ◦ Enbart implementera i mjukvara ◦ Erbjuder alla förmågor ◦ Betydligt lägre prestanda Objektet ”device”
Skapa en device och rensa ytan
Enkla ◦ PointList ◦ LineList ◦ LineStrip Lite mer avancerade ◦ TriangleList ◦ TriangleStrip ◦ TriangleFan v1 v2 v3 v4 v5 v6 v1 v2 v3 v4 v5 v1 v2 v3 v4 v5 Primitiva typer
Rita något på skärmen
En vertex är mer omfattande än en punkt Vanliga vertex-format (CustomVertex) ◦ Transformed- X och Y för skärm ◦ TransformedColored- ovanstående och färg ◦ PositionOnly- X, Y och Z ◦ PositionColored- ovanstående och färg Kan också innehålla ◦ Normal för exempelvis ljussättning ◦ Tu och Tv koordinater för texturer Lagras ofta i en ”VertexBuffer” Mer om vertex
Effektivare buffert av vertex ◦ Kan lagra vertex i GPU-minnet ◦ Kan kombineras med en uppsättning index IndexBuffer ◦ Vektor med int eller short ◦ Kan snåla med minnet (med begränsningar) VertexBuffer
Använda Vertex- och Index-bufferts
“View Transform” ◦ Positionerar kameran ◦ Kontrollerar kamerans riktning ◦ Beskriver vad som är uppåt “Projection Transform” ◦ Kontrollerar kamerans lins ◦ Hur mycket och hur långt ska vi se Transformationer
“World Transform” ◦ Positionerar en modell i förhållande till andra Förflyttning ◦ Matrix.Translation(…) Rotation ◦ Matrix.RotationX(…) ◦ Matrix.RotationYawPitchRoll(…) Skalning ◦ Matrix.Scaling(…) Transformationer
Skapa en kamera
(0,0) (1,1) (1,0) (1,1) (0,1)(0,0) Texturer ◦ ”Mappa” en bild mot en triangel ◦ En bild har bara 2 dimensioner ◦ Tu och Tv koordinater Direct3D hanterar transformationer Texturer
Använda texturer
Olika typer av ljus ◦ Ambient – Lika mycket ljus överallt ◦ Direction – solen ◦ Point – lampa ◦ Spot – ficklampa Attribut på ljus ◦ Position, riktning, räckvidd och avmattning ◦ ”Diffuse”, ”ambient”, ”Specular” Ljussättning
Material och skuggor Material reflekterar ljus ◦ ”Diffuse” reflektion ◦ ”Ambient” reflektion ◦ ”Specular” reflektion och styrka ◦ ”Emission” – material verkar skina utan ljus Skuggor ◦ Flat – hela polygonen får samma nyans ◦ Gouraud – interpolering mellan vertex Normalen är viktig!!!
Varde ljus!
Modeller och objekt ◦ Skapas sällan av programmerare Flertal verktyg ◦ 3D Studio Max, Maya, Softimage ◦ Blender, Milkshape3D Olika filformat ◦.X är vanligt för DirectX ◦ Funktionalitet finns i D3DX Mesh Avancerade objekt
Meshes Vad behövs för att rita en Mesh ◦ Ladda data Information om vertex och index Material och texturer ◦ Uppdatera postition ◦ Rita Anropa DrawSubset(…) för varje material
Djup med z-buffer ◦ Sparar värde på djup för varje pixel ◦ Jämförs för att hantera perspektiv ”Stencil buffer” ◦ Kan användas för skuggor Andra bufferts
Avancerade objekt
Animerade meshes ◦ “Key Frame animation” ◦ “Skinned Meshes” Animations-API för att förenkla ◦ Har stöd för interpolering mellan “frames” ◦ Blanda animationer Animationer
Animationer
Text ”Fog” 2D och 3D tillsammans ”Skybox” ”AlphaBlending” Generera terränger Rita i fullskärm Flera skärmar samtidigt (backspegel) Andra saker
Andra saker…
Introducerades i DirectX 8 Ger flexibilitet och prestanda Vertex Shader ◦ Jobbar med en vertex åt gången ◦ Kan inte lägga till nya vertex Pixel Shader ◦ Jobbar med en pixel åt gången ◦ Kan inte lägga till pixlar ”Programmable Pipeline”
”Vertex Shader” Kan skapa effekter som inte setts tidigare ◦ Simulering av kläder ◦ Avancerad animation ◦ Ansiktsrörelser och talsynkronisering ◦ Linseffekter Verktyg finns ◦ Nvidia Endast en vertex åt gången ◦ Kan inte lägga till nya vertex
”Pixel Shader” Förändra det som slutligen ritas, per pixel ◦ Ljussättning ◦ Skuggor ◦ Serieboks utseende Jobbar med en pixel åt gången ◦ Kan inte lägga till nya pixlar
Effektfiler Uppdelade i tre delar Variabel deklarationer ◦ Texturer, matriser, parametrar Tekniker och passager ◦ Tekniker kan delas upp för hantering av olika typer av hårdvara Funktioner ◦ Kod som skrivs i exempelvis HLSL
Effekter och HLSL
DirectInput och numera även XInput Olika enheter ◦ Tangentbord ◦ Möss ◦ Gamepads och andra kontroller Relativt enkel hantering ◦ Initiera ◦ Läs av ◦ Agera Hantera inmatning
DirectSound ◦ Kan användas för ljudeffekter och musik ◦ Hårdvarukontrollerade bufferts Flexibilitet ◦ Positionera ljud i 3D-rymden ◦ Lägg till effekter, reverb, eko osv… Ljud och musik
Exempel Tutorials ◦ Bra att börja med ◦ Men det finns bättre på nätet Sample Framework ◦ Ett ramverk som utgångspunkt Verktyg DirectX SDK
Hur används Sample Framework?
PIX ◦ Kan användas för att analysera applikationen XACT ◦ Verktyg för konstruktion av ljud och sekvenser DXViewer ◦ Öppna och analysera.X-filer (även.FX) Texture tool ◦ För att skapa och editera texturer Några verktyg i DirectX SDK
33ms… klockan tickar snabbt! ◦ Den mesta tiden spenderas ritandes ◦ Hitta ställan att förberäkna värden istället för beräkningar varje “frame” Minneshantering ◦ Trådhantering ◦ Boxing/unboxing ◦ Släpp objekt Tänk på prestandan
XNA Game Studio Express Ge ”communityn” möjlighet att skapa mjukvara för ◦ Windows ◦ Xbox 360 XNA Game Studio Express XNA Framework
Skikten i XNA Framework Plattformen “Core Framework” “Extended Framework” Spel XACTXINPUTXContent Direct3D GraphicsAudioInputMath Storage “Application Model”“Content Pipeline” Starter Kits KodInnehåll Komponenter Legend XNA erbjuderDu erbjuder “Community”
Kom snabbt upp ”på banan” ◦ Första raden kod du skriver är för ditt spel! Abstraktion av plattformen ◦ Vilken är den bästa designen av loopen? ◦ Hur skapar jag och hanterar mitt ”Window”? ◦ Hur följer jag alla rekommendationer för plattformen? Game ◦ Bastypen för alla dina spel ◦ Händelser som “Load”, “Update” och “Draw” Platform CoreFramework ExtendedFramework Games XACTXINPUTXContentDirect3D GraphicsAudioInputMathStorage Application Model Content Pipeline Starter Kits CodeContent Comps “Application Model”
Platform CoreFramework ExtendedFramework Games XACTXINPUTXContentDirect3D GraphicsAudioInputMathStorage Application Model Content Pipeline Starter Kits CodeContent Comps “Application Model” GameComponent ◦ Bastypen för alla XNA-komponenter ◦ Författaren skriver ”Load”, ”Update” och ”Draw” ◦ Kan hitta och interagera med andra komponenter Game.GameComponents ◦ Hanteras vid exekvering av spelet ◦ Fullt ”design-time”-stöd i IDE
Platform CoreFramework ExtendedFramework Games XACTXINPUTXContentDirect3D GraphicsAudioInputMathStorage Application Model Content Pipeline Starter Kits CodeContent Comps Byggt på Direct3D 9 Uppdaterat API som följer riktlinjer för.NET ◦ Effects ◦ Resources ◦ Lock/Unlock ◦ Vertex streams Provided resources ◦ Mesh ◦ Texture ◦ Effects and shaders Grafik
Effekter i MDX 2.0
…och lite till
Effekter i XNA Framework
Platform CoreFramework ExtendedFramework Games XACTXINPUTXContentDirect3D GraphicsAudioInputMathStorage Application Model Content Pipeline Starter Kits CodeContent Comps Skillnader mot MDX “Programmable pipeline” ◦ Inget stöd för “fixed-function” ◦ Inga ljus, material, transformationer, FVF Inget stöd för D3DX mesh ◦ “Content pipeline” hanterar import av.X-filer Vi kommer att bidra med guide för migrering ◦ MDX 1.1 till XNA ◦ “Fixed function” till “programmable”-pipeline
Platform CoreFramework ExtendedFramework Games XACTXINPUTXContentDirect3D GraphicsAudioInputMathStorage Application Model Content Pipeline Starter Kits CodeContent Comps Ljud Bygg dina ljudresurser med XACT verktyget ◦ Lägg till ljud ◦ Justera egenskaper ◦ Bygg “ljudbanker” Enklare integration för utvecklare ◦ Åtkomst till ljud via logiska namn ◦ Loopar, strömmar och minneshantering ◦ Ingen lågnivå-hantering av bufferts
Platform CoreFramework ExtendedFramework Games XACTXINPUTXContentDirect3D GraphicsAudioInputMathStorage Application Model Content Pipeline Starter Kits CodeContent Comps Inmatning ”Immediate mode” modell för programmering ◦ Ingen initiering ◦ Ingen hantering av tillstånd Erbjuder ◦ Xbox 360 kontroller ◦ Tangentbord ◦ Möss (men bara för Windows)
Platform CoreFramework ExtendedFramework Games XACTXINPUTXContentDirect3D GraphicsAudioInputMathStorage Application Model Content Pipeline Starter Kits CodeContent Comps Lagring “StorageContainer” agerar som ett virtuellt filsystem ◦ Filer lagras på korrekt plats på varje plattform ◦ Stöd för flera lagringsenheter och profiler på Xbox 360 Strömbaserad integration med System.IO
Platform CoreFramework ExtendedFramework Games XACTXINPUTXContentDirect3D GraphicsAudioInputMathStorage Application Model Content Pipeline Starter Kits CodeContent Comps Vector, Matrix, Quaternion, Plane, AABB, Sphere, Ray, Frustum, Curve Högerhänt som grundinställning Enkelt integration Tester för snitt Hjälpklasser för förflyttning Matematik
Projektmallar för Xbox 360 spel Installera på konsol med F5 “Remote debugging” ◦ “Breakpoints” ◦ “Watches” ◦ “Debug and Trace” till PC’n Men inte… ◦ “Edit and Continue” ◦ Visualiserare för debuggning Platform CoreFramework ExtendedFramework Games XACTXINPUTXContentDirect3D GraphicsAudioInputMathStorage Application Model Content Pipeline Starter Kits CodeContent Comps Utveckling för Xbox 360
Platform CoreFramework ExtendedFramework Games XACTXINPUTXContentDirect3D GraphicsAudioInputMathStorage Application Model Content Pipeline Starter Kits CodeContent Comps ”Starter Kits” Kompletta, fungerade spel ◦ Använd som utgångspunkt för dina egna spel ◦ Åtkomst via ”New Project…” ◦ Tryck på F5 och börja spela ◦ Dokumentation och ”tutorials” Tillgänglighet ◦ 2 kommer att inkluderas i XNA Game Studio Express ◦ Nya ”kits” planeras att släppas regelbundet efter lansering
Tips på böcker Managed DirectX Shaders Modellering Tips och tricks
Andra resurser Forum ◦ ◦ ◦ ◦ Microsoft ◦ msdn.microsoft.com/forums ◦ msdn.microsoft.com/directx ◦ msdn.microsoft.com/xna ◦ ◦ ◦ Nvidia ◦ developer.nvidia.com
blogs.msdn.com/johanl
Titel på sliden