DirectX und OpenGL
Transcrição
DirectX und OpenGL
DirectX und OpenGL Proseminar Multimedia-Hardwareerweiterungen Michel Weimerskirch, 15. Februar 2006 Inhalt • • • • • • • Einleitung Übersicht DirectX und Komponenten Übersicht OpenGL Sprachlicher Aufbau OpenGL Sprachlicher Aufbau Direct3D Utility Toolkits Schlussfolgerung 2 Inhalt • • • • • • • Einleitung Übersicht DirectX und Komponenten Übersicht OpenGL Sprachlicher Aufbau OpenGL Sprachlicher Aufbau Direct3D Utility Toolkits Schlussfolgerung 3 Einleitung • Vor etwa 20 Jahren: ersten Grafikkarten mit 3D-Unterstützung für den Heimbereich • Damals: Mangel an einheitlichen APIs • Heute: DirectX und OpenGL haben hohen Reifegrad sowie große Verbreitung erreicht 4 Inhalt • • • • • • • Einleitung Übersicht DirectX und Komponenten Übersicht OpenGL Sprachlicher Aufbau OpenGL Sprachlicher Aufbau Direct3D Utility Toolkits Schlussfolgerung 5 Übersicht: DirectX (1/5) • Warum? – Problem: protected memory model von Windows 95 ⇒ kein direkter Zugriff auf die Hardware – Lösung: Windows Games SDK (Heute: DirectX) – Windows musste für Spieleentwicklung attraktiv gemacht werden 6 Übersicht: DirectX (2/5) • Aktuelle Version: 9.0c • Plattformen: Windows und X-Box ⇒ Nur Microsoft 7 Übersicht: DirectX (3/5) • DirectX Graphics – Direct3D - 3D-Anwendungen und Spiele – D3DX utility library - Erleichtert Anw. • DirectInput - Eingabegeräte • DirectSound - Audio-Anwendungen • DirectMusic - Synthetische Musik (z.B. MIDI) 8 Übersicht: DirectX (4/5) • DirectDraw - bisher für die zweidimensionale Darstellung verwendet – Nicht mehr empfohlen – Zweidimensionale Darstellung wird nun von Direct3D sowie der D3DX utility library übernommen 9 Übersicht: DirectX (5/5) • DirectPlay - bisher zur NetzwerkKommunikation bei Online-Spielen benutzt – Nicht mehr empfohlen – Stattdessen: Benutzung von Windows Sockets sowie den Windows Firewall APIs • DirectShow - Audio- und Video-Streams – Von Verwendung in der Spieleentwicklung wird abgeraten 10 Inhalt • • • • • • • Einleitung Übersicht DirectX und Komponenten Übersicht OpenGL Sprachlicher Aufbau OpenGL Sprachlicher Aufbau Direct3D Utility Toolkits Schlussfolgerung 11 Übersicht: OpenGL (1/4) • • • • OpenGL = Open Graphics Library Software-Schnittstelle zur Grafik-Hardware Aktuelle Version: 2.0 Plattformen: – Microsoft Windows, Linux, MacOS-X und andere Unix-Derivate – aber auch: Playstation 3 von Sony OpenGL ES (Embedded Systems) 12 Übersicht: OpenGL (2/4) • Mehrere hundert Prozeduren und Funktionen • Erste Version: 1. Juli 1992 • OpenGL Architectural Review Board (ARB) ⇒ von SGI gegründet • Ursprung von OpenGL: IrisGL 13 Übersicht: OpenGL (3/4) • Reine Grafik-Schnittstelle – keine Unterstützung für Eingabegeräte und andere Ausgabegeräte • Ersatz für diesen Mangel (Beispiele): – Simple DirectMedia Layer (SDL) (www.libsdl.org) – Open Audio Library (OpenAL) (www.openal.org) 14 Übersicht: OpenGL (4/4) • OpenGL Extensions – Zusätzliche Funktionen – Eigenständige Erweiterungen ohne neue Version der API – Namensgebung strikt – OpenGL Architectural Review Board (ARB) 15 Inhalt • • • • • • • Einleitung Übersicht DirectX und Komponenten Übersicht OpenGL Sprachlicher Aufbau OpenGL Sprachlicher Aufbau Direct3D Utility Toolkits Schlussfolgerung 16 OpenGL • Prozedurale Sprache • Striktes Schema für Namensgebung – Befehle: Präfix gl – Konstanten und Typen: Präfix GL ⇒ Keine Konflikte mit anderen Bibliotheken ⇒ Transparenz für Entwickler 17 Diagramm OpenGL Pipeline Display List Evaluator Per-Vertex Operations Primitive Assembly Rasterization PerFragment Operations Framebuffer Texture Memory Pixel Operations 18 Anwendungsbeispiel OpenGL glColor3f(0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLE_STRIP); glColor3f(1.0, 0.0, 0.0); glVertex2f( 0.0, 0.75); glColor3f(0.0, 1.0, 0.0); glVertex2f(0.75, 0.75); glColor3f(0.0, 0.0, 1.0); glVertex2f( 0.75, 0.75); glEnd(); glFlush(); 19 Anwendungsbeispiel OpenGL glColor3f(0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLE_STRIP); glColor3f(1.0, 0.0, 0.0); glVertex2f( 0.0, 0.75); glColor3f(0.0, 1.0, 0.0); glVertex2f(0.75, 0.75); glColor3f(0.0, 0.0, 1.0); glVertex2f( 0.75, 0.75); glEnd(); glFlush(); 20 Anwendungsbeispiel OpenGL glColor3f(0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLE_STRIP); glColor3f(1.0, 0.0, 0.0); glVertex2f( 0.0, 0.75); glColor3f(0.0, 1.0, 0.0); glVertex2f(0.75, 0.75); glColor3f(0.0, 0.0, 1.0); glVertex2f( 0.75, 0.75); glEnd(); glFlush(); 21 Anwendungsbeispiel OpenGL glColor3f(0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLE_STRIP); glColor3f(1.0, 0.0, 0.0); glVertex2f( 0.0, 0.75); glColor3f(0.0, 1.0, 0.0); glVertex2f(0.75, 0.75); glColor3f(0.0, 0.0, 1.0); glVertex2f( 0.75, 0.75); glEnd(); glFlush(); 22 Inhalt • • • • • • • Einleitung Übersicht DirectX und Komponenten Übersicht OpenGL Sprachlicher Aufbau OpenGL Sprachlicher Aufbau Direct3D Utility Toolkits Schlussfolgerung 23 Direct3D • Befehle werden nicht direkt ausgeführt • Koordinaten der Eckpunkte (Vertices) werden im Vertex-Buffer gespeichert • Die meisten Berechnungen werden erst ausgeführt wenn sie explizit gefordert werden. 24 Direct3D • Funktionen, Macros, Strukturen, Konstanten und Enumerations haben das Präfix D3D • Interfaces: Präfix Idirect3D Gilt analog für andere DirectX-Komponenten 25 Diagramm Direct3D Pipeline Vertex Data Tessellation Primitive Data Vertex Processing Geometry Processing Pixel Processing Pixel Rendering Texture Sampler Textured Surface 26 Anwendungsbeispiel Direct3D 1. Vertex-Struktur 2. Flexible Vertex Format (FVF) struct CUSTOMVERTEX { FLOAT x, y, z, rhw; // Position der Vertex DWORD color; // Farbwert }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW| D3DFVF_DIFFUSE) 27 Anwendungsbeispiel Direct3D 3. Array mit den 3 Eckpunkten CUSTOMVERTEX Vertices[] = { // x, y, z, rhw, color, {150.0f, 50.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0),}, {250.0f, 250.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(0, 0,255),}, { 50.0f, 250.0f, 0.0f, 1.0f, D3DCOLOR_XRGB(0, 255, 0),}, }; 28 Anwendungsbeispiel Direct3D 4. Buffer erstellen, sperren, füllen und wieder entsperren g_pd3dDevice>CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL ); VOID* pVertices; g_pVB>Lock( 0, sizeof(Vertices), (void**)&pVertices, 0 ); memcpy( pVertices, Vertices, sizeof(Vertices) ); g_pVB>Unlock(); 29 Anwendungsbeispiel Direct3D 5. Hintergrund löschen (mit Schwarz) g_pd3dDevice>Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 ); 30 Anwendungsbeispiel Direct3D 6. BeginScene 7. StreamSource ⇐ Stream “0” 8. SetFVF (wurde vorhin erstellt) g_pd3dDevice>BeginScene(); g_pd3dDevice>SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) ); g_pd3dDevice>SetFVF( D3DFVF_CUSTOMVERTEX ); g_pd3dDevice>DrawPrimitive( D3DPT_TRIANGLELIST, 0,1 ); g_pd3dDevice>EndScene(); g_pd3dDevice>Present( NULL, NULL, NULL, NULL ); 31 Anwendungsbeispiel Direct3D 9. DrawPrimitive: Welche Form? 10. EndScene 11. Present: Ergebnis anzeigen g_pd3dDevice>BeginScene(); g_pd3dDevice>SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) ); g_pd3dDevice>SetFVF( D3DFVF_CUSTOMVERTEX ); g_pd3dDevice>DrawPrimitive( D3DPT_TRIANGLELIST, 0,1 ); g_pd3dDevice>EndScene(); g_pd3dDevice>Present( NULL, NULL, NULL, NULL ); 32 Inhalt • • • • • • • Einleitung Übersicht DirectX und Komponenten Übersicht OpenGL Sprachlicher Aufbau OpenGL Sprachlicher Aufbau Direct3D Utility Toolkits Schlussfolgerung 33 OpenGL Utility Toolkit (GLUT) int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutInitWindowPosition(100, 100); glutInitWindowSize(300, 300) glutCreateWindow("Fenstertitel"); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMouseFunc(mouse); glutMainLoop(); } 34 DirectX Utility Toolkit (DXUT) INT WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, INT) { DXUTSetCallbackDeviceCreated( OnCreateDevice ); DXUTSetCallbackDeviceReset( OnResetDevice ); DXUTSetCallbackDeviceLost( OnLostDevice ); DXUTSetCallbackDeviceDestroyed( OnDestroyDevice ); DXUTSetCallbackFrameRender( OnFrameRender ); DXUTSetCallbackFrameMove( OnFrameMove ); DXUTInit( TRUE, TRUE, TRUE ); DXUTCreateWindow( L"BasicHLSL" ); DXUTCreateDevice(D3DADAPTER_DEFAULT, TRUE, 640, 480); DXUTMainLoop(); return DXUTGetExitCode(); } 35 Inhalt • • • • • • • Einleitung Übersicht DirectX und Komponenten Übersicht OpenGL Sprachlicher Aufbau OpenGL Sprachlicher Aufbau Direct3D Utility Toolkits Schlussfolgerung 36 Schlussfolgerung • Vergleichbarer Funktionsumfang • Aber: starke Unterschiede in der sprachlichen Gestaltung • In Zukunft: weitere Abstraktion und Vereinfachung der APIs z.B. durch Shader-Sprachen 37 DirectX und OpenGL Proseminar Multimedia-Hardwareerweiterungen Michel Weimerskirch, 15. Februar 2006 Diskussionsfrage Microsoft hat mit seiner Windows-Plattform eine Monopol-Stellung auf dem PC-SpieleMarkt. Inwiefern beinflusst das die Entscheidung der Spiele-Entwickler ob sie nun DirectX oder OpenGL für ihre Projekte wählen sollen? 39