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