3D Programming - Universität Trier
Transcription
3D Programming - Universität Trier
Spieleprogrammierung Winter 2011 6. 3D Programming Zugänge •! DirectX –! Unmanaged (C++) –! Managed (C#) •! Fixed-function Pipeline •! Shader •! OpenGL •! Microsoft XNA (c) Peter Sturm, Universität Trier 1 Spieleprogrammierung Winter 2011 DIRECTX DirectX •! Laufzeitunterstützung für multimediale Anwendungen –! Direkter Zugang zu HW-Funktionalität –! Trotzdem hohe Kompatibilität •! Eigenentwicklung von Microsoft –! In Zusammenarbeit mit diversen HW-Herstellern •! Aushandeln der Funktionalität •! Seit DirectX 7.0 –! TnL HAL (Transform and Lightning) DirectX Hardware Abstraction Layer HAL Hardware Emulation Layer HEL Hardware (c) Peter Sturm, Universität Trier 2 Spieleprogrammierung Winter 2011 Funktionsumfang •! DirectX Graphics –! DirectDraw: 2D-Graphiken –! Direct3D (D3D): 3D-Darstellung •! DirectInput: Eingabegeräte •! DirectPlay: Networking (Multiplayer) •! DirectSetup: Installation von DirectX-Anwendungen •! DirectMusic: Alles was mit Ton zu tun hat •! DirectSound: (Low-Latency Sound) •! DirectShow: Streaming Media Historie •! Erste offizielle Version DirectX 5.0 •! TnL mit Version 7.0 –! GPU übernimmt zunehmend höhere Aufgaben •! Aktuell Version 9.0c –! Managed-Zugang –! Neue Möglichkeiten bei den Shadern •! Version 10 (Vista) –! Unified Shader •! Version 11 (7) (c) Peter Sturm, Universität Trier 3 Spieleprogrammierung Winter 2011 DirectX SDK •! Wo, Wie groß, Installation –! http://msdn.microsoft.com –! 550MB aktuelles SDK (August 2009) –! 18 MB Help für Visual Studio .NET •! Dokumentation –! C/C++ ist Teil des SDK –! C# (allg. managed) war mal ! •! Viele Beispiele –! Sample Browser Tools: dxdiag •! DirectX-Installation: dxdiag (c) Peter Sturm, Universität Trier 4 Spieleprogrammierung Winter 2011 Tools: capsviewer •! Darstellung der Capabilities Tools: Effect Viewer (c) Peter Sturm, Universität Trier 5 Spieleprogrammierung Winter 2011 Tools: MeshView Weitere Tools •! D3DSpy –! Beobachten der Direct3D-Funktionsaufruf (lokal und remote) •! DirectPlay Network Simulator •! DirectX Error Lookup –! Hexcode ! Textuelle Beschreibung •! Texture Tool •! DMO Tester (DirectX Media Objects) –! Streaming etc. •! Force Feedback Editor (c) Peter Sturm, Universität Trier 6 Spieleprogrammierung Winter 2011 Die Render-Pipeline in D3D •! Klassische Grundstruktur •! Fixed Function Pipeline •! Programmable Pipeline Grundsätzliches •! Initialisierung –! Wahl der gewünschten Hardware –! Wahl des Treibers –! Konfiguration (Vollbild, …) •! Beschreibung der 3D-Szene –! Nutzung vorhandener Primitive (Box, Sphere, …) –! Nutzung der Basisabstraktionen (Dreieck, …) •! Wiederholtes Zeichnen der Frames –! Eingebundenen in die Spielsimulation –! Game-Loop (c) Peter Sturm, Universität Trier 7 Spieleprogrammierung Winter 2011 Namespaces Microsoft.DirectX (c) Peter Sturm, Universität Trier 8 Spieleprogrammierung Winter 2011 Devices •! Hardware –! Unterstützung durch Hardware •! Software •! Referenz –! –! –! –! Reine Software-Implementierung Betonung der Funktionalität Effizienz nebensächlich Meist nur auf einem Entwicklungssystem zugänglich Zugang zu einem Device •! Manager-Objekt (manager) –! Suche nach geeignetem Adaptor –! Adapator = eigene HW –! Z.B. Dual-Head-Karte hat zwei Adaptoren •! Property: AdapterListEnumerator (Adaptors) –! Durchlaufen und nach Adapter mit gewünschten Eigenschaften suchen •! Capabilities –! Stimmen Fähigkeiten des Geräts mit meinen Anforderungen überein? (c) Peter Sturm, Universität Trier 9 Spieleprogrammierung Winter 2011 Knotenverarbeitung •! Primitive setzen sich aus Einzelpunkten zusammen –! Dreiecke (3 Punkte) –! Polygonzug –! Box (8 Punkte) •! Punkte werden häufig mehrfach verwendet –! z.B. jeder Punkt einer Box taucht in 6 Dreiecken auf •! Wo werden Knoten gespeichert und bearbeitet? –! SoftwareVertexProcessing: Standardisiert –! HardwareVertexProcessing: Kartenabhängig –! MixedVertexProcessing Primitive •! Knotenpuffer (Vertex Buffer) p2 –! p1, p2, p3, p4, p5, p6, ... •! Interpretation: –! –! –! –! –! –! Point List: p1, p2, p3, … p1 Line List: (p1,p2), (p3,p4), … Line Stripe: (p1,p2), (p2,p3), (p3,p4), … Triangle List: (p1,p2,p3), (p4,p5,p6), … Triangle Stripe: (p1,p2,p3), (p2,p3,p4), (p3,p4,p5), … Triangle Fan: (p1,p2,p3),(p1,p3,p4), (p1,p4,p5), … (c) Peter Sturm, Universität Trier p3 p4 p5 p6 10 Spieleprogrammierung Winter 2011 Allgemeine Vorgehensweise •! Anlegen und Füllen eines VertexBuffer –! Variable Informationen pro Knoten •! VertexBuffer mit Device verbinden –! device.SetStreamSource() •! Zeichnen –! device.BeginScene() device.DrawPrimitives(Type,FirstVertex,#Vertex) … device.EndScene() device.Present() // Darstellen Welche Informationen pro Knoten •! Spezielle Klasse CustomVertex (c) Peter Sturm, Universität Trier 11 Spieleprogrammierung Winter 2011 SHADER Historie •! DirectX = Konzept zur allgemeinen Nutzung hardwarebeschleunigter Dienste –! Standardisierung –! Effizienz –! Lastbalancierung •! „Kontrolliert“ HW-Bereiche hoher Innovation •! Bis Version 7 Erweiterung der Fixed-Function-Pipeline –! Aber mit Funktionsverlagerung in die GPU (Transform and Lighting) •! Erste programmierbare Shader ab Version 8 –! Starke Restriktionen •! Mit Version 10 werden GPUs zu echten SIMD-Rechnern (c) Peter Sturm, Universität Trier 12 Spieleprogrammierung Winter 2011 Umfeld Hauptspeicher Shader Shader GPU Core Core CPU Videospeicher Einbettung Pipeline Vertex Shader Geometry Shader Clipping Screen Mapping Triangle Setup Triangle Traversal Pixel Shader Merger •! Vertex Shader –! Modifikationen auf Knotenbasis •! Geometry Shader –! Modifikationen auf Primitivbasis •! Pixel Shader –! Modifikationen auf Pixelbasis (c) Peter Sturm, Universität Trier 13 Spieleprogrammierung Winter 2011 Capabilities SM 2.0/2.X SM 3.0 SM 4.0 DX 9.0, 2002 DX 9.0c, 2004 DX 10, 2007 VS Instruktionsslots 256 >= 512 4096 VS Max. Schritte 65536 65536 beliebig PS Instruktionsslots >= 96 >= 512 >= 65536 PS Max. Schritte >= 96 65536 beliebig Temporäre Register >= 12 32 4096 VS Konstantenregister >= 256 >= 256 14 * 4096 PS Konstantenregister 32 224 14 * 4096 Flow Control Optional Ja Ja VS Texturen Nein 4 128 * 512 PS Texturen 16 16 128 * 512 Integer Support Nein Nein Ja VS Input Register 16 16 16 PS Output Register 4 4 8 Einführung Vertex Shader •! Kleine Assemberprogramme •! Anbindbar an einen Vertex Stream •! Ausführung für jeden Vertex eines Streams –! Vordefinierte Input- und Hilfsregister –! Ergebnis steht in vordefinierten Ausgaberegistern –! Repertoir an Shader-Instruktionen (c) Peter Sturm, Universität Trier 14 Spieleprogrammierung Winter 2011 Input- und Output-Register •! Input Instruktionen •! Output (c) Peter Sturm, Universität Trier 15 Spieleprogrammierung Winter 2011 Beispiel Pixel Shader •! Kleine Assemblerprogramme •! Können bei der Bestimmung der Pixelfarbe intervenieren •! Grobarchitektur ähnlich Vertex Shader •! 2 Instruktionstypen –! Arithmetische Instruktionen –! Texturinstruktionen (c) Peter Sturm, Universität Trier 16 Spieleprogrammierung Winter 2011 Register Instruktionslimits (c) Peter Sturm, Universität Trier 17 Spieleprogrammierung Winter 2011 Arithmetische Instruktionen Texture Instructions (c) Peter Sturm, Universität Trier 18 Spieleprogrammierung Winter 2011 C for graphics: •! Open Source •! High-Level Shading Language –! Ersetzt Assembler für Vertex- und Pixel-Shader •! entstand in Zusammenarbeit mit Microsoft –! unterstützt DirectX 9 HLSL •! Vorteile –! Cross-API (DirectX und OpenGL) –! Cross-Plattform (Windows, Linux, Mac OS) Funktionsweise •! Entwicklung der gewünschten Shader •! Digital Content Creation (DCC) –! z.B. mittels Maya, 3ds max etc. –! Spezielle Editoren –! Spieleprogrammierung •! Übersetzung durch Cg-Compiler –! Zum Übersetzungszeitpunkt der Anwendung –! Zur Laufzeit der Anwendung (c) Peter Sturm, Universität Trier 19 Spieleprogrammierung Winter 2011 Programmiermodell 3D-Anwendung Spiel 3D-API DX oder OGL CPU-GPU Boundary GPU Frontend Primitive Assembly Programmable Vertex Processor Rasterization & Interpolation Raster Operations Programmable Fragment Processor Cg Language Profiles •! Gezielte Einschränkung von Cg auf spezifische Hardware- und Plattformeigenschaften •! Unterstützte Profile –! –! –! –! –! –! DirectX 9 Vertex- und Pixel-Shader (Versionen 2.x) OpenGL ARB Vertex- und Fragment-Programs OpenGL NV30 Vertex- und Fragment-Programs DirextX 8 OpenGL NV2X … (c) Peter Sturm, Universität Trier 20 Spieleprogrammierung Winter 2011 Cg Programme •! Ersetzen die “Assemblerroutinen” in DirectX •! Operieren auf in den Shadern definierten Ein- und Ausgaben –! Bindung an Programmvariablen geschieht über spezielle Syntax •! Innerhalb des Codes mehr oder weniger C Programmeingaben •! Variierende Eingaben –! Unterschiedliche Daten für jeden Aufruf des Vertex- oder Fragment-Programms •! Uniforme Eingaben –! Konstanten, Zusatzinformationen –! Gleichbleibend für jeden Vertex- oder Fragment-Aufrufs innerhalb eines Streams (c) Peter Sturm, Universität Trier 21 Spieleprogrammierung Winter 2011 Variierende Eingaben für Vertex-Programm •! Vordefiniert (in Anlehnung an Fixed-Pipeline) –! Position im 3D-Raum (Vertex) –! Normalenvektor an diesem Punkt –! Texturkoordinaten •! Zusätzliche Werte pro Vertex definierbar Variierende Ausgaben für Vertex-Programm •! … werden variierende Eingaben für FragmentProgramm –! Aus- und Eingabebeziehung wird ebenfalls über die Bindings hergestellt •! In allen Profilen definierte Bindings –! –! –! –! –! POSITION PSIZE FOG COLOR0, COLOR1 TEXCOORD0 – TEXCOOR7 •! POSITION muß immer ausgegeben werden (c) Peter Sturm, Universität Trier 22 Spieleprogrammierung Winter 2011 Variierende Ausgaben für Fragmente •! Zwingend –! COLOR: Bestimmt die endgültige Farbe –! DEPTH: Modifikation des Tiefenwerts Cg: Datentypen •! Grundtypen –! –! –! –! float (32 Bit), half (16 Bit), int, fixed (12 Bit), bool Handles auf ein Texturobjekt Vektoren (1 bis 4 Elemente): z.B. float1 bis float4 Matrixen (maximal 4x4): float2x2, float3x2, float4x4 •! Structures •! Arrays –! Assignments kopieren ganzes Feld (c) Peter Sturm, Universität Trier 23 Spieleprogrammierung Winter 2011 Statements und Operatoren •! Kontrollfluß –! Unterprogramme, if/else, while, for –! Keine Rekursion –! Schleifen müssen in manchen Profilen aufrollbar sein (Anzahl der Durchläufe zum Übersetzungszeitpunkt bekannt) •! Unmenge an arithmetischen Operationen –! –! –! –! –! Trigonometrische Funktionen Runden, Abschneiden, etc. Multiplikationen auch auf Matrizen, Vektoren, … Kreuzprodukt, Determinante, … Abbildung auf Texturen Beispiel: lit() (c) Peter Sturm, Universität Trier 24 Spieleprogrammierung Winter 2011 Beispiel: Geometrische Funktionen DirectX 10 •! Zu hohe CPU-Last in 3D-Echtzeitanwendungen –! Zunehmend feinere Modellierung, Physik, KI •! CPU übermäßig mit Ansteuerung der GPU beschäftigt •! Ziele –! –! –! –! –! Mehr Ressourcen in der GPU verwalten Bessere Lastverteilung CPU-GPU Multi-Passes komplett in GPU Shader-Funktionalität verallgemeinern (CPUs) Weg von den Capabilities, hin zu mehr Gleichheit •! Komplette Neuimplementierung (c) Peter Sturm, Universität Trier 25 Spieleprogrammierung Winter 2011 Fixed-Function Pipeline (Version 9) Programmierbare Pipeline (Version 9) Fixed-Function Pipeline wird auf den meisten aktuellen Graphikkarten durch interne Shader-Programme ausgeführt. (c) Peter Sturm, Universität Trier 26 Spieleprogrammierung Winter 2011 Programmierbare Pipeline (Version 10) Virtualized Memory (GPU/System Memory) Command Input Vertex Buffer Input Assembler •! Keine Fixed-Function-Pipeline mehr Index Buffer Vertex Shader Texture Geometry Shader Texture –! Einsatz der Shader essentiell •! SDK enthält Shadersatz für einfaches Portieren älterer Anwendungen Stream Output Rasterizer/ Interpolator Pixel Shader Texture Depth/Stencil Output Merger Render Target Die Shader •! Vertex Shader –! Transformation, Licht –! Per-Vertex Operationen •! Pixel Shader –! Textur-Komposistion –! Per-Pixel Operation •! Geoemtry Shader –! –! –! –! Per-Primitive Operationen Eingabe: beschreibenden Knoten Ausgabe: Stripes (Dreiecke, Linien, Punkte) Ausgabeanzahl wird im Setup festgelegt (c) Peter Sturm, Universität Trier 27 Spieleprogrammierung Winter 2011 Shader-Modell, Version 4 •! Gemeinsame Basis für alle Shader •! Befehlssatz mit CPU vergleichbar –! –! •! Integer und Bitoperation, Floating Point Erweiterung zu allgemein nutzbaren SIMD-Rechnern Freier Zugriff auf den Speicher •! Switch-Statements und Unterprogramme •! Keine Beschränkungen –! Mehr allgemein zugreifbare Ressourcen –! Beliebige Instruktionsanzahl Genauigkeit •! IEEE Floating-Point Compliance (fast) –! Präzises FP32-Rechnen •! Sampling •! Blending •! Mathematische Operationen •! Konvertierungen •! Exaktes Zeichnen •! Optimiertes Anti-Aliasing (c) Peter Sturm, Universität Trier 28 Spieleprogrammierung Winter 2011 Weitere Verbesserungen •! Vereinfachtes API –! Setup •! Verlagerung von Zustand auf GPU •! Speicherung zusätzlicher Zustandsinformation –! Constant Buffers auf unterschiedlichen Ebenen HLSL 4.0 •! C-ähnliche Programmiersprache –! Präprozessor –! Elementare Datentypen (float, int, bool, …) –! Operatoren, Variablen, Funktionen, … •! Spezialisierung auf 3D-Graphik –! Vektortypen sind elementar (float2, float3, float4, …) –! Geeignete Operationen (Matrizenmultiplikation) •! Dedizierter Compiler (fxc.exe) –! –! –! –! Abbildung höherer Funktionen auf Shader-Potential Loop unrolling Umfangreiche Mathematikfunktionalität Reflection möglich (c) Peter Sturm, Universität Trier 29 Spieleprogrammierung Winter 2011 Effects (fx) Effect Pool Effect Technique Variable State Object Pass Constant Shader DirectX 10 – Vista-Architektur WPF DWM Media Foundation PIX GDI Legacy D3D APIs DX VA Microsoftwritten code IHV-written code MIL D3D9 D3D9 Direct3D DXGI Ex 10 OpenGL OpenGL ICD Common pipeline (DDI) User-Mode Driver User Mode Kernel Mode Win32 Kernel DXG Kernel Kernel-Mode Driver Sam Z. Glassenberg, WinHEC 2006 (c) Peter Sturm, Universität Trier 30 Spieleprogrammierung Winter 2011 OPENGL OpenGL •! DirectX = Microsoft –! Single Source •! Alternative: OpenGL –! Sprach- und plattform-unabhängig –! Ursprung 1992 (SGI) •! jetzt Khronos Group Consortium (non-profit) –! Open* –! Adobe, AMD/ATI, Apple, ARM, Creative Labs, id Software, Epic Games, Ericsson, Google, IBM, Intel, Motorola, Mozilla, Nokia, Nvidia, Samsung, Sony, Oracle, Texas Instruments –! Kein Microsoft " (c) Peter Sturm, Universität Trier 31 Spieleprogrammierung Winter 2011 XNA XNA •! Aktuelle „managed runtime“ für DirectXAnwendungen •! Eingeführt 2004 •! Seit September 2010 XNA Game Studio 4.0 •! Ziel-Plattformen –! Windows PC –! Xbox 360 –! Windows Phone 7 •! Umfangreiches Framework (Engine?) (c) Peter Sturm, Universität Trier 32